none
IIS是否会定期回收web应用所占内存? RRS feed

  • 问题

  • 大家好,我们公司项目是基于asp.net做的,是一个数据库密集型操作,频繁跟数据库打交道,就跟火车票订票系统一样,

    由于频繁跟数据库打交道会影响整个服务器性能,用户提交数据也很慢,体验差,所以我们就用以下方式解决:

    所有的数据在内存中存放(没有使用第三方缓存框架),直接用static标志的静态变量作为内存缓存,所有并发的请求都直接操作内存中的这个staic的缓存(有线程锁保护),然后新开启一个线程,定时(10分钟)将这个static的缓存同步到数据库(也有线程锁保护),没错,这样确实性能提高了不少,但又有新的问题:

    数据经常丢失!!!!
    也就是说,用户提交到内存的数据库,经常并没有定期保存到数据库,我猜测的可能原因如下:

    1.定期保存的线程出现故障导致程序中断,应用奔溃,我们也做过异常捕获和记录异常日志,似乎并没有发生这样的现象,
    2.IIS的线程池占用内存太大而自动回收内存,导致IIS将程序池强行重启,导致web应用重新启动,所有内存数据丢失,

    不知道还有其他的什么原因??
    那么如何防止IIS自动回收内存?诸如这样的static的静态变量缓存难道就这么不可靠吗?

    我该怎么办?
    程序很简单,所以我们也没考虑用其他缓存框架,
    2016年5月9日 8:45

答案

  • 

    IIS有一些关于Recycling的设置:

    你的系统和火车票订票系统类似的话,数据基本是最高优先级的,把数据放在内存,而且是IIS的内存(其进程管理不由开发者控制)中是不妥当的。

    我觉得要找出性能的瓶颈,然后再 想办法解决。

    可以考虑把数据库放到单独的Server上,优化数据库读写部分等等。

    2016年5月10日 2:27

全部回复

  • 性能问题,我推荐用ANTS Performance Profiler 8 检测一下,看看是哪里的程序最耗费CPU和内存。

    找到关键的那几行,把性能优化一下(缓存,队列等方法),还有一个小技巧,如果几个业务不相互冲突,可考虑把几个业务放入队列中,再批次向数据库提交数据处理,避免每次都向数据库发送数据操作。


    专注于.NET MIS开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年5月9日 9:45
  • 

    IIS有一些关于Recycling的设置:

    你的系统和火车票订票系统类似的话,数据基本是最高优先级的,把数据放在内存,而且是IIS的内存(其进程管理不由开发者控制)中是不妥当的。

    我觉得要找出性能的瓶颈,然后再 想办法解决。

    可以考虑把数据库放到单独的Server上,优化数据库读写部分等等。

    2016年5月10日 2:27