我们有没有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) 不可用,因为结果可能为负。
监控系统通过 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线used和free
通过 /proc 监控每个进程
我使用这个 python 脚本和 /proc/pid/stat 来监视进程的内存:
http://phacker.org/2009/02/20/monitoring-virtual-memory-usage-with-python/
你可能想把这样的东西翻译成c。
限制每个进程的资源
或使用ulimit/setrlimit
#!/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”
| 归档时间: |
|
| 查看次数: |
19374 次 |
| 最近记录: |