我pipe理运行IIS和.NET4 Web应用程序的Windows 2008服务器(以及Amazon EC2)。 我有一天记得有一个内存警报,然后去看了看,果然这个进程内存已经随着时间的推移慢慢地泄漏了。 它没有增长太多,就像60M到200M一样,但是盒子里的其他东西已经超过了我们相当低的门槛(75%)来启动显示器。
我回收了应用程序的池并释放了内存,我注意到在回顾统计数据时,交换空间被大量使用,超过1 GB的空间被释放。
也许这是一个基本的问题,但我是一个UNIX的家伙,我习惯交换不使用,直到你内存不足。 这个盒子从来没有超过75%的内存使用量。 这是一个Windows的东西或.NET的东西或亚马逊的东西? 我怀疑这个应用程序的内存泄漏要比怀疑的要大得多 – 它从60M到200M没有泄漏,从60M泄漏到1.2GB,但其中大部分会“冷”,被推出来交换?
我在应用程序池上设置了内存回收function,但是会触发内存全部内存,所以这个应用程序在自动回收之前可能会变得非常大。
我可以设置定期的“定时”回收,但这是一个解决方法,我会让开发人员修复应用程序,但需要了解这里的交换使用情况,以确保我理解这个权利。
编辑更多信息:实例内存:1.7 GB交换:4.5 GB
我看到taskmgr中的w3wp.exe进程显示内存:211,000k。 但是,当我重新启动它(它在它自己的应用程序池中,并且它是盒子上唯一的应用程序)时,它的内存使用率降低到了正常的60M的起点,并且1 GB +的交换也被释放了。 在taskmgr中,我只有普通的内存(Private Working Set)属性,但通过我的其他监视(Cloudkick)看到交换更改。 回头看今天,内存在这个过程中备份了高达195M(总共1.2GB),交换已经从1.0GB升级到了1.1GB,并不是所有的方式都回到了原来的位置(随着时间的推移,这是一个慢蠕)。
我不太关心这个特定的应用程序,更关心的只是了解什么时候Windows交换以及如何使用它,以及关于给定Windows内存和交换使用的一般问题。
Windows和Linux有两种不同的页面/交换策略。
Linux想要避免使用交换空间,并等待最后一刻。 如果您在Linux中看到大量的交换,您的系统可能正在或遇到麻烦。 这个策略有利于最小化整个磁盘I / O,这是系统中速度最慢的部分,但对于交替周期轻重负载的系统(老实说,这是我们中的大多数人),I / O较弱。 当你的负载已经很重的时候,现在会被“额外的”磁盘I / O所负担,或者换句话说,你需要devise你的服务器版本,以便拥有足够的内存,即使在预期的最高加载时间。
Windows希望将内存视为页面文件的caching。 您的真实内存始终在磁盘上,但是如果可以的话,它将首先从“caching”读取/写入。 这个策略对于随着时间的推移而减轻负担是很好的。 当系统忙碌并需要交换页面时,当前页面已经在磁盘上,一半工作已经完成。 这个方法在Windows很年轻的时候有很大的意义,32MB(忘记GB)仍然是很多内存,并且经常需要使用交换空间。 即使在今天,这也适用于轻载和繁忙负载之间交替的工作负载,因为它有助于随着时间的推移更均匀地分配磁盘I / O。
现代Windows版本有额外的优化,例如SuperFetch预加载,并且当负载很轻时,在磁盘和RAM中准备内存页面,以帮助避免在第一次加载程序时需要额外的磁盘写入。 所有这些意味着您可以devise您的系统,使其只需要足够的内存来处理低于最高预期负载的数据,并且始终可以获得至less可接受的性能,同时降低成本。
首先测量或预测testing环境中的负载,然后在负载已知时分配生产资源的这一概念是系统构build中的相对最近的发展,使得可能或至less实际可行,部分是随着虚拟和随后的云服务器。 根据你的负载,你甚至可以devise系统,使它永远不需要交换。 在这些情况下,Windows确实允许closures分页,并且更像Linux系统,但是你必须小心:如果你的系统devise需要更多的内存,那么你可能会以这种方式陷入麻烦。
另一方面,现代Linux内核更愿意以前所未有的机会交换磁盘。 所以两个系统之间的内存pipe理策略的差异现在已经不像以前那么明显了,但是依然存在。 两个系统都有其优点,每个系统都会监视另一个系统以查看可以复制哪些进展。
Windows(以及Linux和其他类似Unix的操作系统)会将尚未使用一段时间的页面移动到磁盘,为缓冲区和caching腾出空间来加速活动的I / O活动。 而且,应用程序通常会分配比即将使用的内存更多的内存 – 这可能会鼓励内核对最近未触及的某些内容进行分页,以使所述应用程序突然启动时看不到分页延迟使用该分配。
在Linux下,你可以通过改变/proc文件系统中相关的“swappiness”值来调整(或阻止)这种行为 – 毫无疑问,你可以调整registry值来改变Windows在这方面的performance。
另一件需要注意的事情是,当某些东西被分页出来后再读回时,内核不会将其从页面文件中移除,直到文件被占满或RAM中的页面被改变。 这样,如果需要再次将该页面分页出去,则不需要实际将页面写入磁盘:内容已经存在。 这可以极大地提高内存过度提交导致页面文件抖动(大量页面不断被映射进出)的情况下的性能。 您可能会发现某些数据被内存泄漏推出,并且之后被读回但未从磁盘擦除,以防以后需要将这些页面映射到RAM或RAM中以腾出空间。 在Linux下, /proc/meminfo中的“SwapCached”值显示在RAM和磁盘上具有相同副本的页面中存在多less数据。 Windows毫无疑问使用相同的优化(或类似的),但我不是在哪里看看这是多less发生(毫无疑问,有相关的性能监视器计数器,你可以查询)。
tl; dr:这是正常的。 一个现代的操作系统内核将尝试聪明,并最大限度地利用多less内存作为caching来保存I / O操作,有时会有数据复制到磁盘和内存中,以保存I / O如果需要将这些位之后的RAM。 机会是,直截了当的,因为它可能是这样的,即使你目前没有低的内存,这两种方式使用页面文件正在改善你的整体性能,而不是减less它。