systemd 有一个OOMScoreAdjust
选项,允许调整启动进程的 oom-killer 分数。
引用systemd 文档:
OOMScoreAdjust=
为执行的进程设置内存不足杀手的调整级别。取一个介于 -1000(禁用此进程的 OOM 终止)和 1000(使此进程在内存压力下很可能终止)之间的整数。有关详细信息,请参见proc.txt。
在我的设置中,我在 AWS 上部署了一个 NodeJs 服务器。除了节点服务器之外,EC2 实例上没有运行其他任何东西(除了监控和基本的操作系统进程)。有 ELB 健康检查,最终应该会替换损坏的 EC2 实例。
不过,我想知道如果存在内存问题,增加内核是否更喜欢杀死 Node 服务器进程是否被认为是一种好习惯OOMScoreAdjust
,因为它可以自动重新启动。在 systemd 中,它可能如下所示:
OOMScoreAdjust=1000
Restart=always
我不得不承认我的理解是有限的。我目前的理解是,它很可能不会产生真正的影响,最好保留默认值:
- 如果内存耗尽的进程是节点服务器,它很可能无论如何都会被杀死。
- 如果罪魁祸首是另一个进程,重新启动节点服务器将无济于事,ELB 健康检查最终应该负责替换实例。
不过,我很好奇是否有更好理解的人已经考虑过了。启用它只是 systemd 脚本中的一行。如果有疑问,我宁愿让内核杀死 Node 进程而不是任何随机系统服务。
对于具有单个进程的服务器,它可能不会产生太大的影响,但如果您有一个经常泄漏内存的进程,这真的会大放异彩。
例如,在桌面上,Firefox 倾向于使用越来越多的内存,直到调用 OOM-killer,并且总是会确定 Xorg 正在使用最多的内存并将其杀死,从而导致整个桌面崩溃,而实际上它只是浏览器需要重新启动。
因此,在这种情况下,将泄漏程序的 OOM 分数设置为 1000 并立即重新启动不会有问题,因为它将首先被杀死,并且当它重新加载时,它不会像以前那样使用尽可能多的内存,从而释放整体记忆。
如果该进程的内存使用相当稳定,那么它不太重要(但肯定不会受到伤害),但如果它是泄漏的,那么它可能会比让 AWS ELB 注意到问题并构建一个新的 VM 更快地恢复。