作为测试界的老司机,最近接到一项任务需要写新的性能测试代码。由于之前的测试代码风格和自己习惯的编码风格差别实在太大,因此放弃了模仿原来的测试代码继续添加测试用例的想法,自己从头开始写了一些测试代码。

结果,进行测试过程中居然出现了问题,问题,问题……

问题发现

在用自己新写的测试代码测试一个文件下载接口的时候,发现了一个奇怪的现象,在并发比较小的情况下(50并发),TPS、响应时间什么的一切看起来都很正常。但是当并发加到100+时,TPS曲线就变得很神奇了,同时还有部分请求失败,测试结果如图1所示:

图 1 并发100+性能测试结果

被测系统的架构相对简单,业务服务前端搭个Nginx,客户端请求都是把请求发送到Nginx,然后通过Nginx转发到业务服务器。 测试环境架构如图2所示,被测服务为图2中的NefsProxy:

图 2 测试环境架构图
原因查找 通过查看测试脚本的日志发现,所有的错误都是由于建立连接失败引起的,登录到Nginx所在服务器上使用netstat命令查看连接数,发现测试过程中连接数很高,高的时候能达到3000—4000。为了确认上述问题是否是由于测试脚本有问题而引起的,我马上用老的测试脚本跑了一轮测试。结果很明显,老的测试脚本跑的测试结果一切正常,TPS也比新脚本的结果高不少,并且没有失败。因此可以断定是测试脚本的问题。

接下来就要寻找原因了:

→首先怀疑是不是测试脚本在每个请求结束后没有释放连接。问题的现象是连接数高导致新连接被Nginx拒绝。但是review了代码后,发现每次请求结束后都调用了:

因此,应该不是测试客户端没有主动释放连接引起的。

→后来想起Nginx配置了将请求强制转换为长连接。

Nginx的配置如下:

问题好像有点头绪了。一般配置长连接是为了提高服务端性能,为什么在我的测试中反而起到了反作用呢?

→接下来就要回过头来好好看看自己测试代码的实现逻辑了。

其中,NosObjectOperation.getObject是java代码实现的,每次getObject方法被调用时,会new一个HttpClient对象,然后通过HttpClient发送Http请求。

到这里,问题的本质慢慢浮出水面:客户端每发送一次请求,都会new一个HttpClient,并与Nginx新建一个连接,而Nginx这边又设置了强制长连接,每个Worker的最大空闲连接数为1024(keepalive 1024)。同时,测试环境的Nginx配置了4个Worker。因此,Nginx最多会保持4096个空闲连接。所以,由于连接数过多,在空闲连接被释放前,新的连接可能就会被拒绝。

问题解决

既然问题的原因找到了,该怎么修改测试脚本呢?

当然最简单的就是每个请求处理结束后强制将连接关闭。这样虽然能解决连接数多的问题,但是也同时间接的让Nginx强制长连接的配置失效了,达不到长连接提升性能的目的。

因此,我采用了这样的解决方法:尽量模拟真实的用户场景,每个测试线程使用一个HttpClient对象(也就是在python脚本的__init__方法里new一个HttpClient对象,getObject测试方法都调用这个对象发送Http请求,同时java方法nosObjectOperation.getObject也不再每次自己创建新的HttpClient对象,而使用传入的在Python脚本方法__init__中创建的HttpClient对象):

Attention:使用grinder进行性能测试时,每次创建测试线程时会调用__init__方法,也就是说有多少个并发线程,就会被调用多少次。通过这样的修改,如果测试时是100个并发线程,那测试客户端和Nginx之间就只会有100个ESTABLISHED的连接。

问题解决了,用新的脚本跑一次测试,结果如图3所示,很让人满意:

图 3 修改测试脚本后并发100+性能测试结果
注意,总结!总结!总结!

1)做性能测试,测试脚本的编写也是一个很重要的环节,只有模拟真实用户使用情况的脚本才能跑出真实的、有参考意义的性能测试结果。

2)当性能测试结果与预期不一致时,定位问题时首先要看测试脚本是否有问题,并对测试环境的各项配置(Nginx、Tomcat等)进行梳理。

3)当使用grinder测试框架进行比较复杂的性能测试,编写测试脚本时要弄清楚grinder测试框架的运行机理,各项配置的作用等。

