我正在使用 Process Explorer 来监视我的 Windows 服务器,同时它会重建一些数据。它主要是一个 CPU 密集型进程,但我想确保它没有交换。如何判断它是否正在使用 Process Explorer?我最初的猜测是在 System Information 窗口中,它是 Paging File Write Delta。是的?不?我是个白痴?
*截图不是服务器的……只是一个例子。
替代文字 http://www.malwareinfo.org/bootcamp/img/ProcessExplorer2.jpg
“Pages Input / sec 是要观察的计数器,但您不必担心它会“交换”,因为 Windows 不像 *nixes 那样使用页面文件。
首先你需要了解windows页面是in not out的。我将引用Eric Lipperts 博客文章的相关部分(稍作编辑),因为我自己不能说得更好:
“RAM 可以仅仅被视为一种性能优化。访问 RAM 中的数据,其中信息存储在以接近光速传播的电场中,比访问磁盘上的数据要快得多,其中信息存储在巨大、沉重的黑色金属分子
操作系统会跟踪最常访问哪些进程的存储页面,并在 RAM 中制作它们的副本,以提高速度。当进程访问与当前未缓存在 RAM 中的页面对应的指针时,操作系统会发生“页面错误”,到磁盘中,并将页面从磁盘复制到 RAM,做出合理的假设很快就会再次访问它。
操作系统在共享只读资源方面也非常聪明。如果两个进程都从同一个 DLL 加载相同的代码页,那么操作系统可以在两个进程之间共享 RAM 缓存。由于代码可能不会被任何一个进程更改,因此通过共享来保存 RAM 的重复页面是完全明智的。
但即使有巧妙的共享,这个缓存系统最终还是会耗尽内存。发生这种情况时,操作系统会猜测哪些页面最不可能很快再次被访问,如果它们已经更改,则将它们写入磁盘,并释放 RAM 以读取更有可能再次访问的内容很快。
当操作系统猜测不正确,或者更有可能是没有足够的 RAM 来存储所有正在运行的进程中的所有频繁访问的页面时,机器就会开始“抖动”。操作系统将所有时间都花在写入和读取昂贵的磁盘存储上,磁盘不断运行,而您没有完成任何工作。
这也意味着“内存不足”很少会导致“内存不足”错误。它不会导致错误,而是会导致性能下降,因为存储实际上在磁盘上这一事实的全部成本突然变得相关。
另一种看待这个问题的方式是,您的程序消耗的虚拟内存总量与其性能实际上并没有太大关系。相关的不是消耗的虚拟内存总量,而是(1)有多少内存不与其他进程共享,(2)常用页面的“工作集”有多大,以及( 3)所有活动进程的工作集是否大于可用RAM。
现在应该清楚为什么“内存不足”错误通常与您拥有多少物理内存或可用存储量无关。它几乎总是与地址空间有关,在 32 位 Windows 上,地址空间相对较小且容易碎片化。"
补充几点:
有关 Windows 中内存管理如何工作的完整图片,请参见
Windows NT 中的虚拟内存管理器
如果您认为自己有内存问题,我首先建议您观看有关排除 Windows 内存问题的演示文稿
这是一个很好的解释,为什么有时你会因为内存碎片而不是“内存不足”:
另请参阅突破 Windows 的限制:物理内存
有关虚拟内存、内存碎片和泄漏以及 WOW64 的更多信息
RAM、虚拟内存、页面文件和所有这些东西(微软支持)
更新:
Windows 10 对内存做了一些不同的事情,随着时间的推移,你会看到一个名为“系统和压缩内存”的进程,Windows 10 在分页列表中添加了一个“压缩存储”。此 ram 是系统拥有的 USER 内存(通常系统只有内核内存)此内存被压缩到位,平均减少到 30% 左右。这允许将更多页面存储在内存中(对于那些进行数学计算的人来说,空间增加了 70%)请注意,如果内存仍然有压力,则可以将压缩存储(用户模式系统进程空间)中的页面放在修改后的列表(压缩),然后可以写入物理页面文件。系统将看到它们来自系统用户模式空间并被压缩,并且不会尝试将它们放回存储中。因此,在 Windows 10 系统上,它可能看起来系统正在吸入 ram,但实际上它只是试图更有效地使用 ram。自 2013 年以来,Mac 用户一直在使用类似的功能,并且较新版本的 Linux 内核采用了内存压缩版本。这种节省内存的方法不仅更好,而且在其他操作系统中已经很常见。
是的,分页增量会实时指示服务器分页(或“交换”)的数量,但仅限于那一刻。为了更仔细地观察这一点并查看历史视图,我建议使用性能监视器 ( perfmon.exe )来绘制或记录这些增量(以及任何其他感兴趣的性能计数器,这些计数器可能有助于将特定事件或活动与峰值相关联)寻呼活动)。
性能监视器(perfmon)是你的朋友。您正在寻找硬页面错误(即,必须从磁盘读取满足请求所需的内存页面时的页面错误),因此监控硬页面错误和软页面错误不是最佳选择。
使用 perfmon 观察“内存”对象中的“页面输入/秒”计数器,以了解发生了多少硬页面错误。
一个好的经验法则是,如果你的提交费用高于你的物理内存,你肯定是在分页,但如果你的应用程序使用一个始终保持在使用中的固定数据缓冲区,它通常不会被分页完全没有。启动时可能会有一些延迟,而其他内存被分页以为此腾出空间。