基于哪种Linux将内存从RAM交换到交换文件的具体条件是什么?

时间:2010-01-08 16:28:59

标签: linux linux-kernel swap virtual-memory swapfile

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

我还有另外一台服务器,内存有4Gig的RAM和8个交换机以及类似的内存密集型应用程序。但这里的交换使用率可以忽略不计。大约100 MB。

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

2 个答案:

答案 0 :(得分:8)

我见过很多人发布了这个主题的主观解释。希望这是一个更完整的答案。

在2.6.28后的拆分LRU中,Linux swappiness是一个乘数,用于任意修改计算的分数,确定两个LRU中建立的压力。

因此,例如在没有剩余可用内存的系统上 - 您所拥有的现有内存的值是根据列为“活动”的内存速率和页面升级的频率来衡量的落入非活动列表后激活。

在活动和非活动之间有许多促销/降级页面的LRU非常有用。

通常文件支持的存储更便宜,更安全,当你的内存耗尽并自动给出200的修饰符时(这使得文件支持的内存比交换支持的内存(其值为0)更无价值200倍)它会增加这一部分。

swappiness做的是通过将您给出的swappiness数量(默认为60)减去文件内存并将您提供的swappiness值作为乘数添加到anon内存来修改此值。因此,默认的swappiness使你的匿名内存比文件内存贵80倍(文件为200-60,anon为0 + 60)。因此,在一个已经耗尽其所有内存的典型Linux系统上,页面缓存必须比匿名内存更加活跃80倍,以便将匿名内存换出以支持页面缓存。

如果将swappiness设置为100,则将修改器设置为100,将文件内存设置为100(200 - 100)的修改器,使两个LRU均等加权。因此,在需要提供匿名内存的页面缓存的文件繁重的系统不如页面缓存那样活跃,然后将匿名内存交换到磁盘以为额外的页面缓存腾出空间。

答案 1 :(得分:5)

Linux(或任何其他操作系统)将内存划分为多个页面(通常为4Kb)。每个页面代表一块内存。维护这些页面的使用信息,其中基本上包含有关页面是空闲还是正在使用的信息(某些过程的一部分),最近是否已被访问,它包含哪种数据(过程数据,可执行代码等)。这些页面也可以大致分为两类 - 文件系统页面或页面缓存(读取/写入文件系统的所有数据都驻留在其中)和属于进程的页面。

当系统内存不足时,内核会根据其使用情况开始交换页面。使用按w.r.t排序的页面列表来确定哪些页面可以换出(Linux内核也有这样的列表)。

在交换期间,Linux内核需要决定在内存中对页面进行核对并将它们发送到交换时要进行权衡。如果它过于积极地交换文件系统页面,则需要从文件系统读取更多内容,以便在需要时读取这些页面。但是,如果它更积极地交换进程页面,则可能会损害交互性,因为当用户尝试使用换出的进程时,必须从磁盘读回它们。请参阅一个很好的讨论here

通过设置swappiness = 0,您告诉Linux内核不要换出属于进程的页面。当设置swappiness = 100时,您告诉内核更积极地交换属于进程的页面。要调整系统,请尝试按步骤10更改swappiness参数,使用“vmstat”命令监视每个设置的性能和正在交换的页面。保持设置,以获得最佳效果。请记住在高峰使用时间进行此测试。 :)

对于数据库应用程序,通常建议使用swappiness = 0。 (即便如此,在您的系统上测试不同的设置以达到良好的价值)。

参考文献:
http://www.linuxvox.com/2009/10/what-is-the-linux-kernel-parameter-vm-swappiness/
http://www.pythian.com/news/1913/