Jmeter TCP协议性能测试

three.js 自制骨骼动画(二)

最近有在做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 目录下

Qt 之 Graphics View Framework 简介

  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:\Users\Administrator\Desktop\apache-jmeter-5.1.1,如下所示:

    

 

 

     

 

    此时,再次运行 NewDriver,就可以正常启动 jmeter 界面了!!

   8、此时我们搜索TCPSample ,ctrl+n :

    

 

     点击进入这个java文件,搜索ReadException:

    

 

     修改红色框内容,至于为什么要设置为null,可以点进方法中自己看,在这就不过多说了。

  9、最后执行build:

    

 

    此时会多出一个文件夹,我们进入到文件夹中,找到编译好的TCPSampler.class文件

    

 

     并复制出来

  10、进入Jmeter\lib\ext的目录下,找到ApacheJMeter_tcp.jar 这个jar包,以压缩包形式打开,并找到TCPSampler.class文件,将我们修改过的class文件拖入并替换,这样大功告成,不会因为EOL没有匹配到连接就会断开,也不会置为500状态。

 

好了今天就先讲这么多,以后有时间再给大家分享

 

Jmeter TCP协议性能测试
免责声明:非本网注明原创的信息,皆为程序自动获取互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件12小时内删除。

为什么 2020 还要学 Node.js