eBPF 实战指南:精准定位 TCP 重传,洞察网络瓶颈真相

更多云服务器知识,尽在hostol.com

你有没有遇到过这种情况?网站访问卡顿,接口响应慢得像蜗牛爬。你 ping 服务器没丢包,CPU 内存也没打满,日志也没报错,结果就是不知道哪儿出的问题。

你用抓包分析,Wireshark 打开后一脸懵——各种 ACK、SYN、FIN,你看得头晕眼花。

最后,你怀疑人生,甚至开始怀疑是不是 DNS 解析的锅。

但其实,幕后真凶可能就是:TCP 重传。

而要真正揪出这个重传元凶,你光靠抓包和传统监控工具根本不够。你需要更深一层的“系统级透视”——这时候,eBPF 上场了。


什么是 TCP 重传?为什么它是“隐形杀手”?

TCP 重传(TCP Retransmission)指的是发送方在一定时间内没有收到 ACK 确认,就会重新发送之前的数据包。

它的本意是好的:防止丢包影响通信。但当重传频繁出现,就不是“善意提醒”了,而是性能灾难。

为什么?

  • 它会 增加延迟,尤其是在 BBR 拥塞控制中;
  • 它会 占用带宽,导致正常请求变慢;
  • 它会 引发业务超时,比如 RPC 调用卡死;
  • 不会轻易暴露错误,不会直接报错,只是“慢”。

这才是最要命的地方:你以为是网络抖了,结果是 TCP 抖得不行。


传统方法:抓包 + ifconfig + ss,哪里卡?

我们来看一下传统排查 TCP 重传的方法:

🧪 方法一:抓包

bash
tcpdump -i eth0 tcp -w /tmp/tcp.pcap

然后拿去 Wireshark 打开,看统计 - TCP 分析。

问题:

  • 只能看到发生了重传,但看不到是哪个服务引起的;
  • 无法按进程粒度判断;
  • 不能实时监控,太重、太繁琐。

🧪 方法二:ss + netstat

bash
ss -s
netstat -s | grep retrans

问题:

  • 粒度粗,统计信息大杂烩;
  • 看不到“是谁”造成的重传;
  • 无法分服务、分 socket 追踪。

这就像医生告诉你“你体温高了”,但不给你查是哪里发炎。


真正的王炸工具:eBPF!

eBPF(extended Berkeley Packet Filter)是 Linux 内核的一项黑科技,能让你在内核里挂钩各种事件,比如网络收发、系统调用、调度器、socket 操作等等。

我们可以用它做到以下事情:

  • 跟踪每个 TCP socket 的重传行为;
  • 把“哪个进程、哪个端口、哪个远程 IP”全都钉出来;
  • 实时把数据导入 Prometheus / Grafana 监控;
  • 不需要修改内核代码,运行时动态加载。

简直是“系统级显微镜”。


eBPF 实战:抓 TCP 重传的最强组合(实操指南)

这里我们用 bcc(BPF Compiler Collection)和 bpftrace 两种方式来做。


✅ 方式一:用 tcprtt 监控 TCP 往返延迟 & 重传

安装 bcc:

bash
sudo apt install bpfcc-tools linux-headers-$(uname -r)

执行:

bash
sudo /usr/share/bcc/tools/tcpretrans

它会输出以下内容:

nginx
PID    COMM        LADDR           LPORT  RADDR           RPORT RETRIES
1324   nginx       192.168.1.20    443    10.0.0.15       54120 2

是不是一目了然?谁在重传,一清二楚。

你还可以加参数按需过滤:

bash
tcpretrans -p 1324      # 查看某个进程
tcpretrans -t 60        # 每隔 60 秒刷新一次


✅ 方式二:用 bpftrace 自定义更精细的探针

比如,我们想追踪 kernel 中的 tcp_retransmit_skb 函数调用:

bash
sudo bpftrace -e 'kprobe:tcp_retransmit_skb { @[kstack] = count(); }'

它会告诉你,重传事件在哪个内核调用栈上发生最多。进阶玩法还包括统计频率、匹配 IP、打印时间戳等。

你可以结合以下 tracepoints:

  • tcp:tcp_retransmit_skb
  • tcp:tcp_probe
  • sock:sock_exceed_memory_limits
  • net:net_dev_queue


把探针数据接入监控平台:Grafana 可视化

你还可以把这些数据导入 Prometheus:

  • bpfd-exporter 导出 bcc 指标;
  • 使用 Grafana 创建 TCP Retrans Dashboard;
  • 配置告警,比如“某进程重传率连续 5 分钟 > 2%”;

这样,你就有了一个实时的 TCP 重传监控体系,分分钟揪出“闷声做恶”的慢服务。


实战案例分享:一个 nginx 负载均衡节点引发的血案

某公司后台 API 服务平均响应时长从 60ms 突然飙升至 900ms,但没有丢包、没有超时日志。排查了半天,最终用 tcpretrans 发现:

