限制内存使用并最小化 Unix / Linux 上的交换抖动

限制内存使用并最小化 Unix / Linux 上的交换抖动

我有几台机器,用于运行大量作业,我试图限制作业数量,以免超出机器的可用 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并查找siso值,特别是每秒 2 到 4 位数字,没有零交换秒。

相关内容