如何在正在运行的进程列表之外解释Windows Server上的内存使用情况


9

我有一台运行缓慢的Windows 2003 Server,其中提交费用和页面文件使用率不断提高,直到最终重新启动为止。为了解决这个问题,我需要找出消耗所有内存的东西,这就是大谜团所在。

来自任务管理器的当前统计信息:

Physical Memory (K): 2096400
Commit Charge (K):   5364848
Page file usage:     5.11 GB

很好,让我们启动SysInternals Process Explorer并检查所有正在运行的东西的工作集大小。罪魁祸首是使用121,980K WS,481,284K VM大小的Tomcat实例。几乎没有什么可以解释5 GB的提交费用了。

下一步:Sysinternals的则PsListpslist -m,由列并计算列总和为所报告的61个处理分裂的输出。

SUM (Working Set)  : 681,484 K
SUM (Private Bytes): 593,424 K

我是否从根本上误解了所报告的工具?我一直给人的印象是,操作系统实际上会比进程映射的虚拟内存总量少得多的内存,前提是它实际上不会使用太多内存,并且在这里查看VM是红鲱鱼。


1
更新:是的,此系统正在分页,并且我经常收到“虚拟内存不足”警告。每当收到警告时,我都会检查内存统计信息,并且似乎没有任何异常行为,但是“内存,已提交字节数”统计信息始终超过5 GB。
jpdaigle,2009年

Answers:


1

JP,我相信您的评论,这是一台自动化的构建/单元测试服务器,其运行速度低于稳定的代码。我的猜测是,由于该服务器上运行的不稳定代码,该服务器需要经常重新启动,这可能会导致内存泄漏,从而使您看到自己的症状。内存泄漏不会在正在运行的进程的任何进程树上列出,因为它们是由不再存在的进程抢占并仍被分配的内存,即使与它们关联的进程早已消失。

获取频繁的维护窗口,以使您可以自动重启机器,可能是每晚,每周几次或每周一次,具体取决于此行为开始表现出性能问题的速度。

我们有一段时间在Windoze上安装了Oracle应用服务器服务器,每天需要重新启动两次。我们在午餐时间和每天的深夜将用户踢出去。那是几年前的事,据说该产品来自Oracle稳定的生产代码。


2

抱歉,仅粘贴了一些链接-但是我们一直在使用一些技术来查找内存泄漏,使用logparser和powershell,所以我会分享。

http://blogs.msdn.com/debuggingtoolbox/archive/2008/08/22/powershell-script-chart-and-statistics-from-top-20-objects-leaking.aspx

(“永不怀疑您的调试器”站点非常好):http : //blogs.msdn.com/carloc/archive/2007/09/14/something-you-need-to-know-before-start-debugging.aspx

我还将提供一个链接,链接到Mark Russinovich对Windows上的内存使用情况的出色见解:

http://blogs.technet.com/markrussinovich/search.aspx?q=memory&p=1

在没有打开实际的Microsoft案例的情况下,Performance Team网站也提供了很多很好的信息:http : //blogs.technet.com/askperf/Default.aspx?p=2


1

帮助诊断此问题的原理工具是perfmon。我首先要看的计数器是:

内存,已提交字节,这是对虚拟内存需求的度量,
进程,工作集,“活动”使用中的_Total虚拟内存使用
分页文件,正在使用的%pagefile
内存,页数/秒(这不一定表示内存不足) ,尽管每个人似乎都假设这样做)
内存,页面输出/秒每秒将多少个虚拟内存页面写入页面文件以释放RAM页面帧用于其他目的

内存,高速缓存字节
内存,池非分页字节
内存,池分页字节
内存,系统代码总字节
内存,系统驱动程序总字节

当总和接近2GB时,通常会由于32位架构而导致性能问题

内存,可用兆字节-用来衡量有多少RAM可以满足对虚拟内存(新分配,或从页面文件恢复页面)的需求。

另请参阅http://members.shaw.ca/bsanders/WindowsGeneralWeb/RAMVirtualMemoryPageFileEtc.htm


有趣的链接。在此服务器上,我看到的总进程工作集为640MB,但“内存,已提交的字节数”为5.4GB。您提到的其他计数器都不是很高。我经常收到“虚拟内存用完”警告,这就是我正在调查的原因。向OP添加评论。
jpdaigle,2009年

1

自上次重新引导以来,该服务器已运行了多长时间?Windows内存泄漏是生活中的不幸事实。即分配的内存并不总是释放回系统。这些症状正是您所看到的。如果您尚未这样做,建议每周至少重启一次。许多数据中心每天都会重新启动Windows,因为这样做可以大大减少支持电话。当然,在使用群集时,这样做很容易,因为没有停机时间。


0

据说那里确实有一个sysadmin,它真正了解Windows内存统计信息,但我从未见过。

但是,找到行为异常的过程通常并不难。尝试使用Perfmon查看各种处理计数器,例如句柄或Page Faults / sec。

JR

进一步的想法:您确定自己实际上内存不足。关键是您是否要传呼。如果没有分页,则说明内存不足。使用PerfMon可以查看“内存-页数/秒”计数器。


在运行的进程中,我看不到任何明显的东西。进程退出后,操作系统是否有可能不回收内存?这是一个自动构建/单元测试服务器,这样当然进程崩溃的时候,因为它始终运行出血边缘建立自动从SVN建。
jpdaigle,2009年

参见我的编辑内容,以获取进一步的想法
约翰·雷尼2009年

0

请记住,工作集是实际物理内存实际代表的内存位。您还需要承担虚拟内存的费用,并且Windows会执行代码页共享,因此将在许多进程之间共享一些MFC块,而不会重复使用内存。另外,您还有Windows一直希望保持文件系统高速缓存尽可能大的愿望(我之前看到它在2.5GB笔记本电脑上膨胀到800MB)。

Windows内存管理非常强大。但是,一旦Windows开始分页,事情就会变得很丑陋,您总是必须为文件系统缓存留出空间-始终总是。当我的80多个选项卡驱动器的内存消耗高达1.2gb / 1.2 + gb时,我通常必须关闭并重新启动Firefox。

Windows还会使缓存中的页面与列为内存/工作集的页面之间的界线有些模糊。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.