目标
服务偶发 ECONNRESET 且没有明显规律,客户端复用了连接池,而这些连接可能被中间代理提前关闭。本配方通过抓包对比空闲间隔与各跳的 keep-alive 设置,判断是哪一侧超时关闭连接,从而修正连接池与代理配置。
步骤要点
- 只抓取相关流量,人为制造超过可疑超时时间的空闲间隔。
- 用 tshark 过滤 FIN/RST,查看哪个源地址发起重置。
- 把代理的 keep-alive 超时调到低于源站,避免连接被竞争关闭。
- 调整客户端连接池的最大空闲时间以匹配最短超时。
sudo tcpdump -i eth0 -w keepalive.pcap 'tcp port 443 and host 203.0.113.10'
# drive requests with 60s idle gaps
sleep 65
curl -sv https://api.example.com/health 2>&1 | tail -5
排错提示
- 抓包时间太短可能看不到重置,需把空闲拉长到远超可疑超时。
- 两侧都可能重置,需要按最短超时对齐。
- 生产抓包涉及敏感数据,需注意合规。
适用边界
- 需要抓包权限,生产环境可能受限。
- 只负责归因,不直接修改超时配置。