8

我正在针对 Java 进程运行一些JMeter测试,以确定 Web 应用程序在负载下的响应速度(500 多个用户)。JMeter 将给出每个 Web 请求的响应时间,并且我编写了一个脚本来每 X 秒 ping 一次 Tomcat 管理器,这将获得 JVM 堆的当前大小。

我想在服务器上收集 Tomcat 使用的 CPU 百分比的统计信息。我尝试使用ps这样的 shell 脚本来执行此操作:

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 脚本中收集它?

4

6 回答 6

13

使用top -b(和其他开关,如果你想要不同的输出)。它只会转储到标准输出而不是跳入诅咒窗口。

于 2008-09-08T18:21:06.027 回答
6

我发现在服务器上执行 JMeter 之类的测试时监控服务器的最有用的工具是dstat。它不仅为您提供来自服务器的一系列统计信息,它还输出到 csv 以便轻松导入电子表格,并允许您使用 Python 编写的模块扩展该工具。

于 2008-09-08T21:08:34.283 回答
4

用户负载: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/.[^.]*$//'

每个结果都是一个小数点。

于 2013-03-14T21:44:40.097 回答
2

在我的脑海中,我将使用系统状态的 /proc 文件系统视图 - 查看man 5 proc以查看 /proc/PID/stat 条目的格式,其中包含总 CPU 使用信息,并使用/proc/stat 获取全局系统信息。要获取“当前时间”使用情况,您可能真的是指“最近 N 秒内使用的 CPU”;取两个相距不远的样本,以查看当前的 CPU 消耗率。然后,您可以将这些值转换为有用的东西。但实际上,这可能更像是一个 Perl/Ruby/Python 工作,而不是一个纯 shell 脚本。

您可能能够使用 /proc/PID/status 获得您所追求的粗略数据,它会为进程提供睡眠平均值。虽然数据很粗略。

于 2008-09-08T18:28:36.757 回答
0

也使用 1 作为迭代计数,因此您将获得当前快照,而无需等待在 $delay 时间内获得另一个快照。

top -b -n 1
于 2013-01-25T11:08:26.793 回答
0

这不会为您提供每个进程的指标,但压力终端 UI对于了解您对盒子的惩罚程度非常有用。添加-c标志以使其将数据转储到 CSV 文件。

在此处输入图像描述

于 2021-01-28T13:19:18.337 回答