我回收了应用程序的池并释放了内存,我注意到在查看统计信息时交换空间被大量使用,并且超过1 GB的内存被释放.
也许这是一个基本的问题,但我是一个UNIX人,我习惯交换不使用,直到你失去记忆.这个盒子从未超过75%的内存使用率.这是Windows的东西还是.NET的东西还是亚马逊的东西?我怀疑这个应用程序中存在比怀疑更大的内存泄漏 – 它没有从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内存和交换使用情况时应该关注什么.
Linux的
Linux希望完全避免使用交换空间,并等到最后一刻.如果你在linux中看到大量的交换,你的系统可能正在或遇到麻烦.这种策略有利于最大限度地减少整个磁盘I / O,这是系统中最慢的部分,但对于轻负载和重负载交替周期的系统来说较弱(老实说,我们大多数人都是这样).负载已经很重的时候现在会受到“额外”磁盘i / o的负担,或者换句话说,你需要设计你的服务器版本,以便有足够的ram,你甚至不会交换最高的预期加载时间.
视窗
Windows希望将内存视为页面文件的缓存.您的实际内存始终位于磁盘上,但如果可以,它将首先从“缓存”读取/写入.这种策略有助于随着时间的推移平衡负荷;当系统忙碌并需要交换页面时,当前页面已经在磁盘上,一半的工作已经完成.当Windows年轻时,这种方法很有意义,32MB(忘记GB)仍然有很多RAM,并且经常需要使用交换空间.即使在今天,这对于在轻载和忙载之间交替工作的负载也是有利的,因为它有助于随着时间的推移更均匀地分散磁盘i / o.
现代Windows版本具有额外的优化功能,例如SuperFetch,以便在负载较轻时预加载和准备磁盘和RAM中的内存页,以帮助避免在首次加载程序时需要额外的磁盘写入.所有这些意味着您可以设计您的系统,使其只需要足够的RAM来处理低于最高预期负载的内容,并且您仍然可以始终保持至少可接受的性能,同时降低成本.
收敛
首先测量或预测测试环境中的负载,然后在知道负载时分配生产资源的概念是系统构建中相对较新的发展,使得可能或至少是实际的,部分随着虚拟服务器和云服务器的出现.根据您的负载,您甚至可以设计系统,使其根本不需要交换.在这些情况下,Windows确实允许您关闭分页并且更像Linux系统,但是您必须要小心:如果您的系统设计需要的内存比您想象的多,那么您可以通过这种方式遇到麻烦.
另一方面,现代Linux内核比以前更愿意机会性地交换到磁盘.因此,两个系统之间的内存管理策略的差异现在不像以前那么明显,但仍然存在.两个系统都有其优点,每个系统都会看到另一个系统,看看它们可以复制哪些进展.