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