Warum löst dieses Bash-Skript bei der Überwachung der Speichernutzung so viele Fehlalarme aus?

Warum löst dieses Bash-Skript bei der Überwachung der Speichernutzung so viele Fehlalarme aus?

Ich überwache Hunderte von dedizierten und virtuellen Servern mit dem folgenden Skript:

#!/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

Obwohl es in den meisten Fällen funktioniert, erhalten wir zufällig falsche Positivmeldungen. Es sind völlig zufällige Server und es ist nicht bei jedem Server konsistent, sodass ein Server möglicherweise auslöst, aber dann nie wieder (fälschlicherweise).

Beispiel für ein falsches Positiv:

total used free shared buff/cache available 
Mem: 2048 345 1580 27 122 1674 
Swap: 2048 0 2048

Von diesem Server ist eine Warnung eingegangen, aber Sie können sehen, dass nur 345 MB verwendet wurden.

Antwort1

3 Probleme:

  1. Sie rufen freezweimal an: einmal fürAuslösungdie Warnung, einmal zum Senden des Berichts. Die Zahlen haben sich in der Zwischenzeit geändert. Speichern Sie die Ausgabe (in einer Variablen) und rufen Sie dieselben Daten zweimal ab.

  2. "Verwendeter Speichersollennähert sich der Gesamtspeichermenge, und "frei" sollte immer gegen Null gehen. Wenn SieungebrauchtSpeicher, das bedeutet, dass Sie Ressourcen verschwendet haben, die zwar nicht zugewiesen sind, aber zumindest als Caches dienen sollten.

    Ich empfehle Ihnen, die memusedZeile zu ändern, die derzeit die zweite mit der dritten Spalte vergleicht ( $3/$2), sodass stattdessen die erste mit der letzten Spalte verglichen wird.

  3. Bei Ihrer Methode zur Nachrichtenübermittlung scheint die Formatierung verloren zu gehen. Überprüfen Sie Ihre Übermittlungsmethode (slack.sh), um Ihre Eingabe in Monospace wiederzugeben, oder ersetzen Sie Tabulatoren und Leerzeichen durch entsprechende Abstandshalter.

    So sollte die Tabelle aussehen:

    gesamt gebraucht frei geteilt Buff/Cache verfügbar
    Speicher: 2048 345 1580 27 122 1674
    Tauschen: 2048 0 2048

    DerfünfZahlen beginnen mit dem "Gesamt"-Speicher, und wenn überhaupt, diezuletztDie Nummer ist diejenige, die Sie interessieren sollte.

verwandte Informationen