浅谈HTTP接口性能测试脚本的编写相关推荐

  1. 性能测试脚本的编写和调试_编写自动调试器以在测试执行期间捕获异常

    性能测试脚本的编写和调试 以前,我曾说过, 您总是想保留一些调试器断点作为例外 . 这有助于防止代码在不注意的情况下腐烂掉,有时掩盖了另一个问题. 如果您认真对待这一点,那么最好将此想法扩展到自动化测 ...

  2. 性能测试脚本的编写和调试

    原文链接 性能测试脚本的编写和调试 传学 2017-05-11 10:17:32 浏览86 评论0 发表于: 阿里云服务 >> 最佳实践 性能 测试 性能测试 压力测试 压测 摘要: 性能 ...

  3. 浅谈---设计接口测试用例

    设计一个好的接口测试用例,能够在执行时更好的发现缺陷,接下来就整理一份我自己对接口测试用例编写的一些思路 我们在测试没有关联的接口,即单一的接口,要对它的正例设计以及反例设计,当存在多种条件下的正例时 ...

  4. java comparable接口_浅谈程序接口

    · 为什么需要接口?接口和抽象类的区别? 接口就是比"抽象类"还"抽象"的"抽象类",可以更加规范的对子类进行约束.全面地专业地实现了:规范 ...

  5. 浅谈“面向接口编程” :依赖反转 IOC 与 DI (容器控制反转与依赖注入)

    IOC:Inversion of Control Containers and the Dependency Injection "Water" by Andy Huan, Mal ...

  6. GameFi爆火,【农民世界】崛起,浅谈链游辅助脚本开发思路

    链游 最近元宇宙.NFT.GameFi爆火,一堆链游爆发,资本疯狂涌入炒作,小白争先恐后入局,正是逐利的好时机. 以[农民世界]https://farmersworld.io 为例,游戏仅仅上线3个月 ...

  7. 浅谈聚合接口的应用场景

    什么是聚合接口 聚合接口是一种将多个数据源或多个API的数据进行整合,提供给客户端一个统一接口的技术.它可以将来自不同数据源或API的数据进行过滤.转换和排序,使其符合客户端的需求.客户端只需要调用一 ...

  8. 浅谈后端接口统一及原理

    背景 目前鉴于前后端分离开发的流行,现在需要对后端接口返回json数据格式,做统一规范处理 特性要求 要求后端接口统一返回以下格式 {"code": "SUC0000&q ...

  9. java 接口 属性_浅谈java接口中定义属性

    package com.supan.reflact; public interface PersonObject { /** * 在接口中定义属性的知识点: * 1,属性默认的修饰词是:public ...

  10. java接口是干啥_浅谈Java接口

    接口(英文:Interface)是Java中非常重要的内容,初学的时候可能感受不深,但是在做项目的时候,对面向接口编程的运用就变得尤为重要,不过这是后话了.现在先讨论假如是刚刚接触接口这个概念,该怎么 ...

最新文章

  1. 修改自动生成get/set方法模板代码
  2. MySQL免安装版,遇到MSVCR120.dll文件丢失错误的解决方案
  3. 八. 输入输出(IO)操作6.文件与目录管理
  4. Linux如何在系统启动时自动加载模块
  5. LeetCode - Maximum Subarray
  6. 数颜色(洛谷-P1903)
  7. HDU2041 超级楼梯【递推+水题】
  8. python安装哪个版本比较好,python选择哪个版本安装
  9. PCI、PCIE、PIC
  10. 计算机刊物SCI影响因子排名
  11. ssh连接阿里云服务器报错 Server responded ”Algori thm negotiation failed.”
  12. getSreenWH()
  13. Android中指南针的实现
  14. Kubuntu 系统美化--系统图标
  15. 让逆向工程师们头疼的代码混淆,就像永远也走不出的“浪浪山”
  16. TDengine在吉科软车辆监管中的应用实践
  17. Saiku控制页面展示的数据过长自动换行(二十四)
  18. 翻译D19(附AC码 POJ 17:The Largest City Nearby)
  19. Aizu-2200-floyd+dp
  20. docker搭建grafana+loki+promtail日志收集系统

热门文章

  1. asp.net社区户籍档案管理系统
  2. 虚拟偶像养成记:人工智能人格化与IP化打造出完美“爱豆”
  3. 《统计数据会说谎》阅读总结
  4. STM32+GM65二维码识别模块
  5. android 去掉google搜索,Android 7.1 去掉桌面上的谷歌搜索框
  6. 漂浮广告代码html,漂浮广告的JS代码(经典)
  7. android指纹识别开发
  8. 小米+线刷+android,小米10 Android 11 Beta1刷机包发布,线刷体验,国内首批
  9. 超级简单的自动刷新_输入名字,自动生成情侣头像~
  10. 在火狐(Firefox)浏览器中安装IE Tab插件