我有一个长时间运行的脚本,它在具有 8GB 内存的 Linux 机器上启动了几个子进程。运行几个小时后,它占用了近 90% 的内存,这使得其他服务(如 SSH)在开始磁盘交换时无响应。
以编程方式限制脚本和所有子进程的总体内存使用量的最佳方法是什么,而无需为每个进程单独设置特定的内存限制?不同的子进程可以使用非常不同的内存量,因此设置固定阈值会非常低效。
理想情况下,我只想指定“仅使用最多 75% 的内存”,并让系统根据需要将其分配给子进程,以确保我仍然可以随时通过 SSH 进入机器。我首先尝试设置一个 cron 作业来自动将 sshd 重新设置为最高优先级,但这没有效果,而且我经常无法通过 SSH 进入,或者 SSH 提示非常慢。
答案1
以专用用户身份运行进程并通过以下方式进行设置cgroups:
/etc/cgconfig.conf
:
group limitedram {
memory {
memory.limit_in_bytes = 6442450944;
}
}
和/etc/cgrules.conf
:
serviceuser memory limitedram/
这将内存使用量限制为serviceuser
6 GB。