我在内存有限且无法添加交换空间的计算机上运行Debian.该机器用作Web和数据库服务器.我看到的问题是,当多个Web请求进入时,我的数据库停止接受连接,有时甚至崩溃,因为系统没有更多的可用RAM.
是否有可能告诉Linux杀死特定进程(在我的情况下,Apache),以防另一个进程(在我的情况下,Firebird)请求内存而且还不够?如果不可能本地化,也许有一些工具可以帮助我实现这一目标?
解决方法
您可以调整OOM杀手,以优先选择某些进程.每个进程都有一个分数,表示系统在OOM情况下运行时进程被杀的可能性.您可以在/ proc / ${PID} / oom_score中查看进程的分数.您可以使用/ proc / ${PID} / oom_adj来偏置OOM杀手的决定:高值会增加OOM杀手杀死${PID}的可能性. oom_adj的值由子节点继承,因此您只需在启动时在主apache进程中设置它(在这种情况下,您应该使用重启apache的监视程序);另一种方法是将主进程保持在默认级别并调整每个子进程以使主进程保持活动状态并根据需要重新生成子进程(在这种情况下,您需要一个外部守护进程来检查新的子进程并调整oom_adj).当然,这假设您正在使用多进程工作者;-)
请注意,oom_adj值的正常范围(-16,15)只是一个偏差,如果OOM杀手的得分足够高,它的启发式仍然可以选择另一个过程.特殊值-17使得该进程不受OOM杀手的攻击,但它很危险,因为如果不可杀死的进程(例如你的数据库)发狂,内核可能无法从内存不足中恢复.