我在一台内存有限且无法添加交换空间的机器上运行 Debian。这台机器用作 Web 和数据库服务器。我发现的问题是,当多个 Web 请求进入时,我的数据库会停止接受连接,有时甚至会崩溃,因为系统没有更多可用 RAM。
如果另一个进程(在我的情况下是 Firebird)请求内存但内存不足,是否可以告诉 Linux 终止特定进程(在我的情况下是 Apache)?如果无法在本机执行此操作,也许有一些工具可以帮助我实现此目的?
答案1
您可以调整 OOM 终止程序,以优先处理某些进程。每个进程都有一个分数,表示在系统处于 OOM 情况下时进程被终止的可能性。您可以在 中查看进程的分数/proc/${PID}/oom_score
。您可以使用 来影响 OOM 终止程序的决定/proc/${PID}/oom_adj
:高值会增加 OOM 终止程序终止 ${PID} 的可能性。 的值oom_adj
由子进程继承,因此您只需在启动时在主 apache 进程中设置它(在这种情况下,您应该有一个重新启动 apache 的看门狗);另一种方法是将主进程保留在其默认级别并调整每个子进程,以便主进程保持活动状态并根据需要重新生成子进程(在这种情况下,您需要一个外部守护进程来检查新子进程并调整oom_adj
)。当然,这假设您正在使用多进程工作器 ;-)
请注意,正常的值范围oom_adj
(-16,15) 只是一种偏差,如果得分足够高,OOM 终止程序的启发式方法仍可能会选择另一个进程。特殊值 -17 使该进程无法被 OOM 终止程序终止,但这很危险,因为如果无法终止的进程(例如您的 DB)失控,内核可能无法从内存短缺中恢复。
答案2
如果您使用的是租用的虚拟机,则只需添加交换文件而不是交换分区。性能较低,但至少在需要时您将拥有可用内存 :)
如何创建交换文件?
sudo dd if=/dev/zero of=/swapfile bs=1024 count=1000000
这将创建大小为 1GB(round)的文件(/swapfile)
sudo mkswap /swapfile
将此文件添加到您的交换池
sudo swapon /swapfile
这样就可以了,现在您有额外的 Gb 交换内存。