为什么我的.NET应用程序会产生如此多的页面错误?

时间:2013-01-24 03:45:06

标签: .net performance memory paging

我有一个64位的.NET控制台应用程序,基本上从MSMQ读取消息,然后通过.NET SqlClient与SQL服务器通信来处理它们。大多数时候它工作正常,但是时不时地进入一种状态,即使是最简单的操作,例如构建SqlCommand参数数组,运行异常缓慢。在最糟糕的情况下,应用程序一次完成30分钟没有任何操作(没有写入日志,并且在详细模式开启时非常繁琐),然后将再次开始写入,没有指示导致延迟的原因。这严重影响了我们产品的可用性。

我花了最后几个小时查看每个单独的性能计数器等等,而且所有内容都指向过多的页面读取 - 由于这一点,它在磁盘I / O上最大化,我可以看到我的进程不断地从页面文件中大量读取.sys等等。但我不明白为什么,因为应用程序的总内存使用量远低于可用的RAM:工作集是60M,总提交大小是300M(高,并匹配峰值工作集 - 不确定为什么会这样),但这是花生与可用的12千兆RAM相比,其中很少使用。

我已阅读每篇关于监控应用程序性能等的MS文档,但所有内容都指向“我的应用程序需要更多内存”。好的...那么它如何给它带来更多的记忆 - 没有别的东西在使用它!现在有一个单独的问题,考虑到应用程序的功能,它实际上不需要那么多的内存,但是为了降低内存所需的努力可能不值得花费更多的硬件。

还有一点需要注意:如果我启动同一个应用程序的第二个实例,它似乎运行正常。所以这显然不是系统范围内的问题。

我在stackoverflow上看过一些类似的帖子,但还没有特别有用的答案......希望比以前的海报更幸运。

2 个答案:

答案 0 :(得分:0)

任务管理器中的页面错误意味着磁盘上页面文件的命中率,默认为已安装的RAM量的1.5倍。它不一定是坏的,它只是告诉你数据的位置。您可以关闭分页文件以查看此号码保持为0。

您是否查看过您所依赖产品的性能和计数器,例如SQL Server或MSMQ?你试过memtest86来测试你的ram吗?

答案 1 :(得分:0)

我遇到了同样的问题。根据我的经验,你有强烈的“永远在线”的应用;它们应该放在Windows服务而不是控制台应用程序中。

据说这可能是垃圾收集问题。

将此添加到您的配置文件中:

<runtime>
  <gcServer enabled="True"/>
</runtime>

您需要将其放在配置节点下。

根据我的经验,这将导致应用程序拥有更少的PageFaults和更大的工作集。

没有银弹。如果没有代码,就无法知道代码是否泄漏了内存;这可能是过度分页的另一个原因。