没有 swap 的小内存机器,OOM 为什么来得那么突然
没有 swap 的时候,内存回收没有缓冲带。一旦可回收的页缓存清完,分配就直接失败,内核只能选一个进程杀掉。这个过程可能只有几百毫秒。
所以 MemAvailable 那个数字不能当安全边际看。它包含了可回收的缓存,而缓存清空的速度取决于写入压力。有大量脏页在回写时,能回收的比显示的少得多。
更可靠的信号是 /proc/pressure/memory。some 的 total 持续上升,说明有任务已经在等内存,这时候离 OOM 就不远了,比看剩余量准。
实际做法是给关键进程设 systemd 的 MemoryHigh,让它自己先被限速,而不是等内核随机挑一个杀。再加上 PSI 监控,基本可以提前几分钟看到问题。