
スワップのない組み込み 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
線を見used
てfree
/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 が必要です。