Я отслеживаю сотни серверов, как выделенных, так и виртуальных, используя следующий скрипт:
#!/bin/bash
PATH=/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
threshold=90
serverip=$($(which ifconfig) | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | head -1)
memused=$(free | awk '/Mem/{printf("RAM Usage: %.2f%\n"), $3/$2*100}' | awk '{print $3}' | cut -d"." -f1)
if [ "$memused" -gt "$threshold" ]
then
CTIME=$(date +%Y-%m-%d-%H%M%S)
ps aux > /root/.example/logs/lowmem-"${CTIME}"-ps.log
top -n 1 -o %MEM -c > /root/.example/logs/lowmem-"${CTIME}"-top.log
free -m > /root/.example/logs/lowmem-"${CTIME}"-free.log
mysqladmin proc -v status > /root/.example/logs/lowmem-"${CTIME}"-mysqlproc.log
bash /example/general/slack.sh "#server-alerts" ":warning: $(hostname) - ${serverip} - Memory Usage has reached 90% - Check logs /root/.example/logs/lowmem-${CTIME} \n \`\`\`$(head -1 /root/.example/logs/lowmem-"${CTIME}"-free.log) \n $(head -2 /root/.example/logs/lowmem-"${CTIME}"-free.log | tail -1) \n $(tail -1 /root/.example/logs/lowmem-"${CTIME}"-free.log)\`\`\`"
crontab -l | grep -v '/example/mon_mem.sh' | crontab -
sleep 900
crontab -l | { cat; echo "* * * * * bash /example/mon_mem.sh"; } | crontab -
fi
Хотя он работает в большинстве случаев, мы получаем случайные ложные срабатывания, его совершенно случайные серверы и это не согласуется с каждым сервером, поэтому один сервер может срабатывать, но затем не срабатывать снова (ложно)
Пример ложного срабатывания:
total used free shared buff/cache available
Mem: 2048 345 1580 27 122 1674
Swap: 2048 0 2048
С этого сервера пришло предупреждение, но вы можете видеть, что было использовано только 345 МБ..
3 проблемы:
Вы звоните free
дважды:один раз для срабатывания предупреждения, один раз для отправки отчета. Цифры между ними изменятся. Сохраните вывод (в переменной )и дважды извлеките одни и те же данные.
"Используемая" память должна приближаться к общему объему памяти, а "свободная" всегда должна приближаться к нулю. Если у вас есть неиспользуемая память, это означает, что вы потратили впустую ресурсы, которые должны хотя и не выделяться, но по крайней мере служить кэшами.
Я рекомендую вам изменить строку memused
, которая в настоящее время сравнивает второй столбец с третьим столбцом ($3/$2
), чтобы вместо этого сравнивать первый столбец с последним.
Похоже, что ваш метод доставки сообщений теряет форматирование. Возможно, стоит проверить способ доставки (slack.sh), чтобы отобразить ввод в моноширине, или заменить табуляцию и пробелы соответствующими разделителями.
Вот как должна выглядеть таблица:
всего | используется | свободно | общий | баф/кэш | доступно | |
---|---|---|---|---|---|---|
память: | 2048 | 345 | 1580 | 27 | 122 | 1674 |
Перестановка: | 2048 | 0 | 2048 |
пять чисел начинаются с "общей" памяти, и, во всяком случае, последний номер — это тот, о котором вы должны заботиться.