我需要用Cpanel从Centos 6.7中获取统计数据,并发送到我的外部监控服务器。我想得到的是最近3分钟内每个用户或每个进程名称的平均cpu负载。经过多次研究和测试,除了使用的bash run top之外,没有发现任何可行的解决方案
top -d 180 -b -n 2 > /top.log
第二次迭代看起来像。。。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
38017 mysql 20 0 760m 265m 6324 S 1.4 14.2 244:27.08 mysqld
39501 nobody 20 0 1047m 93m 7068 S 0.1 5.0 0:06.80 httpd
54877 johnd 20 0 32728 3612 2364 S 0.0 0.2 0:00.09 imap
51530 johnd 20 0 353m 5372 1928 S 0.0 0.3 0:04.17 php-fpm
39500 nobody 20 0 1046m 79m 3656 S 0.0 4.3 0:02.57 httpd
7 root 20 0 0 0 0 S 0.0 0.0 27:47.61 events/0
39497 nobody 20 0 1046m 84m 7784 S 0.0 4.5 0:02.77 httpd
etc...
然后用COMMAND或USER进行grep(仅在第二次迭代输出时),求和并除以100,得到类似cpu负载的值
echo "$PRTGTOP" | grep johnd | awk '{ sum += $9; } END { print sum/100; }'
我可能还应该试着计算处理时间等?,也许有一种更简单的方法可以实现同样的结果,也许可以使用第三方软件生成统计数据?
谢谢。
top
从/proc/*/stat
获取其信息。/proc
下的每个数字目录都是当前运行的进程的进程号。
您可能更容易直接从这些目录中收集数据。数据格式定义良好,可以在man proc
中名为"/proc/[pid]/stat"的小节中找到。
您可以尝试pidstat
工具(sysstat包的一部分):
pidstat -C httpd -U johnd -h -u 180 1 | awk '{ sum += $7; } END { print sum/100;}'
这将返回在180
秒间隔内与httpd
命令字符串和johnd
用户匹配的所有进程的CPU使用百分比。
好吧,pidstat更好,谢谢!,但如果USER pid只运行几秒钟,则不会报告cpu使用情况。我发现最好的结果:
#run pidstat with 10 iterations for 18 times
pidstat -U -u 10 18 > /pidstat.log
然后
#sum all cpu usage and divide by 18
cat /pidstat.log | grep -v Average | grep johnd | awk '{ sum += $8; } END { print sum/100/18;}' OFMT="%3.3f"
cat /pidstat.log | grep -v Average | grep httpd | awk '{ sum += $8; } END { print sum/100/18;}' OFMT="%3.3f"
这样,即使进程只运行了几秒钟,但cpu使用率很高,我也能获得每个用户的最佳cpu使用率统计数据