JMeter测试TCP/IP Socket应用的性能

摘要

本文描述了如何利用JMeter来测试TCP/IP Socket应用的性能。文章先对Socket做了一点简单介绍,而后提供并解释了两个样例Socket应用,最后介绍如何利用JMeter来对它们进行测试。javascript

Socket简介

基于TCP/IP协议的Socket(套接字)应用是构成如今互联网的基础,HTTP协议就是创建在端口80上的套接字应用。如今仍是有不少应用直接创建套接字,接受客户端的请求并进行相应的业务处理,那么随着业务量的增长,如何对基于套接字的应用进行性能测试呢?本文将介绍如何利用开源的JMeter对基于TCP/IP协议的套接字应用进行性能测试。css

套接字应用通常至少须要一对套接字,其中一个运行于客户端,称为ClientSocket ,另外一个运行于服务器端,称为ServerSocket 。java

服务器和客户端套接字之间的链接过程分为三个步骤:服务器监听,客户端请求,链接确认。git

  1. 服务器监听:服务器端套接字打开后处于等待链接的状态,等待客户端的链接请求
  2. 客户端请求:指客户端的套接字发出创建链接请求,要链接的目标是服务器端的套接字。客户端的套接字在链接的时候须要指定服务器端套接字的地址和端口号,而后才能发出链接请求
  3. 链接确认:当服务器端套接字接收到客户端套接字的链接请求时,就响应客户端套接字的请求,处理完客户端发出的数据后,返回给客户端处理结果。

服务器端通常经过多线程的方式来接受不一样用户发出的处理请求,所以同时能够接受多个客户端发出的处理请求。套接字应用中客户端和服务器端之间沟通的数据格式根据应用的设计而定,能够是可读的文本格式,也能够是二进制流的格式,对于这两种不一样的格式,JMeter有不一样的处理方式。github

测试基于文本套接字应用

被测应用的源码请参见这里. 若是想运行该程序,请点击该连接下载socket_echo-0.0.1-SNAPSHOT.jar,而且在命令行下执行:算法

java -cp socket_echo-0.0.1-SNAPSHOT.jar net.xmeter.echo.TextServer 

(请确保您的机器上已经安装了Java)。 该程序会在4700端口创建一个ServerSocket,等待来自客户端的请求,客户端若是发送了一个字符串,服务器端返回“Echo: “ + 客户端发送的字符串。以下图所示,若是咱们使用telnet链接到服务器端的套接字应用,双方就能够直接进行通讯了。apache

服务器端:接收到请求并返回客户端“Echo: hello”字符串。服务器

 

 
服务器端控制台运行截屏

 

客户端经过telnet链接到服务器端的4700端口,并输入hello多线程

 

 
客户端控制台运行截屏


使用JMeter对套接字进行测试,有如下的选项能够作控制:socket

  1. TCPClient classname: 缺省的org.apache.jmeter.protocol.tcp.sampler。TCPClientImpl, TCPClient只能实现基于文本格式的套接字应用的测试。随JMeter提供的还有另外的两个实现,分别是BinaryTCPClientImpl和LengthPrefixedBinaryTCPClientImpl,用于处理二进制格式的数据,后文将对这两个作详细的介绍。
  2. ServerName or IP: 套接字服务器应用的地址
  3. Port Number: 套接字服务器应用的端口
  4. Re-use connection: 若是选中,链接会一直处于打开状态,不然读取到数据以后就关闭
  5. Close connection: 若是选中,在TCP Sampler运行完毕以后就会被关闭
  6. SO_LINGER:该配置项用于控制在关闭链接以前是否要等待缓冲区中的数据发送完成。若是SO_LINGER选项指定了值,则在获得关闭链接的请求以后还会等待指定的秒数以完成缓冲区中数据的发送,在指定的SO_LINGER秒数完成后,关闭链接。所以,若是你把该选项设置成0,那么全部链接在收到关闭链接的时候都会当即关闭,避免产生不少处于TIME_WAIT状态的套接字。
  7. End of line(EOL) byte value:判断行结束的byte值,若是你指定的值大于127或者小于-128,则会跳过EOL检测。好比服务器端返回的字符串都是以回车符结尾,那么咱们能够将该选项设置成10。
  8. Connect Timeout:与服务器套接字应用链接超时时间(毫秒)。
  9. Response Timeout:响应超时时间(毫秒),这个值的设置跟End of line(EOL) byte value有关系,若是End of line(EOL) byte value中的值设置不正确,会致使JMeter一直在等待没法结束,可是若是指定了Response Timeout这个值的话,在到达这个值的时候就关闭链接。
  10. Set NoDelay:是否使用Nagle算法,是否须要使用该选项,须要跟实际的业务状况结合。
  11. Text to Send:发送的文本,跟“CSV dataset config”一块儿使用可以从文件中直接读取。
  12. Username和Password:这两个选项在TCP相关的Sampler中都未使用,请忽略这两个选项。

