0

0

strace -f -e trace=network 发现大量 connect/reset 的业务排查

舞夢輝影

舞夢輝影

发布时间:2026-01-25 19:14:42

|

299人浏览过

|

来源于php中文网

原创

大量 connect 后立即返回 ECONNREFUSED 或 RST,主因是业务代码反复连接未监听的地址/端口、目标服务崩溃或绑定错误(如仅监听 127.0.0.1 却连 localhost 触发 IPv6 解析失败)。

strace -f -e trace=network 发现大量 connect/reset 的业务排查

为什么 strace -f -e trace=network 看到大量 connect 后立刻 connect(…) = -1 ECONNREFUSEDreset

这通常不是网络本身卡顿,而是业务代码在反复尝试连接一个**根本没在监听的地址/端口**,或者目标服务已崩溃、未启动、监听绑定错误(如只绑 127.0.0.1 却连 localhost 触发 IPv6 解析失败)。strace 抓到的是系统调用层面行为,它不区分“重试逻辑”和“配置错误”,只忠实地记录每次 connect 调用及其返回值。

  • 检查目标服务是否真实运行:ss -tlnp | grep :端口号,确认 StateLISTENPID 匹配预期进程
  • 注意地址解析问题:如果配置里写的是 localhost,而服务只监听 127.0.0.1,glibc 可能先尝试 IPv6 的 ::1,失败后才回退 IPv4——strace 会把两次都记下来
  • 确认防火墙没静默丢包:iptables -L -n -v | grep DROP(或 nft list ruleset),ECONNREFUSED 是内核明确拒绝,而超时(ETIMEDOUT)才更可能是防火墙拦截或路由不通

如何快速定位是哪个线程/进程在疯狂重连

strace -f 输出默认不带时间戳和线程 ID,海量日志里找源头很吃力。必须加参数增强可读性:

  • -tt 打印微秒级时间戳,便于对齐业务日志
  • -T 显示每次系统调用耗时,connect 耗时极短(几微秒)基本就是立即拒绝,而非等待
  • -p PID 替代 -f(如果已知主进程 PID),避免跟踪无关子进程;必要时用 ps -T -p PID 查线程 ID,再针对性 strace -p TID
  • grep -E "(connect|ECONNREFUSED|EHOSTUNREACH|reset)" 过滤,配合 awk '{print $1,$2,$NF}' 提取时间、PID、错误码,快速聚类

connect 返回 reset(即 RST 包)的真实含义

这里 reset 不是 strace 自己说的,而是指 connect 返回 -1errno == ECONNRESET,或抓包看到 TCP 层收到 RST。这说明对方 TCP 主动发了复位,常见于:

Mulan AI
Mulan AI

画布式AI视频创作平台,轻松制作爆款视频

下载
  • 目标端口有进程在监听,但该进程在 accept() 前就崩溃了(比如 fork 子进程失败、资源耗尽),内核会代为 RST 后续连接
  • 服务启用了连接限制(如 nginxlimit_conn),超出阈值的连接被直接 RST
  • 某些代理或中间件(如 HAProxy、Envoy)配置了健康检查失败后的“快速拒绝”策略,不等超时直接 RST
  • 注意:RST 和 FIN 不同,它表示异常终止,不能靠客户端重试解决,必须查对端状态

strace 更高效的替代排查路径

持续 strace 开销大、日志爆炸,适合快速定性;真要根因分析,优先组合轻量工具

  • ss -tni 查看连接状态分布:SYN-SENT 多说明客户端发了请求但没响应;TIME-WAIT 爆满可能意味着短连接风暴
  • tcpdump -i any port 端口号 -w conn.pcap 抓几秒包,然后 tshark -r conn.pcap -Y "tcp.flags.reset==1" 精准定位 RST 发送方
  • 检查应用层配置:比如 Java 应用的 spring.redis.host 是否误配,Python 的 requests.get("http://wrong-host") 是否写死错误域名
  • 若使用连接池(如 HikariCP、urllib3),确认 maxIdle/minIdle 设置是否合理,空闲连接被服务端断开后,池子没及时剔除失效连接,导致下次取出就 RST

真正麻烦的从来不是看到多少次 connect,而是那些没打日志的重试——它们藏在框架底层,只在 strace 里裸奔。所以第一反应不该是调优,而是确认“这个连接本该成功”。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

774

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

684

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

767

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

719

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1425

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

571

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

751

2023.08.11

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

45

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 20.3万人学习

Django 教程
Django 教程

共28课时 | 3.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号