有没有办法以编程方式检测?
另外,检测哪些进程正在抖动的 linux 命令是什么?
我假设这里的“抖动”是指所有进程的活动内存集太大而无法放入内存的情况。在这种情况下,每次上下文切换都会导致读取和写入磁盘,最终服务器可能会变得如此颠簸,以至于硬件重新启动是重新获得对机器的控制权的唯一选择。
/proc/vmstat 中有全局计数器 swin 和 swout - 如果它们在某个较短的时间间隔内都增加,则该框可能会遇到抖动问题。
在流程级别,它是不平凡的 AFAIK。/proc/$pid/status 包含一些有用的东西,但没有 swin 和 swout。从 2.6.34 开始,有一个 VmSwap 条目,使用的交换总量,/proc/$pid/state 中的变量 #12 是主要页面错误的数量。/proc/$pid/oom_score 也值得研究。如果 VmSwap 正在增加和/或主要页面错误的数量正在增加和/或 oom_score 非常高,则该过程可能会导致抖动。
我编写了一个脚本 thrash-protect - 它可在https://github.com/tobixen/thrash-protect获得- 它试图找出导致抖动和临时挂起进程的进程。它对我来说效果很好,最终使我免于重新启动一些服务器。
更新:较新版本的内核在 /proc/pressure 下有有用的统计信息。此外,没有交换的计算机也将在内存变满时开始“抖动”,因为缺乏缓冲区空间往往会导致磁盘上的过多读取操作。