如何監控記憶體使用情況以達到警報目的

如何監控記憶體使用情況以達到警報目的

我們有嵌入式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/cacheusedfree

透過/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

配置 cron 以每 10 分鐘執行一次此腳本

確保將“512”替換為伺服器總記憶體(以 MB 為單位)和“[電子郵件受保護]' 使用實際的電子郵件地址。當記憶體使用率超過 95% 時,這將發送電子郵件警報,並在達到 90% 時重新啟動服務“service_name”

答案3

您可以在 cron 中使用 shell 腳本和 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

我絕對可以在這個盒子上使用更多的內存。

相關內容