为什么Windows 2008在内存已满之前使用交换功能?


9

我管理一个运行IIS和.NET4 Web应用程序的Windows 2008服务器(在Amazon EC2上)。前几天,我收到了内存警报,然后走过去看了看,确定过程内存由于某种缓慢的泄漏而随着时间的推移而增长。它并没有增长太多,就像从60M增长到200M一样,但是在盒子上进行了足够多的处理,超过了我们的最低阈值(75%)来启动监视器。

我回收了该应用程序的池,并释放了内存,在查看统计信息时,我注意到交换空间正在大量使用,并且超过1 GB的回收空间得以释放。

也许这是一个基本的问题,但是我是UNIX专家,我习惯于交换直到您内存不足才习惯。此盒子的内存使用率从未超过75%。这是Windows事物还是.NET事物还是Amazon事物?我怀疑此应用程序中的内存泄漏比怀疑的要大得多-它不是从60M泄漏到200M,而是从60M泄漏到1.2GB,但是其中大部分以某种方式“变冷”并被推出以交换?

我在应用程序池上设置了内存回收,但是它会触发盒子的全部内存,因此在自动回收之前,此应用可能会变得非常大。

我可以设置定期的“定时”回收,但这是一种解决方法,我将让开发人员修复该应用程序,但需要了解交换使用情况,以确保我理解此权利。

编辑更多信息:实例内存:1.7 GB交换:4.5 GB

我在taskmgr中看到w3wp.exe进程,显示内存:211,000k。但是,当我重新启动它时(它在自己的应用程序池中,并且是包装盒中唯一的应用程序),它的内存使用量降至正常的起点60M,并且释放了1 GB +的交换空间。在taskmgr中,我只是设置了正常的“内存(私有工作集)”状态,但是通过我的其他监控(Cloudkick)看到了交换更改。现在回头看一下,进程中的内存已恢复到195M(共1.2 GB),而交换已从1.0 GB爬升至1.1 GB,并没有完全恢复到原来的位置(随着时间的推移,这是一个缓慢蠕变)。

我不太关心这个特定的应用程序,而更关心的是仅了解Windows交换的时间以及它的使用方式,以及通常需要考虑的Windows内存和交换使用情况。


4
顺便说一句,即使很长一段时间没有被访问,至少Linux 也会有机会交换掉这些页面,即使系统没有接近使用所有可用的RAM。它这样做是为了腾出磁盘缓存,缓存,内存等
EEAA

该实例有多少内存?您是说w3wp.exe进程达到1GB吗?这是该应用程序池中唯一运行的网站吗?
凯夫

@KevΩ根据您的要求在Q中添加了更多信息。
欧内斯特·穆勒

@ErikA,很高兴知道,我想我已经听过说“如果您要交换的话,您已经拥有了糟糕的性能,请完全关闭交换,并且不要用完RAM”的人,所以我不会看那么多交换。
欧内斯特·穆勒

如果您的磁盘在磁盘上跳动,那是真的。如果交换,则为缓冲区等空间。
巴特·

Answers:


17

Windows和linux有两种不同的页面/交换策略。

的Linux

Linux希望完全避免使用交换空间,并一直等到最后一刻。如果您在Linux中看到大量交换,则说明您的系统可能有麻烦或有麻烦。此策略有利于最大程度地减少总体磁盘I / O,这是系统中最慢的部分,但对于轻负载和重负载交替出现的系统而言,性能较弱(老实说,这就是我们大多数人)。现在,您的负载已经很沉重的时间将由“额外”磁盘I / O负担,或者换句话说,您需要设计服务器构建时要考虑到有足够的RAM,即使在安装过程中也不要交换最高预期加载时间。

视窗

