Назад | Перейти на главную страницу

Завершить процессы при высокой средней нагрузке

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

PS. Debian 6.0.5

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

Что-то вроде этого будет использоваться для мониторинга 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, попробуйте Серая слизь крошечный доступный и надежный сервер и клиент удаленного выполнения команд, предназначенный исключительно для экстренных ситуаций:

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

Вот простой сценарий 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

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

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

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

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