性能测试之HTTP连接池异常波动原因分析

针对近期压测过程中一次TCP链接数异常波动,进行分享一下在池化技术前置下,压测的应用http连接池资源分配问题分享,先一起了解一下什么叫池化技术。

现在都是池化技术例如:http连接池 、mysql连接池、 redis连接池,连接池技术是一种常见的性能优化技术,通过事先创建一组可重用的连接,减少了连接的创建和销毁开销,提高了系统性能和效率。以下是关于不同类型连接池的简要介绍:

01.HTTP连接池

HTTP连接池用于管理HTTP请求的连接,在发起HTTP请求时,可以从连接池中获取可用连接,避免频繁地建立和关闭HTTP连接。通过复用连接,可以减少网络开销和提高请求的响应速度。HTTP连接池还可以控制连接的超时时间、最大连接数等参数,以适应不同的场景需求。

HTTP连接池的配置通常涉及多个参数,这些参数共同决定了连接池的性能和效率。以下是一些关键配置项及其说明:

1. 最大连接数(Max Total Connections)

  • 定义:连接池能够创建的最大连接数。当请求的连接数超过此限制时,新的连接请求将被置于等待队列中。

  • 配置建议:根据应用程序的并发请求量和后端服务器的处理能力来设置。过高的值可能会浪费资源,而过低的值则可能导致请求等待时间过长。

2. 每个路由的最大连接数(Max Per Route Connections)

  • 定义:针对每个目标主机或路由的最大连接数。这有助于平衡不同目标服务器的负载。

  • 配置建议:根据目标服务器的性能和并发处理能力进行设置。如果所有请求都指向同一服务器,则此值应与最大连接数相同。

3. 连接超时时间(Connection Timeout)

  • 定义:建立连接时的超时时间。如果在此时间内无法建立连接,则请求将失败。

  • 配置建议:根据网络延迟和服务器响应时间进行设置。过短的超时时间可能会导致频繁的连接失败,而过长的超时时间则可能浪费资源。

4. 请求超时时间(Request Timeout)

  • 定义:从发送请求到接收响应的超时时间。如果在此时间内未收到响应,则请求将被视为失败。

  • 配置建议:根据服务响应时间和服务质量进行设置。确保此值足够长以容纳正常的服务响应时间,但又不过长以避免等待无效响应。

5. 空闲连接检查时间(Validate After Inactivity)

  • 定义:空闲连接在被重新使用前进行检查的时间间隔。这有助于确保连接仍然有效,避免使用已断开的连接。

  • 配置建议:根据网络稳定性和服务器状态进行设置。频繁的检查可能会增加系统负载,但过少的检查可能会导致使用无效连接。

6. 连接释放策略

  • 定义:连接在使用完毕后如何被释放回连接池的策略。

  • 配置建议:通常连接会在使用完毕后自动释放回连接池。但也可以配置为在特定条件下(如异常发生时)立即关闭连接,避免污染连接池。

举例:示例配置(以Apache HttpClient为例)

// 创建连接池管理器  
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();  
  
// 设置最大连接数  
cm.setMaxTotal(200);  
  
// 设置每个路由的默认最大连接数  
cm.setDefaultMaxPerRoute(20);  
  
// 设置连接超时时间(毫秒)  
RequestConfig requestConfig = RequestConfig.custom()  
    .setConnectTimeout(3000) // 连接超时时间  
    .setSocketTimeout(5000)  // 请求超时时间  
    .build();  
  
// 创建HttpClient  
CloseableHttpClient httpClient = HttpClients.custom()  
    .setConnectionManager(cm)  
    .setDefaultRequestConfig(requestConfig)  
    .build();


总结

HTTP连接池的配置需要根据具体的应用场景和服务器性能进行调整。合理配置连接池参数可以显著提高HTTP请求的效率和性能,降低系统资源的浪费。在实际应用中,建议根据监控数据和业务需求进行动态调整。

MySQL连接池

MySQL连接池用于管理与MySQL数据库的连接,在应用程序中通过连接池获取数据库连接,执行SQL查询或更新操作,然后将连接放回连接池中。MySQL连接池可以控制连接的空闲时间、最大连接数、连接超时等参数,有效地管理数据库连接资源,提高数据库访问性能和稳定性。

Redis连接池

Redis连接池用于管理与Redis服务器的连接,在应用程序中通过连接池获取Redis连接,进行数据读写操作,然后将连接释放回连接池中。通过使用连接池,可以减少连接的创建和销毁开销,提高对Redis的访问效率。Redis连接池还可以控制连接的最大空闲时间、最大连接数等参数,以优化连接资源的利用。

通过使用池化技术,可以有效地管理和复用连接资源,避免资源浪费和提高系统性能。不同类型的连接池针对不同的服务和场景,提供了灵活的配置选项和优化策略,帮助开发人员构建高效、稳定的应用系统。

当涉及到连接池技术(如 HTTP 连接池、MySQL 连接池、Redis 连接池)时,连接池的目的是为了在应用程序和后端服务之间维护一组可重用的连接,以提高性能和效率。连接池通过事先创建并维护一定数量的连接,然后在需要时将这些连接分配给应用程序使用。连接池还可以管理连接的生命周期、限制连接数、避免频繁创建和销毁连接等,从而减少了连接的开销和提高了系统的性能。

针对在压测过程中,测试同学监控到TCP连接数在一个短时间内频繁波动很大时,可能表明连接池配置存在一些问题。可以通过现有的应用服务监控获取在压测指定时间内TCP连接数样本

f69923672a2b309bfeaa025085de368e.png

linxu查看tcp连接数命令

#统计所有tcp连接的个数 ss -anpt |wc -l

按照目标 IP 进行分组和统计

ss -anpt  | awk '{print $5}' | cut -d':' -f1 | sort | uniq -c | sort -nr

查看特定 IP 地址的 TCP 连接,并按状态进行分组统计

ss -anpt | grep 0.0.0.1 | awk '{print $1}' | sort | uniq -c

这种波动可能是由于连接池中的连接数量设置不合理导致的。一些可能的原因和解决方法包括:

连接池大小设置不合适:如果连接池的最大连接数设置过小,可能会导致连接不足并且请求被阻塞。如果设置过大,可能会导致资源浪费和性能下降。需要根据实际需求和系统负载来调整连接池的大小。

连接池的连接复用策略不合理:连接池在分配连接和回收连接时的策略不当也可能导致连接数波动。例如,如果连接被频繁创建和销毁,可能会导致连接池中连接数量的波动。

网络或服务端的问题:波动可能也是由于网络问题或服务端处理能力不足导致的。需要检查网络状况和服务端负载情况,确保连接池的配置与实际情况相匹配。

总的来说,当 TCP 连接数波动很大时,需要仔细审视连接池的配置和使用情况,根据实际情况调整连接池的参数,以确保连接池能够有效地管理连接、提高系统性能和稳定性。

下方扫码关注 Python测试社区,与质量君一起学习成长、共同进步,做一个职场最贵Tester!

上一篇:性能测试工具 - Siege

扫描作者微信,交流、进软件测试群、合作!

8084ad606b92f8660d596dbf9c60fcf6.jpeg

如果觉得有用,就请关注、点赞、在看、分享到朋友圈吧!

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值