この 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

ほとんどの場合は機能しますが、ランダムに誤検知が発生します。これは完全にランダムなサーバーであり、各サーバーで一貫性がないため、1 つのサーバーがトリガーされても、その後は二度とトリガーされない可能性があります (誤って)

誤検知の例:

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

このサーバーからアラートが届きましたが、使用されているのは 345 MB のみであることがわかります。

答え1

3つの問題:

  1. 2回電話をかけていますfree。1回はトリガー警告は、レポートを送信するために 1 回だけ表示されます。その間に数字は変更されます。出力を (変数に) 保存し、同じデータを 2 回取得します。

  2. 「使用済み」メモリすべきメモリの総量に近づき、「空き」は常にゼロに近づくはずです。未使用メモリが不足している場合、割り当てられていないものの、少なくともキャッシュとして機能するはずのリソースが無駄になっていることになります。

    memused現在 2 番目の列と 3 番目の列 ( $3/$2) を比較している行を、最初の列と最後の列を比較するように変更することをお勧めします。

  3. メッセージ配信方法ではフォーマットが失われているようです。配信方法 (slack.sh) を確認して入力を等幅で表示するか、タブとスペースを適切なスペーサーに置き換えてください。

    表は次のようになります。

    合計 使用済み 無料 共有 バフ/キャッシュ 利用可能
    メモ: 2048 345 1580 27 122 1674
    スワップ: 2048 0 2048

    数字は「合計」メモリから始まり、最後あなたが気にかけるべきはその数字です。

関連情報