针对咱们的样例应用,咱们的配置以下所示,具体的含义在前面都已经有描述,在这里再也不赘述。若是想增长压力,只需调整ThreadGroup中的数目便可。

 
TCP链接配置截图

测试基于二进制套接字应用

被测应用的源码请参见BinaryServer.java。若是想运行该程序,请点击该连接下载socket_echo-0.0.1-SNAPSHOT.jar,而且在命令行下执行:

java -cp socket_echo-0.0.1-SNAPSHOT.jar net.xmeter.echo.BinaryServer 

该应用场景是服务器端的套接字应用在接受来自客户端发送的物联网数据的请求,并进行解析及处理(处理逻辑就是在控制台上打印客户端发送过来的值)。客户端发送过来的值的格式以下:

byte[0]: 开始界定符,用于标识数据的开始,值为126,十六进制值为7E
byte[1]: 发送的数据条数,若是一次发送了温度、光照强度和湿度3条数据,则该值为3
byte[2]: 数据1的类型,1为温度,2为光照强度,3为湿度
byte[3]: 数据1的值
byte[4]: 数据2的类型,1为温度,2为光照强度,3为湿度
byte[5]: 数据2的值

byte[last]: 校验和

服务器套接字应用在完成处理后,返回给客户端以下格式的值:
byte[0]: 开始界定符,用于标识数据的开始,值为126,十六进制值为7E
byte[1]: 返回码,0为成功,1为失败
byte[3]: 校验和
byte[4]: 回车符做为结束符

JMeter测试脚本中与字符类型相同的在这里就不作解释了,下面描述一下二进制格式测试的不一样点:
1)由于如今须要发送的是二进制的数据,因此在“TCPClient classname” 字段中输入的是 org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl
2)End of line(eol),服务器端返回的是以回车符为结束的,所以这里输入回车符的ascii码值10,若是你的被测应用不是10结尾,请输入别的值
3)Text to send:发送的数据7E0301010214031EC9,7E是开始界定符,03表示这次传输3条数据,第一条数据为温度,值是0x01;第二条数据类型是光照强度,值为0x14;第三条数据为湿度,值为0x1E,C9为校验和

 
二进制TCP链接配置截图

另外针对该Sampler,脚本里还加了一个断言,验证返回的数据是否正确,能够看到对结果的验证指望是7e00ff0a,其中7e是开始界定符,00是返回码,ff是校验和,0a是回车符。

 
返回结果验证截图

 

运行成功的话,在服务器端套接字应用的控制台上能看到下面的信息。

Find the start delimiter at 0. Received data 1 for sensor temperature. Received data 20 for sensor brightness. Received data 30 for sensor humidity. Correct data. Return with correct response code. 

若是读者测试的基于套接字的应用比较复杂,JMeter自己提供的Sampler不能处理,那么可能须要本身扩展TCP Sampler(通常能够经过继承类org.apache.jmeter.protocol.tcp.sampler.TCPClient来实现)。JMeter提供了灵活的插件扩展机制,容许用户实现一些比较个性化的需求。读者能够参见咱们写的这篇文章来了解如何扩展JMeter插件。

相关文章
相关标签/搜索