如何监视内存使用情况以达到报警目的


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) 无法使用,因为结果可能为负。

Answers:


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/cache线usedfree

通过/ 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。我用它来绘制程序生命周期内的内存消耗图表。在长时间运行的程序中调试内存泄漏很方便。
snies 2012年

您可以在一些初始化时间之后使用它来监视一个编。如果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

配置cron以每10分钟运行一次此脚本

确保用服务器总内存(MB)替换“ 512”,用实际电子邮件地址替换“ admin@domain.com”。每当内存使用率超过95%时,这将发送电子邮件警报,如果达到90%,将重新启动服务“ service_name”


2

您可以在cron中使用带有free命令的shell脚本来监视内存并根据其值进行操作。例如,要监视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软件包中的另一个有用实用程序是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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.