Windows希望将内存仅作为页面文件的缓存。您的实际内存始终在磁盘上,但是如果可以的话,它将首先从“缓存”中进行读取/写入。此策略有助于平衡您的负担。当系统繁忙并需要交换页面时,当前页面已经在磁盘上,并且一半的工作已经完成。当Windows还很年轻时(32MB(忘记GB))仍然有很多RAM,并且经常需要使用交换空间时,这种方法非常有意义。即使在今天,这也适合于在轻负载和繁忙负载之间交替的工作负载,因为它有助于随着时间的推移更均匀地分配磁盘I / O。

现代Windows版本具有其他优化功能(例如SuperFetch),可以在其他情况下减轻负载时在磁盘和RAM上预加载和准备内存页面,从而避免首次加载程序时需要额外的磁盘写操作。所有这些意味着您可以将系统设计为只需要足够的RAM来完成小于最大预期负载的任务,因此始终可以始终保持可接受的性能,同时降低成本。

收敛

首先在测试环境中测量或预测负载,然后在负载已知时分配生产资源的这种概念是系统构建中的相对较新的发展,使得虚拟服务器和云服务器的出现成为可能,或者至少是切实可行的。 。根据您的负载,您甚至可以设计系统,使其根本不需要交换。在这些情况下,Windows确实允许您关闭分页并表现得更像linux系统。但是,您必须要小心。如果您的系统设计需要比预期更多的内存,则可能使您陷入困境。

另一方面,现代linux内核比以前更愿意机会性地交换到磁盘。因此,两个系统之间的内存管理策略仍然存在差异,但现在已经不像以前那么明显了。两种系统都有其优点,并且彼此监视以查看它们可以复制哪些进展。


Windows终端策略非常具体,谢谢!我还通过此Microsoft KB进行了验证,我发现... support.microsoft.com/kb/2267427
欧内斯特·穆勒

1
除非您明确设置vm.swappiness = 0,否则Linux不一定要等待最后一刻。默认值为60,它将交换一段时间内未触及的页面。
Kjetil Joergensen

@KjetilJoergensen确保您阅读了关于融合的最后一节。
乔尔·科尔

1
@JoelCoel我无条件撤回了我的批评:)
Kjetil Joergensen 2012年

7

Windows(以及Linux和其他类似Unix的操作系统)会将一段时间未使用的页面移到磁盘上,以便为缓冲区和缓存腾出空间以加快活动的I / O活动。此外,应用程序分配的内存通常比立即使用的要多-这可能会鼓励内核分页一些最近在后台未触及的内容,以使上述应用程序突然启动时看不到分页延迟使用该分配。

在Linux下,您可以通过更改/proc文件系统中的相关“ Swappiness”值来调整(或阻止)此行为-毫无疑问,您也可以调整注册表值来更改Windows在这方面的行为。

要注意的另一件事是,当某些内容已被调出并稍后读回时,内核将不会从页面文件中将其删除,除非该文件已满或RAM中的页面被更改。这样,如果需要再次分页该块,则可以这样做,而不必实际将页面写入磁盘:内容已经存在。在内存过量使用的情况非常糟糕以至于导致页面文件跳动(大量页面不断映射和输出)的情况​​下,这可以大大提高性能。您很可能会发现某些数据是由于该内存泄漏而推出的,并且此后已经将它们读回了磁盘,但并未从磁盘上擦除,以防需要映射这些页面或RAM以便稍后再腾出空间。在Linux下,“ SwapCached”值位于/proc/meminfo显示在RAM和磁盘上具有相同副本的页面中存在多少数据。Windows无疑会使用相同的优化(或类似的优化),但我不是确切地去看看它发生了多少(毫无疑问,您可以查询相关的性能监视器计数器)。

tl; dr:这很正常。现代的OS内核将尝试变得更聪明,并最大程度地利用它作为缓存来保存I / O操作的RAM数量,并且如果需要将这些位进行分页,有时会将数据复制到磁盘和RAM中以保存I / O。的RAM。很有可能(尽管可能很直观),即使您当前内存不足,以这两种方式使用页面文件仍会提高而不是降低整体性能。

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.