使用k6对NestJS(Node.js)应用负载测试遇连接强制关闭问题
问题原因分析
- 本地k6运行机器的资源/连接瓶颈:单台机器运行k6时,每个VU都会占用TCP连接资源。Windows系统默认的动态端口范围、最大TCP连接数有限,当VU超过3000时,本地端口会被快速耗尽,导致新连接无法建立,甚至已建立的连接被系统或远端强制关闭。测试知名门户也出现相同问题,说明问题出在你的测试发起端,而非目标服务。
- TCP连接复用效率低:你的脚本默认可能没有充分复用HTTP连接,每个请求都新建TCP连接,进一步加剧了本地资源消耗,加速触发连接限制。
- 远端服务的单IP限流:多数公共服务(包括知名门户)会对单IP的并发连接数或QPS做限制,当单台k6机器的请求量超过阈值,远端会主动关闭连接来防御流量冲击。
实现30000并发用户测试的解决方案
- 采用分布式负载测试:用多台机器分摊VU压力,比如部署10台机器,每台运行3000个VU,总并发即可达到30000。这种方式既能规避单台机器的资源限制,也能绕过远端服务的单IP限流规则。
- 优化k6连接池配置:启用HTTP连接复用,减少TCP连接创建开销,修改脚本添加连接池参数:
import { sleep } from 'k6'; import http from 'k6/http'; export const options = { vus: 3000, duration: '30s', http: { pool: { max_connections: 1000, // 按需调整连接池大小 idle_timeout: '30s', // 闲置连接保留时间 }, }, }; export default function () { http.get('https://www........com/'); sleep(1); } - 调整Windows系统TCP参数:如果要在单台机器上提升VU上限,修改系统TCP配置来扩大资源容量:
以管理员身份打开命令提示符,执行以下命令:# 扩大动态端口范围 netsh int ipv4 set dynamicport tcp start=1024 num=64511 # 启用TCP自动调优 netsh int ipv4 set tcp global autotuninglevel=normal # 关闭TCP时间戳(减少资源占用) netsh int tcp set global timestamps=disabled - 模拟真实用户请求模式:将固定的
sleep(1)改为随机睡眠,比如sleep(Math.random() * 2 + 1),让请求分布更贴近真实场景,避免瞬间流量集中导致的连接过载。 - 逐步加压验证:不要直接跳到30000VU,从低并发开始逐步提升(如5000→10000→20000→30000),同时监控目标服务和k6机器的CPU、内存、连接数等指标,定位每一步的瓶颈并优化。
内容的提问来源于stack exchange,提问作者kasfik
相关产品推荐
相关产品推荐

