const http = require('http');
const agent = new http.Agent({ keepAlive: true, maxSockets: 50 });
http.get({ host, path: '/api', agent }, res => res.resume());

压测十分钟,netstat 里到下游的 ESTABLISHED 从 20 涨到 3000,同时有大量连接停在 TIME_WAIT。代码里 keepAlive 明确写了 true。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:每个请求都 new 一个 Agent,连接池跟着请求各建各的,用完就散,复用根本不会发生。响应头里带 Connection: close 时,agent 也会把 socket 直接关掉。

「keep-alive 复用失效」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:Agent 在模块级创建一次 所有请求共用同一个实例;maxSockets 按下游承受能力设 不要留默认的 Infinity;确认服务端没有返回 Connection: close;对比复用前后 TIME_WAIT 的数量。

确认没问题再收工,压测结束时 ESTABLISHED 稳定在 50 以内 TIME_WAIT 数量下降一个数量级。

作者 9823189