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

в 10:25, , рубрики: bash, linux, scripts, Настройка 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

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

Автор: ashvayakov

Источник

Поделиться новостью

* - обязательные к заполнению поля