
我們有嵌入式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
配置 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
我絕對可以在這個盒子上使用更多的內存。