我遇到过非常不幸的情况,一个包含细微错误的 bash 脚本变得疯狂并占用了所有可用内存,然后开始终止其他任务(生产应用程序!)以获取更多内存。
我如何才能对该脚本和其他脚本的调用进行未来验证,以便当它们达到内存限制时,它们会自动终止其他应用程序?
我更希望能够将一些内容融入到剧本文本中。
答案1
ulimit -m
将允许您设置适用于某个进程的核心(嗯,RSS)限制,并ulimit -v
允许您对 VM 占用空间执行同样的操作。
答案2
在 Linux 上, https://www.kernel.org/doc/Documentation/sysctl/vm.txt 记录虚拟内存系统的各种可调参数。
例如,vm.oom_kill_allocating_task=1
如果将其设置为非零,OOM 终止程序将直接终止触发内存不足情况的任务。这样可以避免昂贵的任务列表扫描。
无法保证您的生产应用程序不会触发 OOM。但失控的分配更有可能触发 OOM。
您还可以调整一个分数,以衡量特定进程因内存不足而被杀死的可能性。/proc/$PID/oom_adj。不过,您可能希望在 init 脚本中设置它。 systemd.exec 有 OOMScoreAdjust。
您可以完全禁用 OOM 杀手。但是,在极端内存压力下,系统可能无法响应或崩溃。
答案3
您可以使用supervisord来管理进程。Supervisor可以设置内存配额。