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

SKi*_*SKi 9 memory linux

我们有没有swap的嵌入式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
Run Code Online (Sandbox Code Playgroud)

没有成功:

(MemTotal - MemFree) 不可用,因为它包含例如缓存。

(MemTotal - MemFree - Buffers - Cached)确实忽略了 的影响Inactive。所以它也给出了太大的内存使用值。

(MemTotal - MemFree - Buffers - Cached - Inactive) 不可用,因为结果可能为负。

sni*_*ies 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
Run Code Online (Sandbox Code Playgroud)

-/+ buffers/cache线usedfree

通过 /proc 监控每个进程

我使用这个 python 脚本和 /proc/pid/stat 来监视进程的内存:

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

你可能想把这样的东西翻译成c。

限制每个进程的资源

或使用ulimit/setrlimit

/sf/ask/348818431/


Sau*_*gla 5

#!/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
Run Code Online (Sandbox Code Playgroud)

将其命名为alert.sh并执行命令:chmod +x alert.sh

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

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