Убить процессы, если средняя нагрузка высокая

Не так давно LA на моем сервере поднялся до 400, и я даже не смог войти на сервер, используя ssh. Существует ли какое-либо программное обеспечение, которое может предотвратить такие ситуации, автоматически убивая процессы, которые делают огромную нагрузку на сервер?

PS. Debian 6.0.5

4 ответа

Решение

Вы можете использовать сторожевой таймер, например Monit, для наблюдения за процессами, которые вас интересуют, и перезапустить их, если они потребляют избыточные ресурсы.

Нечто подобное будет использоваться для мониторинга 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 или любого из его дочерних элементов превышает 40%, отправьте предупреждение. Если оно выше 80%, перезапустите Apache.

Monit также запустит Apache, если он по какой-то причине не работает, что является разумным способом поддерживать критически важные службы (если у вас нет чего-то вроде Upstart).

Это предполагает, что у вас есть набор процессов, которые вы можете настроить для такого рода мониторинга. Предположительно, вы подозреваете, что конкретное приложение может быть проблемой.

Когда ваш LA повышается, и вы не можете войти через ssh, попробуйте Gray Goo - крошечный доступный и надежный сервер удаленного выполнения команд и клиент, предназначенный исключительно для экстренных ситуаций:

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

Загрузка - это совокупное значение задач, выполнение обработки которых осталось выполнить.

Это мера оставшейся части обработки, оставленной для выполнения после того, как каждому процессу был выделен достаточный промежуток времени ЦП. Фактически, это говорит о том, насколько хорошо система справляется с конкуренцией ресурсов между процессами.

IOWait также может увеличить нагрузку, если процессы вызывают интенсивное использование ввода-вывода, что может указывать на проблему с памятью (слишком большую ее загрузку и агрессивную перестановку) или на основную проблему ввода-вывода. Если это всего лишь один процесс, который использует нагрузку ввода-вывода, он все равно будет наказан без особого влияния на другие процессы.

Я не думаю, что вы можете просто убить один процесс, чтобы решить проблему, подобную этой, поскольку проблема проистекает из нескольких требований процессора к процессору. Вы можете уничтожить группу процессов или пул потоков для одного конкретного процесса.

Вот простой bash-скрипт, который может завершить процесс, если нагрузка на систему выше определенного предела.

В этом примере скрипт убивает "именованный" процесс, если нагрузка превышает 2,5.

Если нагрузка падает ниже этого уровня, он проверяет, работает ли named, и запускает его при необходимости.

#!/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
Другие вопросы по тегам