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
英文地址,請注明出處:http://en.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…