nginx
PID    COMM        LADDR        LPORT  RADDR         RPORT RETRIES
4456   nginx       10.10.1.3    443    10.10.2.50    60812 5

原来是某个 nginx 负载均衡节点由于网卡驱动 bug,导致大量 ACK 包丢失,服务不断重传。

直接替换机器,问题瞬间解决。

传统手段压根没办法发现这个细节。


网络瓶颈的“真相链”:不是延迟高,而是 TCP 抖

很多时候我们以为:

慢,是服务器慢,或者用户网络差。

但实际上:

很多“慢”来自 TCP 层级的重传,它没报错,但拖慢了整个请求流程。

特别是在高并发场景下,重传不仅仅影响个别用户,而是整个系统的吞吐量都会被打压。

  • 应用没变,CPU 没飙,RT 却一直在涨;
  • 日志没报错,链路全绿,用户却在骂卡;
  • 部署集群一样,但某节点异常重传成瓶颈。

这些,传统监控是看不到的,你需要用 eBPF 去“抽丝剥茧”。


深度治理建议:只抓重传还不够,还要搞清它为啥重传

监控发现重传只是第一步,你还需要定位原因。常见几种元凶:

☠️ 网络侧:

  • 交换机丢包(缓存不足)
  • MTU 配置不一致,造成分片异常
  • VPN 加密链路 jitter

☠️ 系统侧:

  • 应用线程阻塞,发送不及时
  • socket backlog 滞后
  • Linux 内核参数不合理(比如拥塞控制算法)

建议配合以下内核参数调整:

bash
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_sack = 1
net.ipv4.tcp_congestion_control = bbr


高阶玩法:自动探针 + 多集群溯源

你可以封装一个脚本,把 tcpretrans 的输出汇总为 JSON:

bash
#!/bin/bash
tcpretrans -j | jq > /var/log/tcp_retrans.json

然后通过 Promtail 推送到 Loki,Grafana 做自动可视化,配合:

  • 服务名 → IP → 重传率
  • 请求路径 → 平均RT → 重传异常点
  • 节点对比图 → 一图揪出异常机器

这就是完整的“TCP 重传自动溯源系统”。


最后说一句:别再盯着 CPU 和内存了,真正影响用户体验的,有时候只是你没看到的一个包。

传统监控是看 CPU、看内存、看负载。

但真正造成接口卡顿的元凶,往往隐藏在 TCP 栈内部的微抖动中。

eBPF 就像是“X 光”,帮你透视内核、还原真相。

所以,下次你的系统突然卡顿,别只问“CPU 有没有打满”,而是试着问:

“是不是谁在悄悄重传?”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87648.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Ubuntu 系统上安装 Docker 环境

在当今的开发环境中,Docker 已经成为容器化技术的主流选择。它可以帮助开发者轻松地创建、部署和运行应用程序。本文将详细介绍如何在 Ubuntu 系统上安装 Docker 和 Docker Compose,并解决在安装过程中可能遇到的一些常见问题。 一、安装 Docker 1.卸载旧…

【Qt】QxORM无法删除和更改主键值为0的行,否则报错:invalid primary key

1、问题描述 使用 QxORM 删除或者更改数据库时,当主键值为 0 时,报错: [QxOrm] invalid primary key2、原因分析 2.1 源码分析 查找打印错误提示的代码: #define QX_DAO_ERR_INVALID_PRIMARY_KEY "[QxOrm] invalid primary key" QSqlError IxDao_Help…

数学建模_线性规划

问题背景模型介绍matlab求解 示例 问题背景 模型介绍 matlab求解 max问题转化为min问题 > > >号转化为 < < <号 示例 看到多个线性规划目标 2个目标函数变成1个目标函数 后面省略

51单片机制作万年历

硬件设计 主控芯片&#xff1a;一般选用AT89C52单片机&#xff0c;它与MCS - 51单片机产品兼容&#xff0c;有8K字节在系统可编程Flash存储器、32个可编程I/O口线、三个16位定时器 / 计数器等。时钟芯片&#xff1a;常用DS1302时钟芯片&#xff0c;能提供实时时钟 / 日历、定时…

Oracle CTE递归实现PCB行业的叠层关系

1、需求背景&#xff0c;出货报告要实现叠板假层的处理&#xff0c;需求如下 表ID,layer,MEDIUM数据如下 第一种情况&#xff0c;layer有K的 IDlayerMEDIUM1L1-L2302L2-L3403L3-K1204K1-L4105L4-L5206L5-L6307L7-K2108K2-L8119L8-L91010L9-L1030 实现layer有K1的&#xff0c…

Kubernetes 服务发布基础学习

一、Service 概述&#xff08;一&#xff09;Service 的定义Service 是 Kubernetes 中的一种抽象概念&#xff0c;用于定义一组 Pod 以及访问这组 Pod 的策略。其核心作用是将一组 Pod 封装为一个虚拟服务&#xff0c;并为客户端提供统一的入口&#xff0c;从而实现服务的负载均…

