最近有在做tcp协议性能测试,总结一下遇到的坑吧。
首先呢,我这边用的是16进制的报文:
(1)TCPClient classname:org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl
TCPClient classname 该参数一般有三个值设置:
- org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl(以文本编辑器中的纯文本作为内容发送)
- org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl(以文本编辑器中所编辑的16进制字符(hex)内容为基础转换为二进制的字节内容进行发送)
- org.apache.jmeter.protocol.tcp.sampler.LengthPrefixedBinaryTCPClientImpl(在BinaryTCPClientImpl基础上默认以发送内容的长度以字节前缀进行填充)
(2)服务器IP和端口号:输入要压测的地址和端口即可
(3)超时:
单位毫秒,0 表示禁用超时
(4)Re-use connection:如果选中,这个链接处于保持打开状态,不选中就是读取数据后就关闭。
如果我们做TCP协议的性能测试,一个tcp连接肯定是要保持的,所以这里需要勾选
Close connection:如果选中,这个连接将在取样器运行结束后关闭
SO_LINGER:enable/disable(启用/禁用)SO_LINGER设置特定的值,单位为秒,它线性创建套接字,如果你是设置的值为0,你可以避免大量套接字处于TIME_WAIT (等待状态)
EOL:匹配响应报文最后一个字节,如果响应报文为16进制是最后两个字符,比如,在我的项目中返回值转为16进制的时候如下:
7e80010005013819415186010103e7020000d47e
那么最后一个字节 (8位)应该是 7e 换算为10进制后为126
那么在eol处设置为126 ReadException: 异常消除
下面说一下遇到的一些坑:
(1)在做TCP协议的性能测试时,尽量不要使用setup线程组和teardown线程组,因为我们要保持长连接,如果在setup线程组中我们发送了登入报文,在线程组中进行TCP其他报文的发送并循环的话,Jmeter不会认为这两个线程组是使用的同一个线程,导致在线程组中发送报文时会重新发起一个连接,而此时我们没有登入,导致场景错误,teardown也是如此。可以通过仅一次控制器解决这个问题
(2)行尾EOL匹配:在Jmeter处理机制中,当EOL匹配不到或者匹配值错误会认为这个连接失败,即使你勾选了re-use connection,也关闭这个TCP连接,但是在实际的应用场景中,很多报文上报之后是没有应答的,或者应答的内容是随机的(为了安全考虑),那么这个时候只能对Jmeter的TCP取样器进行二次开发,改变他的内部逻辑,让他的EOL如果无法匹配到也不会将我们的请求状态置为500,从而被关闭TCP连接。下面一步一步讲如何实现我们的需求
1、首先我们到Jmeter官网下载源码版本 https://archive.apache.org/dist/jmeter/source/ 下载source版本的zip格式,博主这边是Jmeter5.1.1,解压到本地目录
2、修改目录,这一步一定要做,不然无法导入,
进入解压后的目录,会看到两个文件:eclipse.classpath和eclipse.projecte,分别修改为 .classpath 和 .projecte
;
在 windows 下不能直接修改,要使用 cmd 命令行;
打开 cmd 命令行窗口,进入解压的源码目录下,执行如下命令:
ren .eclipse.classpath .classpath
ren .eclipse.project .project
3、导入IDEA
点击File -> New -> Project from Existing Sources,选择Jmeter源码目录
选择按 eclipse 项目导入,如下所示:
其他全部默认,一直Next即可
4、ANT, 如果电脑没有ANT,可以去下载一个,然后配置下环境变量即可
在窗口右侧 Ant Build
中,点击 + ,选择源码目录下的 build.xml,会把所有相关信息展示在右侧列表中,
双击列表中的 download_jars
,会自动下载所有缺失 jar 包,到 jmeter 源码目录的 lib 目录下
5、更新项目依赖的jar包
在首次导入项目时,会自动在 dependency 下添加依赖 jar 包,但都是缺失状态,当我们用 Ant 下载好 jar 包后,IDEA 并不会自动更新,必须要手动更新。
在项目上右键打开 Open Module Settings
,在项目 src 下点击 protocol 文件夹,再点击上方 Sources 按钮,点击 Apply。
点击 Dependencies,删除所有报错的 jar 包;
重新添加新下载的 jar 包:右侧 + ,选择 JARs or directories,依次选择源码目录下的 lib 目录和 lib 下的几个目录,最后 Apply :
6、ANT install
重新添加 jar 包后,必须执行 Ant install。
7、设置运行的VM options
JMeter 的启动类是 NewDriver,可以先找到这个类,尝试运行一下,肯定会报错找不到路径。
因为 jmeter 启动类中默认是去找的 parent 目录,所以报找不到路径,需要手动配置一下 jmeter 运行时的 home 路径,在 VM options 中配置。
在 VM options 填入 -Djmeter.home=C:UsersAdministratorDesktopapache-jmeter-5.1.1,如下所示:
此时,再次运行 NewDriver,就可以正常启动 jmeter 界面了!!
8、此时我们搜索TCPSample ,ctrl+n :
点击进入这个java文件,搜索ReadException:
修改红色框内容,至于为什么要设置为null,可以点进方法中自己看,在这就不过多说了。
9、最后执行build:
此时会多出一个文件夹,我们进入到文件夹中,找到编译好的TCPSampler.class文件
并复制出来
10、进入Jmeterlibext的目录下,找到ApacheJMeter_tcp.jar 这个jar包,以压缩包形式打开,并找到TCPSampler.class文件,将我们修改过的class文件拖入并替换,这样大功告成,不会因为EOL没有匹配到连接就会断开,也不会置为500状态。
好了今天就先讲这么多,以后有时间再给大家分享