压测和Http长链接

本文探讨了在压测过程中遇到的端口耗尽问题,重点介绍了TCP连接的TimeWait状态和端口限制。通过分析,提出了HTTP长链接作为解决方案,并详细解释了HTTP Keep-Alive的原理及配置,结合源码分析了服务端配置对连接复用的影响,最终实现了有效提升压测性能的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

压测和Http长链接

1.背景

一般进行压测的时候,通常是一台施压机进行压测,这其中可能会存在施压机端口耗尽,导致压测性能降低的问题.本文针对最普通的场景进行说明(施压机直接压服务端代码):

1.1 一条TCP链接

一条完整的TCP链接有四个要素组成

  • 源地址IP
  • 源地址端口
  • 目标地址ip
  • 目标地址端口

服务端的ip和端口是固定,源地址的ip也是固定的,只有源地址的端口是可以变的,而源端口的数量又是有限的.我们再来看下什么是TimeWait:

1.2 什么是TimeWait

TimeWait是tcp四次挥手中的最后一部分,如下图所示

这部分的作用就是等待客户端可能丢失的ack事件,在linux中可以通过cat /proc/sys/net/ipv4/tcp_fin_timeout查看具体的时间.

1.3 什么是端口耗尽

有了前面两个小节的知识,再来看下为什么端口会被耗尽,从而影响压测的性能.
假设施压机全部可用的端口数为60000个,其中TimeWait的时间为120秒,也就是说在这120秒的时间内,端口是无法启用的.那么60000/120=5000,也就是说,客户端和服务端最大建立链接的速度是500次/秒**[1]**.

1.4 解决办法

解决办法就是利用复用tcp链接,如下图所示**[3]**

在http1.1协议中是默认开启长链接的,而在http1.0中需要在http Header中携带Connection:Keep-alive.其中KeepAlive有两个参数**[2]**,如下图所示:

timeout=5:表示超时时间为5s
max=1000:表示这条http链接最大可以服务的请求数

2. 实际压测

2.1 压测代码

在进行实际操作的时候,发现http链接并没有进行复用,为了简单起见,我这里用压测ok接口来进行说明.压测机的压测代码,使用的是 HttpClient4,

   HttpGet get = new HttpGet("http://127.0.0.1:8088/ok");
        PoolingHttpClientConnectionManager connManager
                = new PoolingHttpClientConnectionManager();
        connManager.setDefaultMaxPerRoute(1);
        connManager.setMaxTotal(1);//最大链接数
        CloseableHttpClient client = HttpClients.custom()
                .setKeepAliveStrategy(myStrategy)
                .setConnectionManager(connManager)
                .setConnectionTimeToLive(80, TimeUnit.SECONDS)
                .build();

最大链接数为1,keepAlive的策略为:

   public static ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() {
   <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值