如果平均负载过高则终止进程

如果平均负载过高则终止进程

不久前,我服务器上的 LA 上升到 400,我甚至无法使用 ssh 登录服务器。是否有任何软件可以通过自动终止对服务器造成巨大负载的进程来防止这种情况?

附注:Debian 6.0.5

答案1

你可以使用如下看门狗监控监视您关心的进程,如果它们消耗过多资源,则重新启动它们。

类似这样的代码可以用来监控 Apache:

 check process apache with pidfile /var/run/httpd.pid
       start program = "/etc/init.d/httpd start"
       stop program  = "/etc/init.d/httpd stop"
       if cpu > 40% for 2 cycles then alert
       if totalcpu > 60% for 2 cycles then alert
       if totalcpu > 80% for 5 cycles then restart
       if mem > 100 MB for 5 cycles then stop
       if loadavg(5min) greater than 10.0 for 8 cycles then stop

因此,如果 Apache 进程或其任何子进程的 CPU 使用率超过 40%,则发送警报。如果超过 80%,则重新启动 Apache。

如果 Apache 由于某种原因没有运行,Monit 也会启动它,这是一种保持关键服务正常运行的合理方法(如果您没有像 Upstart 这样的可用程序)。

这假设您有一组可以针对此类监控的进程。您可能怀疑某个特定应用程序可能存在问题。

答案2

当你的 LA 升高并且你无法通过 ssh 登录时,请尝试灰色粘质一个微型可用且可靠的远程命令执行服务器和客户端,专为紧急情况而设计:

https://code.google.com/p/greygoo/

答案3

负荷是任务仍有处理工作需要运行。

它衡量的是在每个进程被分配了公平的 CPU 时间片之后,剩余的处理任务。它实际上用一个数字来衡量系统处理进程间资源竞争的能力。

如果进程导致大量 IO 使用,IOWait 也会增加负载,这可能表明存在内存问题(使用过多内存并积极交换)或潜在的 I/O 问题。如果只有一个进程占用大量 I/O,它通常会受到惩罚,而不会对其他进程造成太大影响。

我认为您不能简单地终止一个进程来解决此类问题,因为问题源于一些进程对 CPU 的需求。不过,您可以终止某个特定进程的进程组或线程池。

答案4

这是一个简单的 bash 脚本,如果系统负载高于某个限制,它可以终止一个进程。

在此示例中,如果负载高于 2.5,脚本将终止“命名”进程。

如果负载降至该水平以下,则它会检查命名是否正在运行,并在需要时启动它。

#!/bin/bash

NOTIFY="2.5"

TRUE="1"    
FTEXT='load average:'
LOAD5MIN="$(uptime | awk -F "$FTEXT" '{ print $2 }' | cut -d, -f2 | sed 's/ //g')"

RESULT=$(echo "$LOAD5MIN > $NOTIFY" | bc)

if [ "$RESULT" == "$TRUE" ]; then
    echo "High load"
    killall -9 named
else
    pgrep named || /etc/init.d/bind9 start 1>/dev/null 2>/dev/null
fi

相关内容