我有几台机器,用于运行大量作业,我试图限制作业数量,以免超出机器的可用 RAM。有时我会错误估计某些作业将占用多少内存,然后机器开始破坏交换文件。我通过将 发送给其中一个kill -s STOP
作业来解决这个问题,以便可以将其交换出去。
是否有人知道一个实用程序,它可以监视服务器上特定名称的进程,然后在总内存消耗达到所需阈值时暂停内存占用最小的进程,以便较大的进程可以运行并以最少的交换文件抖动完成?一旦某些现有进程完成,就需要恢复暂停的进程。
答案1
看一下捶打保护(用 Python 编写的守护进程)
- 它并不能完全按照您的要求执行,但是它可以识别整个服务器中的交换抖动行为,然后尝试识别导致这种情况的进程,并向其发送 STOP 信号以冻结它们。
- 然后它会发送一个 CONT 信号来解冻它们。
如果您不想按原样使用它,它可以作为暂停具有最小内存占用的进程的自定义脚本的基础。
手工完成
对于那些不喜欢自动化工具的人,你可以使用htop
来查找内存使用率最高的进程,并用 向它们发送 STOP 信号kill -s STOP <pid>
。然后你可以发送kill -s CONT <pid>
来恢复它们。但是,当服务器不稳定时,你可能需要等待很长时间才能执行 htop 和 kill。
问题
当机器由于内存压力而出现故障时,尽管 CPU 利用率很低,但通常还是会看到吞吐量很差。
诊断方法如下:
- 运行一个简单的shell命令是否需要几十秒甚至几分钟的时间?
- 在
top
或中htop
,交换使用率是否较高、平均负载是否较高且 CPU 使用率较低? - 是否有较高的交换率?运行
vmstat 1
并查找si
和so
值,特别是每秒 2 到 4 位数字,没有零交换秒。