Почему этот bash-скрипт вызывает так много ложных срабатываний при мониторинге использования памяти?

Почему этот bash-скрипт вызывает так много ложных срабатываний при мониторинге использования памяти?

Я отслеживаю сотни серверов, как выделенных, так и виртуальных, используя следующий скрипт:

#!/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 МБ.

решение1

3 проблемы:

  1. Вы звоните freeдважды: один раз длязапускпредупреждение, один раз для отправки отчета. Числа изменятся между ними. Сохраните вывод (в переменной) и извлеките те же данные дважды.

  2. «Использованная» памятьдолженприближаться к общему объему памяти, а "свободный" должен стремиться к нулю, всегда. Если у вас естьнеиспользованныйпамяти, это означает, что вы тратите впустую ресурсы, которые, хотя и не выделяются, должны, по крайней мере, служить кэшами.

    Я рекомендую вам изменить memusedстроку, которая в настоящее время сравнивает второй и третий столбцы ( $3/$2), чтобы вместо этого сравнивать первый и последний столбцы.

  3. Ваш метод доставки сообщений, похоже, теряет форматирование. Возможно, стоит проверить ваш метод доставки (slack.sh), чтобы отобразить ваш ввод в моноширинном формате, или заменить табуляции и пробелы соответствующими разделителями.

    Вот как должна выглядеть таблица:

    общий использовал бесплатно общий бафф/кэш доступный
    Мем: 2048 345 1580 27 122 1674
    Менять: 2048 0 2048

    Theпятьчисла начинаются с "общей" памяти, и если что,последнийчисло — это то, что вас должно волновать.

Связанный контент