不久前我发现了一个非常有趣的工具拉姆地图我发现在运行我们的 x32 软件的几台服务器上,PAGE TABLE 增长非常快 – 每天 1.2 GB(总共 10 GB)。此外,NONPAGED POOL 每天增长 300MB。
- 有人能解释一下这种情况的常见原因吗?
- 如何从代码中获取页表的大小(例如 API 函数或 WMI 类)?
- 可以减少、清除或...释放 RAM 吗?
我们有一个编程和执行平台,称为 1C(俄罗斯商业导向平台)。一个进程就像是其他进程的管理器,它们按计划启动,并按规则终止,并执行不同类型的数据处理,包括使用 COM 与其他数据库交换。换句话说,我无法知道平台级别发生了什么(对我们来说是隐藏的)。平台开发人员的支持并不快(=)——他们仍然没有回答我们关于这个问题的问题。
我们有不同的操作系统配置(2003 和 2008 Server,x32 和 x64)。页表随处可见。增长速度与同时运行的进程数成正比(主服务器上为 30-40)。当页表达到 RAM 的 50-70% 时,服务器开始以不同的方式出现故障。
答案1
看起来像是虚拟内存碎片问题;内存被连续分配和释放,并且每次都会创建新的页表条目 (PTE) 以跟踪内存页面;您断言正在创建和终止大量进程,并且此页表的增加与正在运行的进程数成正比,这确实指向了这一点。此外,PTE 通常保存在非分页内存中(它们对内存管理器至关重要,因此应始终驻留在内存中);这也解释了非分页池使用率的增加。
关于此内容的一些链接:
http://www.dabcc.com/article.aspx?id=10571
https://learn.microsoft.com/en-us/archive/blogs/david.wang/more-on-virtual-memory-memory-fragmentation-and-leaks-and-wow64
这些也非常有助于理解可能发生的事情:
http://blogs.technet.com/b/markrussinovich/archive/2008/07/21/3092070.aspx
http://blogs.technet.com/b/markrussinovich/archive/2008/11/17/3155406.aspx
http://blogs.technet.com/b/markrussinovich/archive/2009/03/26/3211216.aspx
不幸的是,你对此无能为力;此页面是特定于 Exchange 的,但也许它可以为你提供一些提示:
http://support.microsoft.com/kb/325044
这是一种任何应用程序重启都无法解决的问题;只有完全重启服务器才能清除虚拟内存碎片。
使用 x64 系统可以提供帮助,因为虚拟地址空间是相当更大;但它不会解决碎片问题,因此也不会解决增加的 PTE 使用率问题。