Охота на грызунов под Linux

от автора

Существует масса средств мониторинга операционной системы, но особый смысл имеет задача отловить момент возникновения проблемы и поймать причину высокой нагрузки или источник проблем c производительностью. Я называю это охотой на «грызунов» ресурсов.

Для этого я сочинил для себя несложный скрипт ratskill.sh который вы сможете модифицировать под свои системы и задачи.

Принцип работы несложный — скрипт запускается с заданной периодичностью, проверяет уровень Load Average (вы можете использовать другие контрольные параметры) и в случае превышения заданной величины скрипт выполняет заданный набор диагностических команд с созданием отчета который высылается на указанный вами почтовый адрес.

Пример скрипта для сервера OpenVZ

#!/bin/bash  # чтобы не было проблем с выводом данных на кириллице  export LC_ALL=C  # ваш лимит load average может быть другим в зависимости от количества ядер и типа задач # например,  для сервера  OpenVZ могу рекомендовать 75-200, для гипервизора KVM - 15-45    LALIMIT="80"  # кому отправить  отчет EMAIL="alerts@домен.tld"  # тема сообщения SUBJECT="WARNING-High load notification"  # Получить среднее значение нагрузки за  5 минут F5M="$(cat /proc/loadavg | awk '{print $1}'|awk -F \. '{print $1}')"  # Сравнить с пороговым значением RESULT="$(echo "$F5M > $LALIMIT" | bc)"   # Если не зарегистрировано превышение лимита, прекратить выполнение и выйти из выполнения # Если зарегистрировано превышение, то  создать и отправить  отчет, но не делать это повторно до  # понижения нагрузки ниже лимита.  Для этого при превышении  создать файл  /tmp/ratkill.flag,  # при понижении удалить /tmp/ratkill.flag  для продолжения контроля. # if (( "$RESULT" == "1" )); then   if [ -f /tmp/ratkill.flag ]; then     exit 0   fi   touch /tmp/ratkill.flag else   if [ -f /tmp/ratkill.flag ]; then     rm -f /tmp/ratkill.flag   fi   exit 0 fi  # Создать временный файл для отчета TEMPFILE="$(mktemp)"  # Создать заголовок отчета echo "Load average Crossed allowed limit $LALIMIT." >> $TEMPFILE echo "Hostname: $(hostname)" >> $TEMPFILE echo "Local Date & Time : $(date)" >> $TEMPFILE  # Использование памяти echo "Memory-----------------------------------" >> $TEMPFILE free -m >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE vmstat -s -Sm >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE  # Контроль количества переключений контекста echo "context switches:" >> $TEMPFILE sar -w 1 5 >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE  # наиболее активные "гости" echo "Top loaded containers:" >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE /usr/sbin/vzlist \ -o veid,ip,hostname,numproc,numfile,numflock,numtcpsock,physpages,laverage \ -s laverage | tail -20 >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE  #Контроль количества сетевых соединений у гостей echo "Top containers by net. connections count:" >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE /usr/sbin/vzlist \ -o veid,ip,hostname,numproc,numtcpsock -s numtcpsock | tail -20 >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE  # Общее количество сетевых подключений echo "conntrack count" >> $TEMPFILE wc -l /proc/net/nf_conntrack >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE  # Утилизация дисков echo "I/O statistic:" >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE iostat -x 2 5 >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE  # Снимок вывода top echo "System snapshot from top:" >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE top -b | head -30 >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE  # Процессы с максимальным I/O и нагрузкой на CPU echo "Report from dstat:" >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE dstat --net --disk --disk-util --sys --load --proc --top-io-adv \ --top-cpu-adv --nocolor 5 5 >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE  # Отчет по RAID массивам  echo "RAID Logical device information" >> $TEMPFILE #/opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -LALL -aAll >> $TEMPFILE /usr/local/sbin/arcconf GETCONFIG  1 ld >> $TEMPFILE echo "-------------------------------------------" >> $TEMPFILE  # Отправить  отчет по почте cat $TEMPFILE > /tmp/load.txt echo "${SUBJECT}-${F5M}" | mail -a /tmp/load.txt -s "$(hostname -s)-${SUBJECT}-${F5M}" "$EMAIL"  rm -f $TEMPFILE 

Чтобы иметь привязку к конкретному гостю можно еще добавить разбор PID процессов через vzpid и многое другое, но это вы можете сделать сами если необходимо.

Для работы скрипта вам потребуется дополнительно установить утилиты sysstat и dstat. Используйте последнюю версию dstat для вашего дистрибутива иначе вы не получите нужный вывод.

Должно получаться нечто похожее на это:

image

Смотрите также:

ссылка на оригинал статьи http://habrahabr.ru/post/274633/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *