本文部分理论转自Jmeter官网:https://jmeter-plugins.org/wiki/PerfMon/ ,并结合个人实践编写
一、介绍
在负载测试期间,了解加载服务器的运行状况很重要。如果正确调度了负载,那么看到您是否定位集群也是很好的。为了解决这个问题,插件包现在支持服务器监控!使用它,您可以 在几乎所有平台上监视CPU,内存,交换,磁盘I / O和网络I / O!
某些指标允许指定特定对象进行监视,您可以指定 选择器参数来仅监视此对象的值:
- 名称,pid和ptql选择器进程
- 核心选择器,用于监视多核系统的特定CPU
- 文件系统的fs选择器
- iface选择器用于网络接口
示例度量参数字符串:
### CPU ###
组合 - 测量总CPU使用量,等于100个空闲值
core = 2:用户测量用户进程系统中第三个核心的CPU使用率(核心编号从0开始)
name = java#2:用户- 将监视用户时间的第二个Java流程实例
pid = 14523:percent - 将使用PID 14523监视进程总CPU使用率百分比
name = httpd - 省略度量类型将使用默认'percent'
###磁盘IO ###
fs = / home:writes - 将监视/ home文件系统的写操作数
###网络IO ###
iface = eth0:tx - 将监视接口eth0的传输包速率
这是插件的外观。它显示负载测试中涉及的4台服务器的CPU使用情况:
二、收集指标
从版本0.5.0起,服务器代理工具支持收集超过75个系统度量。 查看完整列表。
1、(CPU指标)CPU Metrics
(汇总)Total
Primary
- combined
- idle
- system
- user
- iowait
Additional
- irq
- nice
- softirq
- stolen
(每个线程)Per Process
- percent
- total
- system
- user
2、(内存指标)Memory Metrics
Total
(主)Primary
- usedperc - relative memory usage in percents
- freeperc
- used
- free
(次)Additional
- actualfree*
- actualused实际使用
- ram随机存储器
- total
Per Process
Primary
- resident
- virtual
- shared
Additional
- pagefaults
- majorfaults
- minorfaults
3、(磁盘I / O指标)Disk I/O Metrics
Primary
- queue
- reads
- writes
- readbytes
- writebytes
Additional
- available
- service
- files
- free
- freefiles
- total
- useperc
- used
4、(网络I/O指标)Network I/O Metrics
Primary
- bytesrecv
- bytessent
- rx
- tx
Additional
- used
- speed
- rxdrops
- rxerr
- rxframe
- rxoverruns
- txcarrier
- txcollisions
- txdrops
- txerr
- txoverruns
5、JMX Metrics
由于版本0.5.2 Server Agent具有监视 Java虚拟机内部的一些JMX值的功能。要启用JMX监控与一些特殊的属性中启用,像描述的则必须启动Java 这里。这里使用JMX启动时,最简单(而不是安全)选项启动Java:
java -Dcom.sun.management.jmxremote.port=4711 -Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.ssl=false
默认情况下,服务器代理将尝试使用端口4711连接到localhost的JMX服务器。如果您在不同的主机/端口启动JMX服务器或使用用户名/密码进行身份验证,请使用以下附加参数:
- url=<hostname>\:<port>
- user=<username>
- password=<password>
Available JMX metric types:
- gc-time - 时间花费在垃圾回收中,毫秒 milliseconds (used method)
- memory-usage - heap memory used by VM, bytes (method used)内存使用 - VM使用的堆内存,字节
- memory-committed - heap memory committed by VM, bytes (method used)内存提交 - 由VM提交的堆内存,字节
- memorypool-usage - heap memory pool usage, bytes (method used)memorypool使用 - 堆内存池使用,字节
- memorypool-committed - heap memory pool committed size, bytes (method used)memorypool-committed - 堆内存池承诺大小,字节
- class-count - loaded class count in VM (used method)VM中的计数加载类计数
- compile-time - time spent in compilation, milliseconds (used method)编译时花费在编译时间,毫秒
例子:
gc-time - monitor GC time at localhost:4711 在本地主机上监视GC时间
memory-usage:url=somehost.com\:4715 - use alternative hostname/password 使用备用主机名/密码
class-count:url=somehost.com\:4715:user=apc:password=SecurityPlease123 - some secure setup access 一些安全的安全访问
6、(TCP指标)TCP Metrics
TCP指标表示TCP套接字状态统计信息(如打开的端口)。
(主)Primary
- estab - established connections建立连接
- time_wait时间的等待
- close_wait关闭等待
(次)Additional
- bound 界
- close 关
- closing 关闭
- fin_wait1
- fin_wait2
- idle 空闲
- inbound 入站
- last_ack 最后一次回答
- listen 侦听
- outbound 出站
- syn_recv
7、(交换指标)Swap Metrics
- used
- pagein
- pageout
- free
- total
8、(自定义指标)Custom Metrics
如果您在上述列表中找不到适当的指标,您可以设置采用自定义指标收集任何值
8.1(执行)EXEC
此度量类型将参数字符串解释为要启动的进程路径和要传递给进程的参数。参数用冒号(不是空格)分隔,参见下面的例子。该过程必须打印到包含单数字度量值的标准输出单行。
在大多数情况下,您需要启动系统解释器(cmd.exe,/ bin / sh)以运行复杂的参数化调用序列。
示例1:监视Linux 缓存的内存大小(以默认度量标准通过SIGAR lib不可用),使用免费实用程序输出:
/bin/sh:-c:free | grep Mem | awk '{print $7}'
示例2:监视MySQL select查询计数:
/bin/sh:-c:echo "show global status like 'Com_select'" | mysql -u root | awk ' $1 =="Com_select" {print $2}'
8.2(尾)TAIL
收集cutom度量的另一种方法是读取文件末尾的行。尾部类型的度量参数是要读取的文件的路径。添加到文件的行必须包含单个数字度量。例:
123
342
333
297
三、怎么运行的
1、概念
除了Tomcat之外,JMeter无法通过默认服务器指标进行检索。为了克服这种情况,我们开发了一个服务器代理,它将获得JMeter的性能数据。代理使用SIGAR开源库。它由Java公共部分和每个操作系统的本机库组成。
2、安装
服务器代理工具详细描述放在这里。
其余插件需通过jmeter管理插件安装或单独寻找。本次实例部分通过jmeter管理插件下载,部分通过官网
本地Windows
这里需要6个jar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
D:\apache-jmeter-3.2\lib\ext下放4个jar: JMeterPlugins-Standard.jar JMeterPlugins-Extras.jar jmeter-plugins-perfmon-2.1.jar jmeter-plugins-manager-0.12.jar D:\apache-jmeter-3.2\lib下放2个jar: perfmon-2.2.2.jar jmeter-plugins-cmn-jmeter-0.5.jar |
2.1、访问https://jmeter-plugins.org/downloads/old/ 下载红色框的zip:JMeterPlugins-Standard-1.4.0.zip 和JMeterPlugins-Extras-1.4.0.zip
2.2、(1)解压JMeterPlugins-Standard-1.4.0.zip到D:\谷歌下载目录\JMeterPlugins-Standard-1.4.0,并把解压后的文件D:\谷歌下载目录\JMeterPlugins-Standard-1.4.0\lib\ext\JMeterPlugins-Standard.jar 复制黏贴到D:\apache-jmeter-3.2\lib\ext,注意是lib\ext下,不能放在lib
(2)解压JMeterPlugins-Extras-1.4.0.zip到D:\谷歌下载目录\JMeterPlugins-Extras-1.4.0,并把解压后的文件D:\谷歌下载目录\JMeterPlugins-Extras-1.4.0\lib\ext\JMeterPlugins-Extras.jar 复制黏贴到D:\apache-jmeter-3.2\lib\ext,注意是lib\ext下,不能放在lib
2.3、打开jmeter>选项>Plugins Manager(has upgrads),在弹框TAB Available Plugins找到PerfMon (Servers Performance Monitoring),在左侧选择框打钩,点击【Apply Changes and Restart Jmeter】。--安装插件部分过于简单,不截图
安装完毕后,在jmeter>选项>Plugins Manager(has upgrads)>Installed Plugins看到对应插件
此时,在D:\apache-jmeter-3.2\lib\ext看到以下jar,走到这里,踩了坑,单独通过jmeter管理插件安装插件Perfmon,漏了2个jar
2.4、安装插件Perfmon,漏了2个jar。需自己去maven找到对应的jar,
(1)perfmon-2.2.2.jar 在http://www.mvnrepository.com/artifact/kg.apc/perfmon/2.2.2下载
(2)jmeter-plugins-cmn-jmeter-0.5.jar 在http://www.mvnrepository.com/artifact/kg.apc/jmeter-plugins-cmn-jmeter/0.5下载
2.5、下载perfmon-2.2.2.jar和jmeter-plugins-cmn-jmeter-0.5.jar后,放到D:\apache-jmeter-3.2\lib下
2.6、完成所有jar下载和复制到对应路径后,重启jmeter,重启完毕后r,访问添加>监听器>jg@gc - PerfMon Metrics Collector,即为成功安装插件
2.7、当需用jg@gc - PerfMon Metrics Collector来监控Linux服务时,打开bin/Jmeter.properties 修改 jmeter.save.saveservice.thread_counts=true
2.8、服务器:ServerAgent-2.2.1.zip, 3.51 MB, 2013年7月12日,下载次数:1178 性能监视器代理安装在目标服务器上。ServerAgent下载地址:https://jmeter-plugins.org/wiki/PerfMonAgent/
不需要任何root / admin权限。通过远程FTP工具,复制到服务器上某处将ServerAgent-XXXzip解压缩。然后使用Unix上的startAgent.sh脚本或Windows 上的startAgent.bat脚本启动代理。--注:本例子是放到Linux服务器,只需sh startAgent.sh
本次截图使用Linux,此为解压的图
linux启动代理,若直接使用默认端口,如下图执行命令即可
[root@dev-dc ~]# cd /jmeter
[root@dev-dc jmeter]# ls
ServerAgent-2.2.1
[root@dev-dc jmeter]# cd ServerAgent-2.2.1/
[root@dev-dc ServerAgent-2.2.1]# ls
CMDRunner.jar lib LICENSE ServerAgent.jar startAgent.bat startAgent.sh
[root@dev-dc ServerAgent-2.2.1]# chmod a+x startAgent.sh
[root@dev-dc ServerAgent-2.2.1]# ps -ef|grep ServerAgent
root 6656 6551 0 08:53 pts/0 00:00:00 grep ServerAgent
[root@dev-dc ServerAgent-2.2.1]# netstat -anp | grep 4444
[root@dev-dc ServerAgent-2.2.1]# ./startAgent.sh
INFO 2017-11-17 08:55:22.081 [kg.apc.p] (): Binding UDP to 4444
INFO 2017-11-17 08:55:23.080 [kg.apc.p] (): Binding TCP to 4444
INFO 2017-11-17 08:55:23.104 [kg.apc.p] (): JP@GC Agent v2.2.0 started
截图
如若不采用默认端口,先检查4445端口有没占用,netstat -anp | grep 4445,若无,使用命令定义4445端口:sh startAgent.sh --udp-port 4445 --tcp-port 4445
代理程序是用Java编写的,所以需要JRE 1.4+来运行它。请注意可以创建自己的代理程序包,其中包含自己的JRE,因此不必在服务器上安装Java(我们在Windows平台上进行了测试)。为此,只需在代理文件夹中创建一个JRE文件夹,然后复制一个安装的JRE。将.bat文件中的java命令更改为java可执行文件的路径,它将工作。
代理运行后,您可以使用PerfMon Metrics Collector Listener连接代理。可以添加多个服务器进行监控,一个图形可以显示多种指标(cpu,内存等),自动缩放行以便查看。
2.9客户端配置,
2.10客户端执行后,看结果
服务端:
客户端:
2.11关闭服务器代理服务器,停止:>> sh startAgent.sh --udp-port 0 --auto-shutdown 若不行,直接Ctrl+C
代理关闭后,若客户端Jmeter再执行时,模块jp@gc - PerfMon Metrics Collector会报错(执行时检查服务器有没正常开启代理)
2.12补充一下linux某些建议(可不看)
要启动代理,只需运行startAgent bat / sh文件即可。它将打开JMeter将连接并查询指标的UDP / TCP服务器端口。一些信息将打印到标准输出,通知您收集指标的问题(使用--loglevel参数调整的记录详细程度)。
可将侦听端口指定为参数(0禁用侦听),默认值为4444:
$ ./startAgent.sh --udp-port 0 --tcp-port 3450
INFO 2011-11-25 19:02:14.315 [kg.apc.p]():将TCP绑定到3450
启动代理程序后,可以使用--auto-shutdown选项,以便在测试完成后自动停止。建议仅使用TCP连接使用此功能:
$ undera @ undera-HP:/ tmp / serverAgent $ ./startAgent.sh --udp-port 0 - 自动关机
INFO 2011-11-25 19:48:59.321 [kg.apc.p]():当所有客户端断开连接时,代理将关闭
INFO 2011-11-25 19:48:59.424 [kg.apc.p]():将TCP绑定到4444
可以使用--sysinfo选项查看可用的系统对象:
$ ./startAgent.sh --sysinfo
INFO 2011-11-25 19:51:25.517 [kg.apc.p]():***记录可用进程***
INFO 2011-11-25 19:51:25.542 [kg.apc.p]():进程:pid = 24244 name = bash args = -bash
INFO 2011-11-25 19:51:25.543 [kg.apc.p]():进程:pid = 25086 name = dash args = / bin / sh ./startAgent.sh --sysinfo
INFO 2011-11-25 19:51:25.543 [kg.apc.p]():进程:pid = 25088 name = java args = java -jar ./CMDRunner.jar --tool PerfMonAgent --sysinfo
INFO 2011-11-25 19:51:25.549 [kg.apc.p]():***记录可用的文件系统***
INFO 2011-11-25 19:51:25.551 [kg.apc.p]():文件系统:fs = / dev type = devtmpfs
INFO 2011-11-25 19:51:25.551 [kg.apc.p]():文件系统:fs = / type = ext4
INFO 2011-11-25 19:51:25.551 [kg.apc.p]():文件系统:fs = / var / run type = tmpfs
INFO 2011-11-25 19:51:25.551 [kg.apc.p]():文件系统:fs = / home type = ext4
INFO 2011-11-25 19:51:25.552 [kg.apc.p]():文件系统:fs = / var / lock type = tmpfs
INFO 2011-11-25 19:51:25.552 [kg.apc.p]():文件系统:fs = / proc type = proc
INFO 2011-11-25 19:51:25.553 [kg.apc.p]():***记录可用的网络接口***
INFO 2011-11-25 19:51:25.554 [kg.apc.p]():网络接口:iface = lo addr = 127.0.0.1 type =本地环回
INFO 2011-11-25 19:51:25.554 [kg.apc.p]():网络接口:iface = eth0 addr = 192.168.0.1 type =以太网
INFO 2011-11-25 19:51:25.555 [kg.apc.p]():***完成日志sysinfo ***
INFO 2011-11-25 19:51:25.555 [kg.apc.p]():将UDP绑定到4444
INFO 2011-11-25 19:51:26.560 [kg.apc.p]():将TCP绑定到4444
所述--interval <秒>参数可以用来改变指标收集频率。
2.13使用服务器代理与其他应用程序
服务器代理使用简单的明文协议,任何人都可以使用代理实现客户端的功能,基于kg.apc.perfmon.client.Transport接口。如果有任何人有兴趣,请在支持论坛上开始讲话,我将介绍如何将第三方客户端应用连接到代理。
erverAgent具有简单的文本协议,可以在UDP和TCP传输上工作。大多数情况下都会使用TCP。
要与代理商进行第一次交谈,请在本地开始。然后使用telnet实用程序连接到它:
user @ ubuntu:〜$ telnet localhost 4444
Trying 127.0.0.1 ...
Connected to localhost.
Escape character is '^]'.
如果连接成功,您应该在ServerAgent控制台日志中看到“接受新的TCP连接”消息。键入“test”,然后在telnet聊天中按Enter键,服务器应该用简短的“Yep”回答:
test
Yes
键入“exit”:
exit
Connection closed by foreign host.--外部主机关闭连接。
发送命令行,服务器应答。命令行由命令组成,有时包含参数。参数与冒号的命令分开。
命令:
- exit - 终止当前客户端会话,并关闭与代理的连接,无参数
- test - 测试服务器是否活着,没有参数
- shutdown - 终止所有客户端连接和关闭代理进程,无参数
- interval-“metrics”命令中使用的间隔 - 更改度量报告间隔,单个参数是以秒为单位的整数值。间隔可以在指标报告中间更改。示例:interval:5
- metrics - 启动自动指标收集,参数是要收集的指标列表,如下所述。示例:metrics:cpu
- metrics-single-cell 单个度量收集迭代。示例:metrics-single:memory
四、JMeter属性
- jmeterPlugin.perfmon.interval - 以毫秒为单位的度量采集间隔
- jmeterPlugin.perfmon.useUDP - true / false,启用UDP连接后尝试尝试连接失败的TCP连接
- jmeterPlugin.perfmon.label.useHostname - true / false,启用“短”主机名,默认模式是([\ w \ - ] +)\ .. *
- jmeterPlugin.perfmon.label.useHostname.pattern - 字符串(转义),提取主机名的正则表达式(第一组匹配)
- 例如默认模式将是:jmeterPlugin.perfmon.label.useHostname.pattern =([\ w \ - ] +)\ .. *
- 例如EC2的模式us-east / west子域匹配:jmeterPlugin.perfmon.label.useHostname.pattern =([\ w \ - ] + \。us-(east | west) - [0-9])*
- forcePerfmonFile - true / false,使其能够使JMeter在当前目录中使用perfmon度量写入JTL文件