6轮Jmeter压测对比keep-alive的影响
6轮Jmeter压测对比keep-alive的影响
笔者在项目性能测试中,遇到过一次大数据量查询接口,接口响应时间以毫秒计。
测试人员使用Jmeter进行压测,最初的压测结果是这样的:
Transactions per Second
TPS非常不稳定,即使压3分钟也是上下波动,错误率为11%左右。
Average:425.5ms Max: 3212 ms Min: 208ms 平均TPS:105
失败原因:大部分为响应超时,有的请求没有收到,或调用接口失败。
测试人员和开发人员都非常郁闷,为什么多次压测都是这样波动,压到一定时间(1分多钟)必定波动。刚开始怀疑Jmeter脚本设置问题、怀疑后台程序问题、怀疑网络丢包,都无结果。后来考虑到项目接口是短连接,经过讨论和结合实验数据,定位到Jmeter和server端的keep-alive设置应该是影响最大。
第一次试验:Jmeter设置keep-alive,Server端不设置(默认无此关键字)
第二次试验:Jmeter设置keep-alive,Server端设置为Close
第三次试验:Jmeter不设置keep-alive,Server端不设置(无此字段)
第四次试验:Jmeter不设置keep-alive,Server端设置为Close
第五次试验:验证调用消息队列的后台进程速度的影响,Jmeter不设置keep-alive,Server端设置Close
后台读取消息队列进程的延时设置为每小于100ms的响应人为加100ms延时,发现还有调用接口失败,连接超时。经过几次试验设置为后面的每小于400ms的响应人为加100ms为最佳。
经过以上实验,结合平台的延时设置,得到了最佳实践。
最佳实践:服务进程时延设置每<400ms加100ms,两端都取消keep-alive,100用户并发限制200TPS
总共执行359157次,失败208次,成功率已经超过99.9%。
测试给出的配置结论:
关于Keep-Alive |
第四方案(最差) |
客户端keep-alive,服务器端不设置,是最不稳定的。TPS周期性波动。 |
---|---|---|
第三方案 |
客户端keep-alive,服务器端设置关闭,稳定度排第三。波动比较早。 |
|
第二方案 |
客户端取消keep-alive,服务器端也不设置,比较稳定,TPS平稳。 |
|
第一方案(最佳) |
客户端取消keep-alive,服务器端设置关闭,最稳定,TPS平稳。 |
编者注:
Keep-Alive模式:Connection: Keep-Alive
,这个键值对的作用是让HTTP保持连接状态,因为HTTP协议采用“请求-应答”模式,当使用普通模式,即非 Keep-Alive 模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP 协议为无连接的协议);当使用 Keep-Alive 模式时,Keep-Alive功能使客户端到服务器端的连接持续有效。
在HTTP 1.1版本后,默认都开启Keep-Alive模式,只有加入加入 Connection: close
才关闭连接,当然也可以设置Keep-Alive模式的属性,例如 Keep-Alive: timeout=5, max=100
,表示这个TCP通道可以保持5秒,max=100,表示这个长连接最多接收100次请求就断开。
- 使用apt-get 安装后的mysql 登录问题
- SQL Server 深入解析索引存储(中)
- 1789: [Ahoi2008]Necklace Y型项链
- 3399: [Usaco2009 Mar]Sand Castle城堡
- 遗传算法(1)
- LOJ#6284. 数列分块入门 8
- 3713: [PA2014]Iloczyn
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
- SQL Server 深入解析索引存储(下)
- 2751: [HAOI2012]容易题(easy)
- codevs3002 石子归并 3
- 算法模板——计算几何2(二维凸包——Andrew算法)
- 算法模板——splay区间反转 2
- 算法模板——Dinic网络最大流 2
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- OpenCV与图像处理(八)
- 类模块
- Netty入门篇
- 面试官:谈谈类加载器吧,你有没有看过类加载器的源码?
- 数据维度爆炸怎么办?详解5大常用的特征选择方法
- 给卷积神经网络动动刀:加法网络探究
- 用Python网络爬虫来看看最近电影院都有哪些上映的电影
- 使用 Azure Blob Stoage 实现一个静态文件服务器
- java学习--反射详解
- Redis中的管道Pipeline操作
- 查看YARN任务日志的几种方式
- 简易数字频率计(verilog HDL设计)(2020维护版本)
- C++核心准则CP.111:如果真的需要好双重检查锁,使用惯用模式
- C++核心准则CP.200:使用volatile只能表明该变量是非C++内存
- C++核心准则E.2:通过抛出异常来表明函数无法执行指定的任务