警告目的でメモリ使用量を監視する方法

警告目的でメモリ使用量を監視する方法

スワップのない組み込み Linux システムがあります。

現在、メモリ使用量 % がしきい値を超えたときにアラームを発する必要があります。また、メモリ使用量 % が (より高い) しきい値を超えたときに再起動する必要があります。

これを実行する理由: プログラムがリークした場合、カーネルがプロセスを強制終了する前に (データの破損や使用不可につながる可能性がある)、安全に再起動できます。

しかし、問題があります。

目的に応じて使用できるメモリ使用量(%)をカウントするにはどうすればよいでしょうか?

/proc/meminfo の値を使用してメモリ使用量をカウントしてみました。

/ # cat /proc/meminfo
MemTotal:       126744 kB
MemFree:         58256 kB
Buffers:         16740 kB
Cached:          31308 kB
SwapCached:          0 kB
Active:          37580 kB
Inactive:        24000 kB

成功しない場合:

(MemTotal - MemFree)キャッシュなどが含まれているため、使用できません。

(MemTotal - MemFree - Buffers - Cached)の効果を無視しましたInactive。そのため、メモリ使用量の値も大きくなります。

(MemTotal - MemFree - Buffers - Cached - Inactive)結果が負になる可能性があるため、使用できません。

答え1

監視システムfree

[root@localhost ~]# free
          total       used       free     shared    buffers     cached
Mem:    2058240    1776788     281452          0      89780    1335840
-/+ buffers/cache:  351168    1707072
Swap:   4095992        100    4095892

-/+ buffers/cache線を見usedfree

/proc経由で各プロセスを監視する

プロセスのメモリを監視するために、この Python スクリプトと /proc/pid/stat を使用しました。

http://phacker.org/2009/02/20/monitoring-virtual-memory-usage-with-python/

おそらく、次のようなものを c に翻訳したいでしょう。

各プロセスのリソースを制限する

またはulimit/ を使用するsetrlimit

https://stackoverflow.com/questions/4983120/limit-memory-usage-for-a-single-linux-process

答え2

#!/bin/bash

threshold=90
threshold2=95

freemem=$(($(free -m |awk 'NR==2 {print $3}') * 100))

usage=$(($freemem / 512))

if [ "$usage" -gt "$threshold" ]

then

/etc/init.d/service_name restart

     if [ "$usage" -gt "$threshold2" ]

     then

     echo "The memory usage has reached $usage% on $HOSTNAME." | mail -s "High Memory Usage Alert" [email protected]


     fi
fi

これを alert.sh という名前にして、次のコマンドを実行します。chmod +x alert.sh

このスクリプトを10分ごとに実行するようにcronを設定します

'512'をサーバーの合計メモリ(MB単位)に置き換え、'[メールアドレス]' を実際のメールアドレスで入力します。これにより、メモリ使用量が 95% を超えると電子メールアラートが送信され、90% に達するとサービス "service_name" が再起動されます。

答え3

cron で free コマンドを使用してシェル スクリプトを実行すると、メモリを監視し、その値に応じて動作することができます。たとえば、RAM メモリを監視するには、次のようにします。

#!/bin/bash

LOG_DIR=/var/log/memory_monitor.log

DATE=$(date +%d/%m/%Y)
TIME=$(date +%H:%M)
TIMESTAMP="$DATE $TIME"

MONITOR=$(free | grep Mem)
MEM_USED=$(echo $MONITOR | awk '{ print $3 }')
MEM_FREE=$(echo $MONITOR | awk '{ print $4 }')

echo "$TIMESTAMP $MEM_USED $MEM_FREE" >> $LOG_DIR

出力をエコーする代わりに、必要な制限まで値を評価し、メール、再起動、または必要なアクションを実行することができます。

if [ eval_values > threshold ]
then
    # Do stuff (mail, reboot, etc)
fi

次に、それを crontab に追加して、必要な間隔で実行されるようにします。

答え4

sysstat パッケージのもう一つの便利なユーティリティは sar です。

メモリ情報については、以下を使用します。

$ sar -r 1
Linux 3.0.0-12-generic (HFC-2600)       05/03/2012      _i686_  (4 CPU)

01:35:45 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact
01:35:46 PM    118484    907364     88.45     59200    317368   2169716    104.75    412476    436140

このボックスには間違いなくもっと多くの RAM が必要です。

関連情報