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