如何监控内存使用情况以发出警报

如何监控内存使用情况以发出警报

我们有无交换空间的嵌入式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 中使用带有 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 中,按照您想要的间隔运行。

答案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。

相关内容