我们有一台 CentOS 7 服务器,尽管有超过 20GB 的可用内存,但每周仍会进入交换状态一次,并且交换量设置为 0。我们希望能够使用交换作为一种警报,提醒我们内存不足,而不必担心触发 OOM 杀手。
还有什么可能导致系统进入交换状态,除了交换之外我们还能做些什么来防止它交换?
答案1
交换并不表示内存不足。它表示内存页面正在被移动。
当出于各种目的(无论是碎片整理、空闲页面卸载还是其他类型的优化)移动内存区域时,最简单、最有效的方法是将其放入交换区,然后在实际需要时(或通常在需要之前)将其重新分配到主内存中。某些应用程序可能会强制执行此过程以在内部解决问题,例如极端内存碎片。无论您的交换设置如何,都会发生这种情况。
将 swappiness 设置为零只能确保在发生严重 OOM 事件时,所有内容都会一次性发送到 swap,而不是主动将空闲页面发送到 swap。Swap 通常无法快速写入以解决这个问题,然后 OOMkiller 就会开始向进程头部射击。它为此使用的逻辑有些激进,如果事情很忙,它可能会试图杀死 init。
因此,这不但不能提高性能,反而会使您的机器在内存耗尽时崩溃(即使几乎所有空闲页面都没有执行任何操作),无论您实际有多少交换空间。它还会增加内存碎片,在许多情况下降低性能和稳定性。
如果您不希望某台机器进行交换或页面切换,请不要在其上放置交换。在大多数情况下,这是一个坏主意,但对于无盘系统和某些虚拟化工作负载来说,这可能是合适的。
如果您想限制系统中的交换以潜在地降低应用程序延迟,请将 swappiness 设置为 10 左右。这适用于内存过剩的系统,例如您的系统。
如果您想知道您的机器是否内存不足,请对其进行一些实际监控。
答案2
仅因为您已分配交换并不意味着交换 IN/OUT 正在发生。请检查vmstat
是否正在发生交换。由于您已将 swappiness 设置为 0,因此很可能是空交换。
查看实用程序中输入/输出的si
值。so
vmstat