Отримав завдання щодо попередження про можливе перенавантаження сервера одного або декількох процесорів або ядер . У пошуках готових рішень скриптів знайшов повідомлення від 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)}'"
Немає коментарів:
Дописати коментар