Убить процессы, если средняя нагрузка высокая
Не так давно 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 - крошечный доступный и надежный сервер удаленного выполнения команд и клиент, предназначенный исключительно для экстренных ситуаций:
Загрузка - это совокупное значение задач, выполнение обработки которых осталось выполнить.
Это мера оставшейся части обработки, оставленной для выполнения после того, как каждому процессу был выделен достаточный промежуток времени ЦП. Фактически, это говорит о том, насколько хорошо система справляется с конкуренцией ресурсов между процессами.
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