
复用连接通常能提升代理性能,因为它减少重复的 TCP、代理协商与 TLS 建连。但是,旧连接也可能在 DNS、代理策略、凭据或上游设施发生变化后继续保留原路径。真正需要回答的不是“是否禁用复用”,而是“空闲连接和连接总生命周期允许多长时间仍可被复用”。
本指南提供一套受控测试。研究依据包括 curl 于 2026 年 9 月 2 日发布的 8.22.0 变更记录,其中包含连接复用年龄检查。当前 libcurl 文档还明确区分最大空闲时间与自创建起的最大生命周期,这正是测试的基础。
区分空闲时间与总生命周期
维护两个独立时钟:
- 空闲时间:距离连接上一次完成传输的时间;
- 总生命周期:自连接创建起的时间,即使它一直在工作。
高频连接可能几乎没有空闲时间,但已经存在数小时;低频连接则可能很快超过空闲阈值。将两者混为一个指标会产生误判。
在 libcurl 中,CURLOPT_MAXAGE_CONN 控制空闲缓存连接可参与复用的最长时间,CURLOPT_MAXLIFETIME_CONN 则按创建后的总生命周期限制复用资格。还要确认所用语言绑定是否暴露或覆盖这些设置。
先定义业务目标
选择与实际工作负载相关的结果:
- 商品采集必须在规定窗口内采用新的授权路由;
- 广告验证不能跨地区或身份边界复用连接;
- 市场研究任务可在单次作业中保持粘性,但不能无限期延续;
- DNS 或 TLS 策略更新无需重启全部工作进程即可生效。
阈值应由变更窗口决定,而不是照搬无关基准。会话行为可参考住宅代理会话粘性测试,路由证据可参考代理出口证明指南。
构建受控路由环境
仅使用组织拥有或获准测试的端点和代理路由,准备:
- 一条稳定代理路径和目标;
- 小而确定的响应;
- 由端点返回的唯一案例编号;
- 可观察的连接创建与复用事件;
- 一项受控 DNS、路由或策略变更;
- 不影响生产流量的测试连接排空方式。
保持目标、请求、认证、TLS 策略和并发不变。基线期间不要轮换住宅代理出口,否则新路由可能被误判为连接年龄策略的结果。
记录连接级证据
每个逻辑请求都记录:案例编号、单调计时、测试连接 ID、创建时间、最后使用时间、被选择时的空闲年龄与总年龄、新建或复用决策、代理路由与会话类别、DNS 结果、TCP/代理/TLS 耗时、响应验证结果以及关闭原因。
不得记录代理密码、API Token、Cookie、个人数据或完整生产内容。使用测试专用的哈希连接标签即可完成关联。
运行基线矩阵
从无可复用连接的干净进程开始:
- 发送请求并确认新建连接。
- 立即重复,确认策略允许时发生复用。
- 等待一个较短的受控空闲间隔后再次请求。
- 周期性发送请求,使总生命周期增加而空闲时间保持较低。
- 停止流量,直到空闲时间超过候选阈值。
- 使用新工作进程重复,建立无缓存对照。
基线必须展示两个时钟独立变化。如果无法证明请求由哪个连接处理,就不应开始调优。
验证变更后的连接淘汰
每次只引入一项授权变更,例如更新测试主机名、迁移受控端点、调整代理路由分配,或在有效信任策略下更换测试 TLS 证书。
执行三类案例:
- 两个阈值均未到期前的复用;
- 空闲时间超过阈值后的请求;
- 持续活跃、但总生命周期超过阈值的请求序列。
预期行为应明确:不合格的缓存连接不会被选给新传输,新连接使用当前路由和安全策略。进行中的传输应按文档化策略完成或排空,而不是任意中断。
区分“复用前拒绝”与“复用后失败”
两条路径差异很大:
- 复用前拒绝:连接池先判断连接太旧,再新建连接;
- 复用后失败:连接池选中旧连接,之后才发现它已失效或不适用。
第二种会增加延迟;如果重试设计不当,还可能重复非幂等操作。必须分别记录选择决策与套接字错误,不能把最终成功当作年龄策略有效的唯一证据。
在保留连接池收益的前提下调优
比较多组有界策略,不要直接改成“每次都新建连接”。衡量建连率、中位与尾部延迟、代理和 TLS 握手失败、陈旧选择率、采用 DNS/路由/策略变更的时间、每连接请求数,以及每个逻辑操作的重试数。
阈值过短会增加握手和成本;过长会延迟变更并保留更多陈旧状态。合适策略应满足业务变更窗口,同时保留可量化的复用收益。
保护路由和身份边界
年龄只是复用条件之一。连接还必须匹配目标 authority、代理路由、认证上下文、TLS 配置和应用身份边界。宽松的年龄设置不能覆盖这些检查。
切换国家、账号或信任配置时,连接池键必须反映该边界,或明确排空旧池。出口稳定不代表身份上下文可以安全共享。
验收清单
- [ ] 空闲年龄与总生命周期分别测量。
- [ ] 新建与复用连接具有可观察 ID。
- [ ] 基线请求验证了预期响应。
- [ ] 受控变更具有明确生效窗口。
- [ ] 超过空闲上限的连接在复用前被拒绝。
- [ ] 持续活跃连接最终受到生命周期上限约束。
- [ ] 新连接采用当前 DNS、路由、TLS 和策略状态。
- [ ] 进行中的传输按文档化策略排空。
- [ ] 重试不会重复非幂等操作。
- [ ] 连接池仍提供可测量性能收益。
- [ ] 日志不含凭据或生产数据。
常见问题
空闲年龄等于连接生命周期吗?
不等于。空闲年龄从最后一次使用起计时,生命周期从创建起计时。频繁使用的连接可能很旧却并不空闲。
是否应让每个请求强制新建代理连接?
通常不应该。这样会失去长连接收益,并增加代理与 TLS 握手。应使用有证据支持的年龄和生命周期上限。
新 DNS 答案会替换现有活动连接吗?
不一定。活动连接可能继续传输而不触发新查询。应明确测试变更采用时间,并在业务边界要求时排空连接。
旧连接失败是否证明年龄策略有效?
不能。连接池可能先选中了它,之后才失败。更可靠的证据是超龄连接在下一次传输前就被判定为不可复用。
来源与合规说明
内部研究依据:curl 项目于 2026 年 9 月 2 日发布的 curl 8.22.0 公告与变更记录,以及 libcurl 关于最大空闲连接年龄和最大连接生命周期的文档。外部资料 URL 仅保存在内部运营记录中,公开文章不含外部链接。
只测试自己拥有或获准评估的代理账号、路由、端点与网络基础设施,并遵守服务商限制、隐私义务、服务条款和变更流程。