我的 Windows 2003 Server 运行速度有点慢,提交费用和页面文件使用率不断上升,直到我最终重新启动。要解决这个问题,我需要找出消耗所有内存的原因,这就是最大的谜团所在。
任务管理器的当前统计数据:
Physical Memory (K): 2096400
Commit Charge (K): 5364848
Page file usage: 5.11 GB
好吧,那我们停下来SysInternals 进程浏览器并检查所有正在运行的程序的工作集大小。最大的罪魁祸首是一个使用 121,980K WS、481,284K VM 大小的 Tomcat 实例。其中没有任何内容可以解释 5 GB 的提交费用。
下一步:SysInternals pslist:pslist -m
,按列拆分输出并计算报告的 61 个流程的列总和。
SUM (Working Set) : 681,484 K
SUM (Private Bytes): 593,424 K
我是否从根本上误解了工具所报告的内容?我一直认为,操作系统实际上会占用比进程映射的虚拟内存总量少得多的内存,前提是它实际上不会使用那么多内存,而在这里查看虚拟机只是一种转移注意力的借口。
答案1
JP,我认为您的评论说明了一切,即这是一个运行不稳定代码的自动构建/单元测试服务器。我猜想这台服务器需要频繁重启,因为运行不稳定代码的服务器可能存在内存泄漏,从而导致您看到上述症状。内存泄漏不会列在任何正在运行的进程的进程树上,因为它们是不再存在的进程所占用的内存,并且仍然被分配,即使与它们关联的进程早已消失。
获得一个频繁的维护窗口,以便您可以自动重新启动这台机器,可能是每晚,每周几次或每周,具体取决于此行为开始出现性能问题的速度。
不久前,我们在 Windows 上安装了 Oracle 应用服务器,每天需要重启两次。我们每天在午餐时间和半夜将用户踢出。那是几年前的事了,当时 Oracle 的产品代码据称比较稳定。
答案2
抱歉,只是粘贴一些链接 - 但是我们一直在使用一些技术来查找内存泄漏,使用 logparser 和 powershell,所以我会分享。
(Never Doubt Thy Debugger 网站非常棒): 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 案例外,性能团队网站也有很多有用的信息: http://blogs.technet.com/askperf/Default.aspx?p=2
答案3
帮助诊断此问题的主要工具是 perfmon。我首先要查看的计数器是:
内存,已提交字节,这是对虚拟内存需求的度量
;进程,工作集,处于“活动”使用状态的总虚拟内存
;页面文件,正在使用的页面文件百分比
;内存,页面/秒(这并不一定是内存不足的指标,尽管似乎每个人都认为是这样);
内存,页面输出/秒,每秒有多少虚拟内存页面被写入页面文件以释放 RAM 页面帧用于其他用途
内存,缓存字节数
内存,池非分页字节数
内存,池分页字节数
内存,系统代码总字节数
内存,系统驱动程序总字节数
当这个总数接近 2GB 时,您就会遇到性能问题,通常是由于 32 位架构造成的
内存,可用兆字节 - 这衡量了有多少 RAM 可用于满足虚拟内存的需求(新分配,或从页面文件恢复页面)。
也可以看看http://members.shaw.ca/bsanders/WindowsGeneralWeb/RAMVirtualMemoryPageFileEtc.htm
答案4
据说某个地方有一位系统管理员真正了解 Windows 内存统计信息,但我从未见过他们。
但是,找到行为不当的进程通常并不难。尝试使用 Perfmon 查看各种进程计数器,如句柄或页面错误/秒。
JR
进一步思考:你确定你的内存真的不够吗?关键是你是否正在分页。如果没有分页,则说明你的内存不短缺。使用 PerfMon 查看内存 - 页数/秒计数器。