我首先想到的是 SAR 或 sysstat 包中的内置功能。但如果确实如此,我似乎找不到这个解决方案。
我希望看到的是进程使用情况(内存、CPU 等)的历史记录,如果可能的话最好通过 sysstat 来查看,其格式与 SAR 日志非常相似(如果尚未通过 SAR 文件直接获取)。我知道有监控软件可用,但我更想寻找一种几乎非侵入式的软件包,实际上可以通过 statsd/collectd 相对直观地解析。
答案1
将 sar 命令作为后台进程运行。其语法为:
sar -o datafile interval count >/dev/null 2>&1 &
所有数据都以二进制形式捕获并保存到文件(数据文件)中。然后可以使用 sar 命令的 -f 选项有选择地显示数据。设置间隔和计数参数以按间隔秒间隔选择计数记录。如果未设置计数参数,则将选择保存在文件中的所有记录。以这种方式收集数据有助于表征一段时间内的系统使用情况并确定高峰使用时间。
答案2
您可以使用一个愚蠢的 while 循环,每 5 分钟打印一次顶级进程的资源使用情况。
while true; do
date;
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-pcpu | head;
echo;
sleep 300;
done
以上将输出使用 CPU 使用率最高的前 9 个进程。要获取使用内存最多的前 9 个进程,请使用:
while true; do
date;
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-pmem | head;
echo;
sleep 300;
done
例子
以下示例输出显示 apache 显然是我们最大的 CPU 消耗进程。
Sun Jan 28 23:46:28 UTC 2024
PID PPID CMD %MEM %CPU
25130 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.7
12878 11432 /usr/sbin/httpd -DFOREGROUN 0.2 2.5
23903 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.4
898 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.2
902 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.2
910 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.2
8397 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.2
9263 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.2
23911 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.2
Sun Jan 28 23:51:28 UTC 2024
PID PPID CMD %MEM %CPU
25130 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.6
12878 11432 /usr/sbin/httpd -DFOREGROUN 0.2 2.4
23903 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.4
898 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.2
902 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.2
910 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.2
8397 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.2
9263 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.2
23911 11432 /usr/sbin/httpd -DFOREGROUN 0.1 2.2
限制
显然这很糟糕,因为它只会告诉你瞬间运行命令时的精确时间点(每 5 分钟)的资源使用情况。
理想情况下,它会告诉你平均资源使用情况间隔输出之间的时间间隔。但是,鉴于这个问题已经存在 7 年了,而且没有好的答案 —— 总比没有好。
让它在一个screen
会话中运行一整夜,到早上你就会有一些更好的见解(只需付出很少的努力)。