监控特定进程内存利用率的脚本

监控特定进程内存利用率的脚本

我为一位客户做一些远程服务器管理工​​作,他最近开始试用 New Relic 两周。他们最近遇到了一些性能问题,也请我帮他们看看。

他们发现,根据 New Relic 的数据,他们的一台服务器上的内存使用率只达到了 50%,因此开始怀疑内存指标/图表有误(并通过电子邮件向 New Relic 发送了相关信息)。

今天下午我花了一些时间检查配置文件、New Relic 上的 CPU/内存/IO 图表,并提出了一些建议。

我并不认为内存指标是错误的。例如,在我的客户端数据库服务器上,New Relic 表示 MySQL 使用的 RAM(有时)为 3,481Mb。我运行 PS 来获取 MySQL 的 pid,然后运行以下命令:

cat /proc/29313/status

为 VmRSS 输出以下内容:

VmRSS:   3566268 kB

(即 3,482Mb 内存)

my.cnf 有一些我建议他们调整的设置(key_buffer_size 等...)。

[编辑:如果您好奇,这与我下面的问题无关,但这台特定的服务器正在运行 cPanel 并拥有 32 GB 的 RAM。它是一台专用的 MySQL 服务器,上面运行着许多数据库。]

我的问题是 VmRSS 是否是监控某个进程使用多少内存的最佳指标。如果是,我正在考虑编写一个脚本,该脚本将在 cron 上每 30 秒左右运行一次,持续大约 1-2 周,然后查看数据。该脚本看起来如下所示:

$PID = pgrep mysql
cat /proc/$PID/status | grep VmRSS: > /var/log/my-custom-process-memory-monitor.log

这是个好主意吗?你能想到更好的吗?为什么或为什么不?

答案1

RSS(驻留集大小)可能不可靠,因为诸如 fork() 之类的进程在为新进程分配内存时会执行写时复制分页。

即如果你生成一个进程,给它 50M 的内存来使用,然后 fork() 循环 10 次 - RSS 大小将报告 500MB 的内存使用量,而实际上你更有可能使用超过 50M 的大小。

据我所知,对于非分叉进程,RSS 应该是总体可靠的。

答案2

如果你仍然需要脚本,以下是我使用的脚本。但正如前面的回复所说,知道如何解释数字

此脚本以正则表达式为 $1,并以字节为单位显示数字

[root@bla ~]# cat /bla/get_rss_sum_processes 
#!/bin/sh

PATH="/bin/:/usr/bin:$PATH"
export PATH

test -z "$1" && exit 0

# Does not return 0 if not found
# ps -e -o rss,args |grep -P "$1" |awk '{SUM += $1} END {print int(SUM)}'  # Prints 7.91786e+09 if too big
# ps -e -o rss,args |grep -P "$1" |awk '{print $1}' |paste -sd+ |bc
# ps -e -o rss,args |grep -P "$1" |awk '{print $1}' |perl -lne '$x += $_; END { print $x*1024; }'
ps -e -o rss,args |grep -P "$1" |perl -lne '$_ =~ s/^ *//; $x += (split(/ /))[0]; END { print $x*1024; }'

相关内容