题
我正在运行一些 杰米特 针对 Java 进程进行测试,以确定 Web 应用程序在负载(500 多个用户)下的响应能力。JMeter 将给出每个 Web 请求的响应时间,并且我编写了一个脚本,每隔 X 秒 ping Tomcat 管理器,这将获取 JVM 堆的当前大小。
我想收集服务器上 Tomcat 使用的 CPU 百分比的统计信息。我尝试在 shell 脚本中使用 ps
像这样:
PS_RESULTS=`ps -o pcpu,pmem,nlwp -p $PID`
...每 X 秒运行一次命令并将结果附加到文本文件中。(对于任何想知道的人来说, pmem
= % 内存使用率和 nlwp
是线程数)
然而我发现这给出了与我想要的不同的“CPU利用率百分比”的定义 - 根据 ps 的手册页, pcpu
定义为:
进程的 cpu 利用率,格式为“##.#”。它是使用的 CPU 时间除以进程已运行的时间(cputime/realtime 比率),以百分比表示。
换句话说, pcpu
给我该进程的 CPU 利用率百分比 寿命 的过程。
由于我想每 X 秒采集一次样本,因此我只想收集当前时间进程的 CPU 利用率 - 类似于 top
会给我(自上次更新以来该过程的CPU利用率)。
我如何从 shell 脚本中收集这些信息?
解决方案
使用 top -b
(如果您想要不同的输出,还有其他开关)。它只会转储到标准输出,而不是跳入诅咒窗口。
其他提示
我发现的用于在执行 JMeter 等测试时监控服务器的最有用的工具是 数据统计. 。它不仅为您提供来自服务器的一系列统计数据,还输出为 csv 以便轻松导入到电子表格中,并允许您使用用 Python 编写的模块来扩展该工具。
用户负载: top -b -n 2 |grep Cpu |tail -n 1 |awk '{print $2}' |sed 's/.[^.]*$//'
系统负载: top -b -n 2 |grep Cpu |tail -n 1 |awk '{print $3}' |sed 's/.[^.]*$//'
空载: top -b -n 1 |grep Cpu |tail -n 1 |awk '{print $5}' |sed 's/.[^.]*$//'
每个结果都是四舍五入的小数。
我突然想到,我会使用系统状态的 /proc 文件系统视图 - 看看 人5过程 查看 /proc/PID/stat 条目的格式,其中包含总 CPU 使用信息,并使用 /proc/stat 获取全局系统信息。要获取“当前时间”的使用情况,您可能真正的意思是“过去 N 秒内使用的 CPU”;取两个相距较近的样本来查看当前的 CPU 消耗率。然后您可以将这些值转化为有用的东西。事实上,这可能更像是 Perl/Ruby/Python 的工作,而不是纯 shell 脚本。
您也许能够通过 /proc/PID/status 获得您想要的粗略数据,它给出了进程的睡眠平均值。不过数据相当粗糙。
还使用 1 作为迭代计数,因此您将获得当前快照,而无需等待 $delay 时间内获得另一个快照。
top -b -n 1