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

我有一个Windows 2003服务器运行有点慢,提交费用和页面文件的用法打勾,直到我最终重新启动。 为了解决这个问题,我需要找出消耗所有内存的东西,这就是大神秘的地方。

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

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

好吧,让我们拉起SysInternals Process Explorer并检查所有运行的工作集大小。 最大的罪魁祸首是一个使用121980K WS,481,284K VM大小的Tomcat实例。 那里没有任何内容接近解释5 GB的承诺。

下一步: SysInternals pslist : pslist -m ,按列分割输出并计算所报告的61个进程的列总和。

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

我从根本上误解了这些工具正在报告什么? 我一直认为,一个操作系统实际上会比一个进程映射的虚拟内存less得多的内存,假设它实际上不会使用那么多,而且在这里看VM是一只红鲱鱼。

JP,我相信你的意见,这是一个运行不到稳定的代码的自动化构build/unit testing服务器说这一切。 我的猜测是,这台服务器需要经常重新启动,因为它运行的代码不稳定,可能是内存泄漏,给你的症状,你看到的。 内存泄漏不会在正在运行的进程的任何进程树上列出,因为它们是被不再存在的进程抓取的内存,并且仍然被分配,即使与其关联的进程已经过去了。

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

我们在Windoze上安装Oracle应用服务器服务器,需要每天重新启动两次。 我们在午餐时间,每天半夜把用户踢出去。 那是几年前,据说Oracle的产品代码稳定。

对不起,只是粘贴一些链接 – 但我们一直在使用一些技术来查找内存泄漏,使用logparser和PowerShell,所以我会分享。

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

(永远不要怀疑你的debugging器网站是优秀的): 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

除了开放实际的微软案例,Performance Team网站还有很多很好的信息: http : //blogs.technet.com/askperf/Default.aspx?p=2

帮助诊断这个问题的工具是perfmon。 我会看的柜台(开始)是:

内存,承诺字节这是衡量虚拟内存的需求
进程,工作集,_总的虚拟内存在“主动”使用
分页文件,正在使用的%页面文件
内存,页数/秒(这不一定是低内存的一个指标,尽pipe每个人似乎都假设它是这样)
内存,页面输出/秒有多less虚拟内存页面被写入页面文件,每秒为其他目的释放RAM页面帧

内存,caching字节
内存,池非分页字节
内存,池分页字节
内存,系统代码总字节数
内存,系统驱动程序总字节数

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

内存,可用MBytes – 这测量有多lessRAM可用于满足虚拟内存的需求(新分配或从页面文件恢复页面)。

另见http://members.shaw.ca/bsanders/WindowsGeneralWeb/RAMVirtualMemoryPageFileEtc.htm

该服务器自上次重新启动以来运行了多久? Windows有内存泄漏是生活的一个不幸的事实。 即分配的内存并不总是被释放回系统。 症状正是你所看到的。 如果你还没有这样做,我build议每周至less重新启动一次。 许多数据中心每天都会重新启动Windows,因为这样做会大大减less支持呼叫。 当然,当你使用集群时,这样做更容易,因为没有停机时间。

据说有一个系统pipe理员可以真正理解Windows内存统计信息,但是我从来没有遇到过。

然而,find一个不合适的过程通常不是很难。 尝试使用Perfmon来查看各种进程计数器,如句柄或Page fault / sec。

JR

进一步的想法:你确定你实际上内存不足。 关键是你是否得到分页。 如果没有分页,你的内存不足。 使用PerfMon可以查看Memory – Pages / sec计数器。

请记住,工作集是实际由真实物理内存表示的内存位。 你也有你的虚拟内存的收费,而Windows代码页共享,一些MFC的块将被分享到许多进程中,而不会重复使用内存。 另外,你有Windows不间断的愿望,以尽可能保持文件系统caching(我已经看到它在一个2.5GB的笔记本电脑气球到800MB之前)。

Windows内存pipe理非常强大。 但是,一旦Windows开始分页,事情变得很难看,而且你总是不得不为文件系统caching留出空间 – 总是总是这样。 我通常不得不closures并重新启动Firefox时,我的80 +标签驱动器的内存消耗高达1.2GB / 1.2 + GB。

Windows也会在caching中的页面和作为内存/工作集列出的页面之间模糊一点。