基于哪个Linux交换进程内存从RAM到交换文件的确切条件是什么?

我的服务器有8G的内存和8Gig的交换文件configuration。 我有内存密集型应用程序运行。 这些应用程序具有峰值负载,在此期间我们发现交换使用率增加 大约使用1 GIG交换。

我有另一台服务器,内存4Gigigs和8Gig的交换和类似的内存密集型应用程序运行。 但是这里的交换使用是非常可以忽略的。 大约100 MB。

我想知道什么是确切的条件或一个粗略的公式,基于哪个Linux将交换RAM中的进程内存交换文件。 我知道它基于交换因素。 还有什么是基于? 交换文件大小? 任何指向Linux内核文档/源代码的指针都会很好。

Linux内核的虚拟机子系统是一个非常复杂的野兽,内核使用启发式algorithm和algorithm来确定哪些页面交换/交换以及何时交换。 我不认为有一个简单的公式可以描述如何以及何时将页面放入磁盘。 也许这个LWN文章对你有用:

http://lwn.net/Articles/83588/

正如你可能知道的那样,linux内核使用尽可能多的内存来caching内容。 这就是为什么免费输出看起来像我几乎内存不足,根据第一线:

$ free -m total used free shared buffers cached Mem: 3168 2963 205 0 155 1263 -/+ buffers/cache: 1543 1624 Swap: 494 86 407 

但重要的部分是缓冲区和caching未使用的RAM数量

  -/+ buffers/cache: 1543 1624 

尽pipe如此,在这个例子中,除了高速caching之外,所有内存都只有205 MB。 正如我向他解释的那样(或者至less,据我了解),如果一个程序突然要求大于205 MB的内存,那么这个块就不能交换,所以这个进程可以拥有内存块,然后它就会出来一旦它有机会释放被caching使用的内存,就进行交换。

正如pfo提到的那样,潜在的机制是复杂的,远远超出我的理解。 我在一个他在LISA的课上向Ted Ts'o问了几乎这个相同的问题,我已经给了你基本上与他给我的相同的答案,或者至less据我了解。

顺便说一句,我怀疑swap中使用的内存在这个时候并没有被任何东西实际使用,但是它还没有被释放。

扩展pfo的答案,供应商也可以预先调整他们部署的内核来以某种方式处理swappiness。 在Red Hat系统上,你可以在/etc/sysctl.conf中configuration其中的大部分内容 – Google设置,比如:

 vm.swappiness vm.vfs_cache_pressure 

通过仔细调整系统的swappiness以适应您的应用程序的特定需求,您可能能够减less在该8GB机器上的交换使用量。 我在我的文件中有一个说明,说vm.swappiness“在内核2.6.xx默认使用交换内存设置为60%”,但没有保存我读的链接,所以把它与谷物盐。 🙂

在AWS的生产JBoss应用程序服务器上遇到这个问题。

我会比较sysctl – 两个系统。

1)对于服务器设置vm.swappiness接近0.这更喜欢保持在内存中的东西。

2)在所有服务器上启用一个小的交换文件,以便监视实际的内存负载。 (检查使用的交换%)。

3)使用Cacti或类似软件监控页面错误(nFLT)。

4)检查ulimits。

5)根据可测量的应用程序性能调整。