【发布时间】:2013-01-07 18:02:07
【问题描述】:
我有一个 64 位 .NET 控制台应用程序,它基本上从 MSMQ 读取消息,然后通过 .NET SqlClient 与 SQL 服务器通信来处理它们。大多数时候它工作正常,但时不时地让自己进入一个状态,即使是最简单的操作,例如构建 SqlCommand 参数数组,都运行异常缓慢。在最坏的情况下,应用程序一次 30 分钟什么都不做(什么都没有写入日志,并且在详细模式打开时非常健谈),然后将再次开始写入,没有任何迹象表明导致延迟的原因。这严重影响了我们产品的可用性。
过去几个小时我一直在查看每一个性能计数器等,一切都表明页面读取过多 - 因此磁盘 I/O 已达到最大值,我可以看到我的进程不断从页面文件中大量读取.sys 等等,但我不知道为什么,因为应用程序的总内存使用量远低于可用 RAM:工作集为 60M,总提交大小为 300M(高,与峰值工作集匹配 - 不确定为什么会这样),但与可用的 12 Gig RAM 相比,这简直是小菜一碟。
我已经阅读了关于监控应用程序性能等的每一个 MS 文档,但所有内容都指向“我的应用程序需要更多内存”。好的......那么它如何给它更多的内存 - 没有其他东西在使用它!现在有一个单独的问题,考虑到应用程序的功能,它确实不应该需要那么多内存,但为了降低内存而付出的努力可能不值得更多硬件的成本。
还有一点需要注意:如果我启动同一个应用程序的第二个实例,它似乎运行良好。所以这显然不是系统范围的问题。
我在 stackoverflow 上看到了一些类似的帖子,但还没有特别有用的答案……希望比以前的海报更幸运。
【问题讨论】:
-
您是否尝试过在这些超慢期间分析程序并查看它花费最多时间的方法? Visual Studio 有一个非常好的分析器
-
系统中还发生了什么?您是否有其他 CPU 密集型进程正在进行? SQL Server 数据库在哪里运行?此控制台应用程序每分钟处理多少条消息?您的环境中可能有很多问题导致问题...使用 Visual Studio 调试器并在那些缓慢的时间附加到进程将是一个好的开始。代码是否足够小,您可以提供一些核心逻辑示例,例如 Pastie?
-
是的,我什么都试过了——它没有做任何它一直没有做的事情。系统上没有其他任何东西在使用任何 CPU 或内存。 Sql server 在别处。我想知道高页面错误是否必然相关,因为我只是查看了该进程的所有磁盘 i/o,它实际上对 MSMQ 存储区域进行了更多写入(以及为什么要写入- 这个过程甚至不生成消息,只删除它们?)而不是从 pagefile.sys 读取
-
队列的负载是多少?应用程序是否始终排在队列前面,或者是否有积压?
-
有一个巨大的积压 - 至少 50000 条消息。当它变得太大时,客户端被写入限制,但瓶颈不应该发生。这可能是相关的:support.microsoft.com/kb/897326,但它并没有真正解释为什么其他简单的非 MSMQ 相关操作开始运行如此缓慢,也没有解释为什么应用程序的第二个实例能够正常运行。
标签: .net performance memory paging