我的服务器有 8GB 的 RAM 和 8GB 的交换文件配置。我运行着内存密集型应用程序。这些应用程序的负载达到峰值时,我们发现交换使用量会增加。大约使用了 1GB 的交换空间。
我有另一台服务器,它有 4GB 的 RAM 和 8GB 的交换空间,上面运行着类似的内存密集型应用程序。但这里的交换空间使用量非常小。大约 100MB。
我想知道精确的条件或粗略公式Linux 将根据此将 RAM 中的进程内存交换到交换文件。我知道它基于交换因子。它还基于什么?交换文件大小?任何指向 Linux 内核内部文档/源代码的指针都可以解释这一点。
答案1
Linux 内核的 VM 子系统非常复杂,内核使用启发式方法和算法来确定哪些页面需要交换进/出以及何时进行交换。我认为没有一个简单的公式能够描述页面如何以及何时被放入磁盘。也许这篇 LWN 文章对你有用:
答案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)根据可测量的应用程序性能进行调整。