压力测试遭遇大量TIME_WAIT之后

发表于:2016-7-25 09:19

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:腾讯TMQ 崔 杰    来源:51Testing软件测试网原创

  HTTP协议是互联网中最常使用的应用层协议,它的绝大多数实现是基于TCP协议的。
  一、问题描述:
  某天,在对一个提供http接口的后台服务进行压力测试过程中,我们设定了几百qps(每秒请求数)开始测试几分钟后,请求一端(我们后续简称为:客户端)的压力结果统计日志中开始连续出现大量的报错信息:
   
  在压力测试前,根据之前的经验,同类服务的单机性能一般能够达到几千QPS,然而此时测试设定的压力值还不足200qps,这与预期存在1个数量级以上的性能差距,难道是被测服务存在问题么?
  二、问题跟踪:
  为了确认被测服务的状态,我们首先登录了服务所在的机器,检查了服务资源的占用情况,结果是:CPU、内存、硬盘、I/O、网卡、fd、socket等各项资源都不存在较大负载。看来服务本身还远没有达到它的负载瓶颈。
  在排除服务端问题后,我们重新分析了统计日志中的错误--"can not assign requested address",这是一个常见的socket的error,报错信息说明无法为socket创建新的连接,很可能是:tcp层的连接端口已经耗尽,无法为新的http请求分配端口建立连接。通过netstat命令,我们检查客户端,发现确实存在大量请求连接处于TIME_WAIT状态下:
   ... ...
   查看全文内容,请点击下载:http://www.51testing.com/html/09/n-3710809.html
  我们知道http协议主要是基于tcp协议之上的,为了解决tcp层连接通道复用的问题,在http协议中通过header中的Connection字段定义了对于tcp长连接的支持: 
  (1)在HTTP/1.0版本中,默认情况下在HTTP1.0中所有连接不被保持,如果客户端浏览器支持Keep-Alive,那么就在HTTP请求头中添加一个字段 Connection: Keep-Alive,当服务器收到附带有Connection: Keep-Alive的请求时,它也会在响应头中添加一个同样的字段来使用Keep-Alive。这样一来,客户端和服务器之间的HTTP连接就会被保持,当客户端发送另外一个请求时,就使用这条已经建立的连接通道。
  (2)在HTTP/1.1版本中,默认情况下在HTTP1.1中所有连接都会被保持,除非在请求头或响应头中指明要关闭:Connection: Close,这也就是为什么Connection: Keep-Alive字段再没有意义的原因。
  在压力测试过程中,我们模拟发送http请求的代码中使用的是http/1.1协议,应该会默认使用长连接,看来很可能是服务端不支持长连接,才会引起客户端频繁的创建TCP连接。通过tcpdump抓包,我们对此进行了证实:
   ... ...
   查看全文内容,请点击下载:http://www.51testing.com/html/09/n-3710809.html
版权声明:51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号