我们有一台 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