【零基础学AI】第21讲:TensorFlow基础 - 神经网络搭建入门

本节课你将学到理解什么是TensorFlow&#xff0c;为什么要用它 掌握TensorFlow安装和基本操作 学会搭建第一个神经网络 完成手写数字识别项目 开始之前 环境要求 Python 3.8至少4GB内存网络连接&#xff08;用于下载数据集&#xff09; 前置知识 第1-8讲&#xff1a;Python基础…

STM32 串口USART通讯驱动

前言 本篇文章对串口Usart进行讲解&#xff0c;为后面的esp8266和语音模块控制打好基础。 1.串口USART USART&#xff08;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff0c;通用同步 / 异步收发器&#xff09; 是一种常见的串行通信接口&#xff0c;广泛应…

pytorch版本densenet代码讲解

DenseNet 模型代码详解 下面是 DenseNet 模型代码的逐部分详细解析&#xff1a; 1. 导入模块 import re from collections import OrderedDict from functools import partial from typing import Any, Optionalimport torch import torch.nn as nn import torch.nn.functional…

前端常见设计模式深度解析

# 前端常见设计模式深度解析一、设计模式概述 设计模式是解决特定问题的经验总结&#xff0c;前端开发中常用的设计模式可分为三大类&#xff1a; 创建型模式&#xff1a;处理对象创建机制&#xff08;单例、工厂等&#xff09;结构型模式&#xff1a;处理对象组合&#xff08;…

React 学习(3)

核心API——React.creatElement()方法优点&#xff1a;将创建元素、添加属性和事件、添加内容和子元素等使用原生dom需要进行复杂操作才能实现的功能集成在一个API中。1.该方法接收三个参数第一个是要创建的元素的名称&#xff08;小写是因为如果&#xff0c;大写开头会被react…

倾斜摄影无人机飞行航线规划流程详解

在倾斜摄影测量项目中&#xff0c;航线规划的严谨性直接决定了最终三维模型的质量与完整性。照片覆盖不全、模型空洞、纹理模糊或分辨率不达标等问题&#xff0c;往往源于规划阶段对关键细节的疏忽。本文将系统梳理倾斜摄影无人机航线规划的核心流程与关键要点&#xff0c;旨在…

Minio大文件分片上传

一、引入依赖 <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.3</version></dependency> 二、自定义Minio客户端 package com.gstanzer.video.controller;import com.google.common.c…

Jenkins 插件深度应用:让你的CI/CD流水线如虎添翼 [特殊字符]

Jenkins 插件深度应用&#xff1a;让你的CI/CD流水线如虎添翼 &#x1f680; 嘿&#xff0c;各位开发小伙伴&#xff01;今天咱们来聊聊Jenkins的插件生态系统。如果说Jenkins是一台强大的引擎&#xff0c;那插件就是让这台引擎发挥最大威力的各种零部件。准备好了吗&#xff1…

密码学(斯坦福)

密码学笔记 \huge{密码学笔记} 密码学笔记 斯坦福大学密码学的课程笔记 课程网址&#xff1a;https://www.bilibili.com/video/BV1Rf421o79E/?spm_id_from333.337.search-card.all.click&vd_source5cc05a038b81f6faca188e7cf00484f6 概述 密码学的使用背景 安全信息保护…

代码随想录算法训练营第四十六天|动态规划part13

647. 回文子串 题目链接&#xff1a;647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 思路&#xff1a; 以dp【i】表示以s【i】结尾的回文子串的个数&#xff0c;发现递推公式推导不出来此路不通 以dp【i】【j】表示s【i】到s【j】的回…

基于四种机器学习算法的球队数据分析预测系统的设计与实现

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍项目展示随机森林模型XGBoost模型逻辑回归模型catboost模型每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 本项目旨在设计与实现…

http、SSL、TLS、https、证书

一、基础概念 1.HTTP HTTP (超文本传输协议) 是一种用于客户端和服务器之间传输超媒体文档的应用层协议&#xff0c;是万维网的基础。 简而言之&#xff1a;一种获取和发送信息的标准协议 2.SSL 安全套接字层&#xff08;SSL&#xff09;是一种通信协议或一组规则&#xf…

在 C++ 中,判断 `std::string` 是否为空字符串

在 C 中&#xff0c;判断 std::string 是否为空字符串有多种方法&#xff0c;以下是最常用的几种方式及其区别&#xff1a; 1. 使用 empty() 方法&#xff08;推荐&#xff09; #include <string>std::string s; if (s.empty()) {// s 是空字符串 }特性&#xff1a; 时间…

【Harmony】鸿蒙企业应用详解

【HarmonyOS】鸿蒙企业应用详解 一、前言 1、应用类型定义速览&#xff1a; HarmonyOS目前针对应用分为三种类型&#xff1a;普通应用&#xff0c;游戏应用&#xff0c;企业应用。 而企业应用又分为&#xff0c;企业普通应用和设备管理应用MDM&#xff08;Mobile Device Man…