需先用pgrep -f定位目标进程pid,再通过ss -tunp验证连接状态;接着用tcpretrans捕获tcp重传(≥3次且延迟>200ms即异常),ss -ti分析rtt抖动与缓冲区堆积,nethogs识别带宽抢占,最后用hping3交叉验证网络路径延迟。

你需要精准定位某个进程(比如自研的Python采集服务、Java微服务或浏览器标签页)是否正在拖慢整体网络响应,而不是泛泛查看系统级网速或丢包——这时必须绕过全局指标,直接捕获该进程发起的网络行为与延迟特征。
确认目标进程的PID与网络活动
打开终端,执行:pgrep -f "python.*collector\|java.*service\|chrome",替换引号内关键词为你实际要监控的进程特征。若返回空,说明进程未运行或名称不匹配;【务必用-f参数匹配完整命令行,否则可能漏掉后台守护进程】。
拿到PID后,立即验证它是否真有网络连接:执行ss -tunp | grep $PID(把$PID替换成实际数字),观察是否有ESTAB状态行。若无输出,该进程当前未建立TCP连接,后续延迟监控将无意义。
用tcpretrans追踪该进程的TCP重传行为
安装bcc工具集(含tcpretrans):sudo apt install bpfcc-tools。这一步不可跳过,原生命令无法获取重传调用栈。
运行命令:sudo tcpretrans -p $PID,界面实时滚动显示每次重传的源端口、目的IP、目的端口、重传次数及延迟毫秒值。若某条目“retrans”列持续≥3且“ms”列>200,说明该连接正因丢包或ACK延迟反复重发。
注意:tcpretrans只捕获IPv4 TCP重传,若进程使用UDP或IPv6,需改用sudo dropwatch -d -l kas | grep -A2 "$PID"监听内核丢包点,但输出更晦涩。
用ss -i抓取该进程socket的实时RTT与队列状态
第一步:找出该进程所有活跃socket的inode号。
执行ss -tunp | grep $PID | awk '{print }' | cut -d',' -f2 | cut -d'=' -f2,得到一串数字(如12345678)。
第二步:用inode反查详细网络指标。
执行ss -ti | grep -A5 "ino:12345678"(把12345678换成上步结果)。重点看三处:
• rtt: 123.456/23.789 ms → 前者是平滑RTT均值,后者是RTT方差,方差>均值1/3说明抖动剧烈
• qsize: 0/0 → 发送/接收队列字节数,若Recv-Q长期>65536,说明应用层读取太慢,数据在内核缓冲区堆积
• cwnd: 10 → 拥塞窗口大小,若长期卡在10以下且rtt飙升,大概率是路径中间设备限速或丢包
用nethogs按进程隔离带宽与延迟干扰源
方法一:直接启动并过滤进程名sudo nethogs -t -C 1 | grep "$PROCESS_NAME"($PROCESS_NAME为进程名如python3,非PID)。nethogs每秒刷新一次,输出含当前KB/s、累计流量和PID,能快速识别该进程是否在突发上传导致其他请求排队。
方法二:绑定到指定网卡避免多接口混淆
先用ip -br a查出目标网卡名(如ens11f0),再执行sudo nethogs ens11f0,启动后按P键切换排序方式,选“%RX”或“%TX”降序,确认该进程是否长期占据单向带宽TOP3。
【关键提醒】nethogs无法显示延迟,但它能暴露带宽抢占行为——当某个进程TX持续占满网卡90%以上时,即使ping值正常,HTTP请求也会因TCP ACK被延迟发送而感知卡顿。
交叉验证:用hping3模拟该进程的通信模式测延迟
第一步:从ss -tunp输出中提取该进程连接的目标IP和端口,例如192.168.1.100:8080。
第二步:模拟相同协议行为测试真实延迟。
若原连接是HTTP(端口80/443/8080),执行:sudo hping3 -c 5 -S -p 8080 192.168.1.100。
若原连接是HTTPS(端口443),加--tcp-timestamp选项更贴近真实握手:sudo hping3 -c 5 -S --tcp-timestamp -p 443 192.168.1.100。
第三步:对比结果。
若hping3的RTT均值<50ms但该进程自身请求耗时>2s,问题一定出在进程内部(如DNS解析阻塞、SSL证书校验慢、业务逻辑锁表);
若hping3 RTT也>200ms,说明网络路径本身异常,与进程无关。











