Linux 将进程内存从 RAM 交换到交换文件的具体条件是什么?

Linux 将进程内存从 RAM 交换到交换文件的具体条件是什么?

我的服务器有 8GB 的​​ RAM 和 8GB 的​​交换文件配置。我运行着内存密集型应用程序。这些应用程序的负载达到峰值时,我们发现交换使用量会增加。大约使用了 1GB 的交换空间。

我有另一台服务器,它有 4GB 的 RAM 和 8GB 的​​交换空间,上面运行着类似的内存密集型应用程序。但这里的交换空间使用量非常小。大约 100MB。

我想知道精确的条件或粗略公式Linux 将根据此将 RAM 中的进程内存交换到交换文件。我知道它基于交换因子。它还基于什么?交换文件大小?任何指向 Linux 内核内部文档/源代码的指针都可以解释这一点。

答案1

Linux 内核的 VM 子系统非常复杂,内核使用启发式方法和算法来确定哪些页面需要交换进/出以及何时进行交换。我认为没有一个简单的公式能够描述页面如何以及何时被放入磁盘。也许这篇 LWN 文章对你有用:

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

答案2

您可能知道,Linux 内核会使用尽可能多的内存来缓存内容。因此,根据第一行,free 的输出看起来像是“内存快用完了”:

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

但重要的是缓冲区和缓存未使用的 RAM 数量

 -/+ buffers/cache:       1543       1624

尽管如此,该示例中除了 205 MB 内存之外的所有内存都被使用,即使它是通过缓存使用的。正如向我解释的那样(或者至少是我的理解),如果某个程序突然请求超过 205 MB 的内存,那么该块将从交换中移出,以便该进程可以拥有该内存块,然后一旦它有机会释放被缓存使用的内存,它就会从交换中移出。

正如 pfo 提到的,底层机制非常复杂,远远超出了我的理解范围。我在 Ted Ts'o 在 LISA 教授的一堂课上问过他几乎相同的问题,我给你的答案基本上和他给我的一样,或者至少是我理解的一样。

顺便说一句,我怀疑交换中“使用”的内存此时实际上没有被任何东西使用,只是尚未释放。

答案3

扩展 pfo 的答案,供应商还可以预先调整其部署的内核,以某种方式处理 swappiness。在 Red Hat 系统上,您可以在 /etc/sysctl.conf 中配置大部分内容 - Google 搜索设置,例如:

vm.swappiness
vm.vfs_cache_pressure

通过仔细调整系统的交换功能以满足应用程序的特定需求,您可能能够减少 8GB 机器上的交换使用量。我的文件中有一条注释,其中提到 vm.swappiness “内核 2.6.xx 上的交换内存默认使用量设置为 60%”,但我没有保存阅读该注释的链接,因此请谨慎对待。:)

答案4

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

我会比较 sysctl -a 两个系统。

1) 对于服务器,将 vm.swappiness 设置为接近 0。这更倾向于将内容保存在内存中。

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

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

4)检查ulimits。

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

相关内容