【腾讯TMQ】压力测试遭遇大量TIME_WAIT之后

在对提供HTTP接口的后台服务进行压力测试时,遇到大量TIME_WAIT状态的连接,导致请求失败。问题源于服务端返回connection:close,但未主动关闭连接,客户端在接收到此信息后关闭连接,造成客户端TIME_WAIT积累。解决方案是调整Linux系统TCP参数,增加可用端口范围,避免TIME_WAIT限制测试性能。

作者:崔杰

前语: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状态下:

这里要说明一下,虽然理论上tcp连接可用端口号为0~65535–大约65536个,但是实际在不指定端口情况下连接服务时可用端口默认为32768~61000–大约只有28000多个,在linux系统中这个限制可以通过
/proc/sys/net/ipv4/ip_local_port_range文件进行修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值