我有一台 Centos 6.5 服务器,运行 QEMU-KVM 虚拟化:
硬件:
软件:
有 3 个来宾,具有相同的硬件配置:
<memory unit='KiB'>125829120</memory>
<currentMemory unit='KiB'>125829120</currentMemory>
<vcpuplacement='static'>16</vcpu>
来宾正在运行 Apache 和 MySQL。
在主机上,除了虚拟之外,只运行一些备份和维护脚本,没有别的。
总是在运行几天后,问题开始出现。来宾的负载随机飙升至约 150,窃取 CPU 时间为 10-15%。在主机上,负载约为 38-40,用户 cpu 时间约为 30-40%,系统 cpu 时间约为 40-50%。
此时主机上消耗 CPU 最多的进程是虚拟来宾的 Qemu 进程,紧随其后的是 kswapd0 和 kswapd1,CPU 使用率为 100%。
那一刻的内存使用情况:
加上缓冲区中的 10-20 …
我正在运行 Apache 网络服务器,并希望稍微改进 OOM 情况的处理方式。
我很了解 OOM 分数,并且已经在这方面进行了一些自定义,因此当发生不好的事情时,Linux 会终止正确的进程。但这还不够。
问题是,有时当发生 OOM 时,服务器会过载,然后崩溃,必须重新启动。我想在不完全重启服务器的情况下处理这个问题。所以我需要以某种方式在 OOM 杀手调用上“挂钩”一个脚本,这将杀死所有 apache(及其 CGI)进程,从而释放内存并再次启动它(Apache)。
我知道这会起作用,因为如果发生 OOM 并且我足够快地登录到服务器并手动终止 Apache,那么一切都会好起来的。
仅供参考,我现在正在运行将近一百个这样的网络服务器,这就是我寻找全自动解决方案的原因。
一种可能的解决方案当然是使用一些看门狗来解析系统日志并以这种方式检测 OOM - 我已经有了类似的东西,它通过电子邮件通知 OOM 杀人事件。这种方法可以解决某些情况,但如果 OOM 真的很糟糕,服务器过载太多,我的脚本甚至无法启动(由 cron 运行)。可以通过使用 inotify 观察系统日志或通过管道直接(即通过 fifo)将系统日志传送到脚本来改进它。
但我仍然想知道 - 有没有办法将脚本直接“挂钩”到 OOM 杀手上?所以我会把类似的东西放在一些 /etc/.. 文件中:
oom_action="sh /path/to/my/script.sh kill"
Run Code Online (Sandbox Code Playgroud)
或者它根本不可能那样做?
我使用 Centos 6、Apache 2.2 和 PHP 作为 FastCGI。