最近我们的服务器经常挂掉。我怀疑是内存泄漏,但仍然找不到任何可疑之处。事件日志记录了这样的情况:
- <SystemInfo>
<SystemCommitLimit>49195651072</SystemCommitLimit>
<SystemCommitCharge>49195651072</SystemCommitCharge>
<ProcessCommitCharge>3172712448</ProcessCommitCharge>
<PagedPoolUsage>432541696</PagedPoolUsage>
<PhysicalMemorySize>16983396352</PhysicalMemorySize>
<PhysicalMemoryUsage>16197967872</PhysicalMemoryUsage>
<NonPagedPoolUsage>183476224</NonPagedPoolUsage>
<Processes>139</Processes>
</SystemInfo>
- <ProcessInfo>
如您所见,SystemCommitCharge 达到了 SystemCommitLimit (~45GB),但 ProcessCommitCharge 仅为 3GB。
我甚至检查了当时使用内存最多的 3 个进程,但它们加起来只使用了大约 1GB。还有大约 100 个进程,但每个进程最多使用 50MB。
Windows 成功诊断出虚拟内存不足的情况。以下程序消耗的虚拟内存最多:sqlservr.exe (4480) 消耗 565637120 字节,mysqld.exe (4500) 消耗 362201088 字节,java.exe (1628) 消耗 314191872 字节。
一切似乎都表明,除了我的进程之外,还有其他东西占用了资源。
我注意到的另一件事是,目前(系统重启后)我们的已分配内存和缓存与正常内存使用量相比增加了很多。但是,当我使用 Rammap 仔细检查时,我发现大多数内存处于待机状态,这意味着它不会影响系统性能。此外,非分页内存现在只有 133MB,所以问题不应该出在驱动程序上。我一无所知。
仔细检查我们的服务器三天,我发现使用的内存在一点一点增加,从:
(8 月 30 日)
使用中 = 3.4 GB 已提交 = 5.3 GB 缓存 = 2.2 GB 分页池 = 225 MB 非分页池 = 76.2 MB
(01/09)
使用中 = 3.9 GB 已提交 = 23.9 GB 缓存 = 11.9 GB 分页池 = 335 MB 非分页池 = 133 MB
有没有办法检测出这个起作用的“神秘因素”?
答案1
您可以使用 Poolmon 检查内存泄漏......
它是 Windows 驱动程序工具包 (WDK) 的一部分。
来自 Microsoft 的一些有用链接:
http://msdn.microsoft.com/en-us/library/ff545405(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/ff550458.aspx
http://msdn.microsoft.com/en-us/library/ff550442(VS.85).aspx