我在内存有限的计算机上运行Debian,并且没有添加交换空间的选项。 该机器可用作Web和数据库服务器。 我看到的问题是,当多个Web请求进来时,我的数据库停止接受连接,有时甚至崩溃,因为系统没有更多的可用内存。
是否有可能告诉Linux杀死特定的进程(在我的情况下,Apache),以防另一个进程(在我的情况下,火鸟)请求内存,并没有足够的? 如果本地不可能做到,也许有一些工具可以帮助我实现这个目标?
你可以调整OOM杀手,以select某些过程。 每个进程都有一个分数,表示在系统运行在OOM的情况下进程被杀死的可能性。 您可以在/proc/${PID}/oom_score看到进程的分数。 您可以使用/proc/${PID}/oom_adj偏见OOM杀手的决定:高值会增加OOM杀手要杀死$ {PID}的可能性。 oom_adj的值是由子oom_adjinheritance的,所以你只需在启动时将其设置在主apache进程中(在这种情况下,你应该看到一个重启apache的看门狗)。 另一种方法是将主进程保留在缺省级别,并调整每个subprocess,使主进程保持活动状态,并根据需要重新生成subprocess(在这种情况下,您需要一个外部守护进程来检查新的subprocess和oom_adj )。 当然这假设你正在使用多进程工作者;-)
请注意, oom_adj值的正常范围(-16,15)只是一个偏差,如果OOM杀手的分数足够高,它的启发式仍然可以select另一个过程。 特殊值-17使得进程不被OOM杀手破坏,但这是危险的,因为如果不可破坏的进程(例如你的DB)疯狂,内核可能无法从内存不足中恢复。
如果您使用租用的虚拟机,那么只需添加一个交换文件而不是交换分区。 性能较差,但至less在需要时您将拥有可用的内存:)
如何创build交换文件?
sudo dd if=/dev/zero of=/swapfile bs=1024 count=1000000
这将创build1GB大小的文件(/ swapfile)(循环)
sudo mkswap /swapfile
将此文件添加到您的交换池
sudo swapon /swapfile
这将做这项工作,现在你有一个额外的千兆交换内存。