7 березня 2013 р.

Скрипт для моніторингу завантаження процесорів системи з FreeBSD та попередження про критичний стан поштою

Отримав завдання щодо попередження про можливе перенавантаження сервера одного або декількох процесорів або ядер . У пошуках готових рішень скриптів знайшов повідомлення від Rahul.Patil, допрацював його і отримав наступне рішення:
Про стан навантаження процесорів збирається програмою top з параметром -P, робиться два цикли для заміру навантаження процесорів, параметр -d2 , тому витрачається 2 секунди.
Відфільтровується значення IDLE кожного з процесорів. Результат виводиться одним рядком на кожен з процесорів, цілим числом відсоткового значення  простою процесора.
Далі значення порівнюється з пороговим значенням моніторингу простою процесора - змінна "THRESHOLD".  Якщо завантаження (простій) процесора нижче порогового значення, то починається підрахування терміну коли процесор знаходиться у критичному стані, зменшенням значення змінної WINDOW[CPU], де CPU номер процесора. Якщо рівень завантаження процесору стане вище порогового значення, то значення  змінної WINDOW[CPU] скидається до початкового значення (INITWINDOW), і у випадку нового завантаження відлік починається спочатку.
Коли завантаження одного з процесорів незмінне протягом певного часу (INITWINDOW), то відсилається повідомлення адміністратору системи поштою, про стан певного процесора і  перелік 10-ти перших процесів, з найбільшим відскоком завантаження.  Потім програма робить паузу на час визначеним значенням змінної WAITMAIL.
Кожен цикл перевірки стану  супроводжується паузою визначеним значенням змінної WAIT, повний цикл дорівнює значення змінної WAIT плюс 2 секунди що витрачаються програмою top.
Приклад скрипту з використанням bash shell для 4х процесорної системи.

#!/usr/local/bin/bash
#monitoring idle state per processor core
# Script log file
LOG="/var/log/cpu.log"

# Define Threshold
THRESHOLD=5  ## in percentage idle

TO="postmaster@example.com"
MESSAGE="/tmp/monitor-cpu-message.txt"

# wait time(in seconds) after sending mail
WAITMAIL=300
# wait time(in seconds) after loop
WAIT=8
# wait time (in seconds) in critical zone
INITWINDOW=120

#fill init value for all CPUs
for index in 0 1 2 3
do
 WINDOW[index]=$INITWINDOW
done

function checkwindow() {
    if [ $1 -eq 0 ]; then
        IDLE=$3
        let "usage=100-IDLE"
        SUBJECT="WARNING CPU$2 USAGE HIGH"
        ps -o "%cpu,args" | sort -nr -k 1  | head -10 >>  $MESSAGE
        echo "." >> $MESSAGE
        echo "Usage of CPU$2 is $usage% during $INITWINDOW sec." >> $MESSAGE
        echo  "Time: `date`" >> $MESSAGE
        mail -s "$SUBJECT" "$TO" < $MESSAGE
        rm $MESSAGE
        echo "CPU$2 USAGE CRITICLE @@$(date)@@ Usage:$usage" | tee -a $LOG
        sleep $WAITMAIL
    fi
}

while :
do
CPU=0
  for thiscpu_usage in $(top -b -d 2 -I -P  | awk '/^CPU/{sub(/\.+% idle$/,"");  print int($11)}') ; do
    if [ "$thiscpu_usage" -le "$THRESHOLD" ]; then
        let "WINDOW[CPU]=WINDOW[CPU]-2-WAIT"
    #    echo "CPU$CPU $thiscpu_usage ${WINDOW[$CPU]}"
        checkwindow ${WINDOW[$CPU]} $CPU $thiscpu_usage
    else
        WINDOW[$CPU]=$INITWINDOW
    #    echo "CPU$CPU usage is OK @@$(date)@@ Idle:$thiscpu_usage%" | tee -a $LOG
    fi
  let "CPU=CPU+1"
  done
sleep $WAIT
done

Якщо треба перевіряти середнє значення завантаження процесорів, а не кожного окремо то потрібно змінити
значення 44 рядку з наступним змістом "
top -b -d 2 -I -P  | awk '/^CPU/{sub(/\.+% idle$/,"");  print int($11)}'"
на
"top -b -d 2 -I  | awk '/^CPU/{sub(/\.+% idle$/,"");  print int($10)}'"


Немає коментарів:


Коли забув ти рідну мову, біднієш духом ти щодня...
When you forgot your native language you would become a poor at spirit every day ...

Д.Білоус / D.Bilous
Рабів до раю не пускають. Будь вільним!

ipv6 ready