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

标签 .net performance memory paging

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

在过去的几个小时里,我一直在查看每一个性能计数器等,一切都表明页面读取过多 - 由于这个原因,它在磁盘 I/O 上达到了最大值,我可以看到我的进程不断从 pagefile.sys 等中大量读取. 等等 但是我不知道为什么,因为应用程序的总内存使用量远低于可用 RAM:工作集是 60M,总提交大小是 300M(高,并且匹配峰值工作集 - 不知道为什么会这样),但与 12 Gig 可用 RAM 相比,这只是花生米,其中很少使用其他 RAM。

我已经通读了每个关于监控应用程序性能等的 MS 文档,但所有内容都指向“我的应用程序需要更多内存”。好的...那么它如何给它更多的内存 - 没有其他东西在使用它!现在有一个单独的问题,考虑到应用程序的功能,它无论如何都不应该需要那么多内存,但是为了减少内存而付出的努力可能不值得花费更多的硬件成本。

另一件事要注意:如果我启动同一个应用程序的第二个实例,它似乎运行良好。所以这显然不是系统范围的问题。

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

最佳答案

任务管理器中的页面错误意味着对磁盘上页面文件的命中,默认为您安装的 RAM 量的 1.5 倍。这不一定是坏事,它只是告诉您数据在哪里。可以关闭分页文件,看到这个数字保持在0。

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

关于.net - 为什么我的 .NET 应用程序会产生如此多的页面错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14493592/

相关文章:

c# - 在 win32 C++(非托管)应用程序中使用 C++\C# .Net 程序集\DLL

c# - Microsoft.Build.Tasks.v12.0.dll 上的 UniversalApp 错误 "GenerateResource task failed unexpectedly"

c# - 在构造函数中返回一个新对象或初始化成员?

ruby-on-rails - activerecord-sqlserver-adapter unicode 性能缓慢

.net - 为什么将 Int32 转换为 Float64 会导致数据更改?

.net - 在 Azure Pipelines 上构建 .NET Core 3.0

sql - 将 ORDER BY 添加到 SQL 查询会激增运行时

c - C 中以前的声明是否改变了指针的初始化方式?

c# - 更改进程的基址指针

python - (OpenCV 2.4.6) 将 Mat 的 roi header 复制到另一个 Mat 的 roi