5

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

我有另一台服务器,它具有 4G 的 RAM 和 8G 的交换空间,以及在其上运行的类似内存密集型应用程序。但是这里的交换使用是非常微不足道的。大约 100 MB。

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

4

2 回答 2

8

我已经看到很多人发布了对此的主观解释。希望这是一个更完整的答案。

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

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

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

通常,当您的内存不足时,文件支持的存储更便宜且更安全,并且自动获得 200 的修饰符(这使得文件支持的内存比交换支持的内存(值为 0)的价值低 200 倍)当它相乘时分数。

swappiness 所做的是通过将您给定的swappiness 数(默认为60)减去文件内存并将您作为乘数添加到匿名内存中的swappiness 值来修改此值。因此,默认的 swappiness 使匿名内存比文件内存有价值 80 倍(文件为 200-60,匿名为 0+60)。因此,在一个已经用完所有内存的典型 linux 系统上,页面缓存必须比匿名内存活跃 80 倍,才能将匿名内存换出以支持页面缓存。

如果将 swappiness 设置为 100,这将给 anon 一个 100 的修饰符,给文件内存一个 100 (200 - 100) 的修饰符,使两个 LRU 的权重相等。因此,在需要页面缓存的文件繁重的系统上,如果匿名内存不如页面缓存那么活跃,那么匿名内存将被交换到磁盘以为额外的页面缓存腾出空间。

于 2011-03-19T22:38:27.660 回答
5

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

当系统内存不足时,内核会根据页面的使用情况开始换出页面。使用按最近访问时间排序的页面列表通常用于确定可以换出哪些页面(Linux内核也有这样的列表)。

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

通过设置 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/

于 2010-01-08T17:23:38.073 回答