这里只描述简单的tcp测试建立步骤,因为目前支持的测试类型很多,无法一一陈述,功能细节部分可以参考JMeter文档
1)创建测试线程组
2)根据需要设定线程组参数
3)建立TCP采样
3)配置TCP采样参数
基本上一个简单的测试计划就完成了,点击运行采样,就会将文本发送出去。
2.高级功能配置
1)配置结果查看监听器
有时候需要查看线程组执行结果情况,这个可以通过设定采样结果查看
针对上面配置的线程组应该执行6次,也就是发送6条消息,通过监控器可以看到的确有6个采样结果,说明执行成功
2)配置变量
有时候需要在报文中加上一些变化的内容,可以通过在文本中增加变量设定来实现
如增加一个变量名 bank, 其值为 1111,在前面发送的报文中加上${bank}即可引用,如
执行之后就可以在监控器中看到报文中有1111了
3)配置TCP 二进制报文
大多数情况下,报文可能非纯文本形式,常常都是不可读的二进制,所以这种情况下需要配置二进制报文。当前JMeter支持HEX形式,也就是16进制的报文输入配置
参考: https://wiki.apache.org/jmeter/UserManual/Reference/TcpSampler
当前支持三种格式 1.TCPClientImpl(默认) 2.BinaryTCPClientImpl 3.LengthPrefixedBinaryTCPClientImpl
使用二进制方式需要做如下几件事:
a.把普通文本报文翻译成HEX格式,可以找文本编辑器做这件事。比如notepad++,打开文本文件
Ctrl+A全选内容,paste到一个新文件,替换掉所有空格
3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e3c544c533e3c707273636f64653e6c6f67696e3c2f707273636f64653e3c69643e313233343536373c2f69643e3c746f6b656e3e75736a64666a6b736137356b733833326f6b7564736a643934383737616b6a6475613c2f746f6b656e3e3c2f544c533e
如果报文还需要加上头的话,需要额外计算一下。比如增加一个command id和报文长度。比如上文中文本长度在编辑器状态栏上显示155长,假定command id是1.
System.out.println("155 hex " + Integer.toHexString(155)) --- 9b
System.out.println("1 hex " + Integer.toHexString(1)) ---1
如果command id是4个字节那么16进制字符串就是 00 00 00 01
如果length也是4个字节那么16进制字符串就是 00 00 00 9b
去掉空格加入到前面报文中就拼成如下新报文
000000010000009b3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e3c544c533e3c707273636f64653e6c6f67696e3c2f707273636f64653e3c69643e313233343536373c2f69643e3c746f6b656e3e75736a64666a6b736137356b733833326f6b7564736a643934383737616b6a6475613c2f746f6b656e3e3c2f544c533e
再把新报文放入发送字符串输入框中。
b.修改JMeter启动配置,就是前文提到的指定BinaryTCPClientImpl适配
在jmeter.properties文件中找到如下部分,修改一下
#---------------------------------------------------------------------------
# TCP Sampler configuration
#---------------------------------------------------------------------------
# The default handler class
#tcp.handler=TCPClientImpl
tcp.handler=BinaryTCPClientImpl
重新执行TCP测试,可以看到服务器端正常收到报文,如图
jmeter测试TCP服务器,使用TCP采样器模拟发送TCP请求。
TCP采样器:打开一个到指定服务器的TCP / IP连接,然后发送指定文本并等待响应。
jmeter模拟发送TCP请求的方法:
1.新建线程组,然后在线程组中新建TCP采样器
TCP采样器中填写服务器地址、端口和“要发送的文本”,其它选项根据需要选填:
re_use connection表示重复发送连接请求
close connection 关闭连接
如果TCP请求需要用户名/密码,可以在登录配置中填写
2.新建“察看结果树”监视器,查看发送的请求和响应的结果。如果需要发送16进制报文这个地方会失败。
jmeter发送16进制TCP报文的方法:
很多TCP服务器报文为16进制,并且多数不能转换成文本发送,而jmeter默认发送文本。
jmeter.properties中修改tcp.handler=BinaryTCPClientImpl ,启动jmeter重新发送,抓包查看既是16进制的tcp报文。
另一个方法:可以在工作台新建–非测试元件–Property Display,Property Display中修改jmeter.properties只对当前进程有效。
一开始我无法理解,单机怎么可能实现百万并发连接,因为系统可用端口数只有:65535 - 1024 = 64511,每个TCP连接需要占用一个独立的端口,那最多也只能做到6W多并发连接。然而我忽视了一个很基本的问题,端口号在同一个IP下不能重复,但我们可以给一个网卡绑定多个IP地址,如果单机要主动发起100万并发连接,我们最少需要使用17个IP地址。
TCP服务器监听在指定端口接收客户端连接后,创建一个新的socket用于同客户端进行读写数据,但该socket并不需要也不会绑定一个新的端口,所以对于TCP服务器来说,不存在端口不够用的情况,TCP服务器能够保持多少个并发连接取决于服务器性能、内存大小、带宽大小以及服务器端设置(例如:进程能打开的文件数等)。以100W连接数为例,所需要总内存大小大约为:1,000,000 20K = 20G, 广播一个1KB的消息需要占用的带宽:1,000,000 1K = 1000M,所需打开文件描述符1,000,000个。
对于TCP服务器连接数压力测试来说,瓶颈在客户端,因为每个客户端要连接到TCP服务端需要使用一个本地端口,而对于一个IP地址来说,端口范围就是:0-65536,其中还要一些端口被系统或其他程序使用。所以从一台主机单个IP上发起同TCP服务器的连接数理论最大值为65535,当然我们可以给该主机绑定N个IP地址,同时从多个IP发起连接,所以理论上客户端可以发起的连接数为:IP数*65535,这时客户端的CPU、内存和带宽以及文件句柄资源就是限制。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)