アラームの目的でメモリ使用量を監視する方法


9

スワップなしの組み込み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) 結果は負になる可能性があるため、使用できません。

回答:


6

システムの監視 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/cacheusedを見て、free

/ procを介して各プロセスを監視する

このpythonスクリプトと/ proc / pid / statを使用して、プロセスのメモリを監視しました。

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

あなたはおそらくこのようなものをcに翻訳したいと思うでしょう。

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

またはulimit/を使用しますsetrlimit

/programming/4983120/limit-memory-usage-for-a-single-linux-process


Pythonスクリプトがメモリ使用量を計算するために使用する方法を説明できますか?それはこれをより良い答えにするでしょう。
Flimzy

まあ、それは一瞬でvm-usageを記録するだけです。プログラムの存続期間中のメモリ消費をグラフ化するためにそれを使用しました。これは、長時間実行されているプログラムでのメモリリークをデバッグするのに便利でした。
スニー

これを使用して、初期化時間の経過後にプログラムを監視することができます。また、vmusageが特定のしきい値を超える場合は、「リークの疑いのあるフラグ」を警告します。
snies

1
phacker.orgへのリンクはもうありません
f01

...これがStarckExchangeがリンクだけでなくスクリプトのコンテンツの投稿を常に要求する理由です
JDS

4
#!/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" admin@domain.com


     fi
fi

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

このスクリプトを10分ごとに実行するようにcronを構成する

「512」をサーバーの合計メモリ(MB)に、「admin@domain.com」を実際のメールアドレスに置き換えてください。これにより、メモリ使用量が95%を超えると電子メールアラートが送信され、90%に達した場合にサービス "service_name"が再起動されます


2

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に追加して、必要な間隔で実行します。


1

sysstatパッケージのもう1つの便利なユーティリティは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を使用することができました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.