为什么交换功能不起作用?

为什么交换功能不起作用?

我们有一台 RHEL 7 机器,只有 2G 可用 RAM:

free -g
              total        used        free      shared  buff/cache   available
Mem:             31          28           0           0           1           2
Swap:            15           9           5

vm.swappiness = 100因此我们决定使用in/etc/sysctl.conf而不是 10将 swappiness 增加到最大值,并用于sysctl -p应用该设置。

一段时间后,我们再次检查状态:

 free -g
              total        used        free      shared  buff/cache   available
Mem:             31          28           0           0           2           2
Swap:            15           9           5

正如我们所看到的,尽管有新的 swappiness 设置,但free -g可用 RAM 仍保持在 2G。为什么?这里有什么问题吗?

我们预计会看到 15G用过的交换。

我们还检查了:

cat /proc/sys/vm/swappiness
100

所以一切都应该根据新设置工作,但free显示相同的情况。这是怎么回事?

答案1

swappiness设置正在按预期工作。增加swappiness不会导致系统比其他任何东西都更喜欢交换;增加swappiness会影响页面缓存和交换之间的平衡。当内核需要使物理内存可用时,它通常可以使用两种策略之一来丢弃:它可以从页面缓存中丢弃页面(因为它们的内容在磁盘上),或者可以将页面移动到交换区;swappiness决定了它对一种策略相对于另一种策略的偏爱程度。设置swappiness为 0(最小值)意味着内核将避免交换,直到达到各种高水位线,并从页面缓存中逐出页面;将其设置为 100(最大值 1)意味着内核将同等地考虑交换和逐出页面缓存。

仅当内核需要更多内存时,您才会看到新设置产生影响:在缓存中使用的内存量减少之前,您会看到交换使用量增加。

您不能使用swappiness让内核保持更多可用内存。物理内存总是最好的使用而不是空闲,因此内核没有动机抢先释放物理内存(增加可用内存)。

RHEL 7 性能调优指南了解更多信息。


¹ 在 RHEL 7 中;更新的内核允许高达 200 的值,这对于基于 RAM 的交换很有用。

答案2

解决方案是增加vm.watermark_scale_factor(很棒文章关于这个话题)

sudo sysctl -w vm.watermark_scale_factor=1000应该具有您正在寻找的效果:

当可用内存低于 10%(其中10 := watermark_scale_factor / 100)时,内核将被唤醒克斯瓦普德因此将把内存页面交换到交换区(或丢弃缓存页面,实际上取决于vm.swappiness) 直到可用内存达到 20%

有用的参考:https://www.kernel.org/doc/Documentation/sysctl/vm.txt

相关内容