tc工具-corrupt 比 delay/loss 更影響性能

1.?netem corrupt 5%?的作用

功能說明

  • corrupt 5%?表示?隨機修改 5% 的數據包內容(如翻轉比特位),模擬數據損壞。
  • 它本身不會直接丟棄或延遲數據包,而是讓接收端收到錯誤的數據(可能觸發校驗和失敗、協議層重傳等)。

為何帶寬驟降?

  • 關鍵問題netem?的?corrupt?操作需要?逐包處理(修改數據包內容),這會引入顯著的?CPU 開銷
  • 性能瓶頸
    • 當發送速率極高(如 5.26 Gbps)時,netem?可能無法實時處理所有數據包,導致?隊列堆積
    • 默認情況下,netem?使用內核的?Qdisc 內核線程(軟中斷)處理數據包,其處理能力遠低于專用硬件(如網卡 DMA)。
    • 當隊列滿時,內核會觸發?TCP 擁塞控制(如降低發送窗口),最終表現為帶寬驟降。

2. 驗證原因:觀察?netem?隊列狀態

方法 1:檢查 Qdisc 隊列長度

 

bash

tc -s qdisc show dev enp4s0

輸出示例

 

qdisc netem 1: root refcnt 2 limit 1000 packets # 默認隊列長度為 1000 包
Sent 1234567 packets 567890123 bytes (123.45 MB)
dropped 0 overlimits 0 requeues 0
  • 關鍵指標
    • limit 1000 packets:隊列最大容量。
    • overlimits:因隊列滿而丟棄的數據包數(若增加,說明隊列堆積)。
    • 若?overlimits?為 0 但帶寬仍驟降,可能是?netem?處理延遲導致發送端主動降速。

方法 2:監控 CPU 使用率

 

bash

top -p $(pgrep -f "ksoftirqd") # 觀察軟中斷線程(處理 Qdisc)
mpstat -P ALL 1 # 查看各 CPU 核心負載
  • 預期現象
    • 使用?netem?時,某個 CPU 核心的?si(軟中斷)使用率會接近 100%。
    • 高 CPU 負載會導致內核無法及時處理數據包,觸發發送端降速。

3. 為什么?corrupt?比?delay/loss?更影響性能?

操作類型內核處理開銷典型帶寬影響
delay低(僅修改時間戳)幾乎無影響(除非延遲極大)
loss低(直接丟棄包)線性降速(如 5% 丟包 → 帶寬約降 5%)
corrupt高(需逐包修改數據)可能引發指數級降速(因擁塞控制)
  • corrupt?的特殊性
    • 修改數據包內容后,接收端的 TCP 棧會檢測到校驗和錯誤,觸發?快速重傳?或?RTO(超時重傳)
    • 重傳會導致發送端?降低發送窗口,進一步限制帶寬。
    • 若?netem?處理速度跟不上發送速率,隊列堆積會加劇這一過程。

4. 如何驗證是?netem?性能瓶頸而非其他問題?

實驗 1:替換為?loss?測試

# 移除原有規則
sudo tc qdisc del dev enp4s0 root
# 添加 5% 丟包規則(低開銷)
sudo tc qdisc add dev enp4s0 root netem loss 5%
# 重新運行 iperf3
iperf3 -c <接收端IP> -t 30

預期結果

  • 帶寬會線性下降約 5%(如從 5.26 Gbps 降至 ~5 Gbps),不會驟降至 7 Mbps
  • 說明?corrupt?的高開銷是主因。

實驗 2:降低發送速率測試

 

bash

# 限制 iperf3 發送速率為 100 Mbps
iperf3 -c <接收端IP> -b 100M -t 30
# 同時保持 netem corrupt 5%
sudo tc qdisc add dev enp4s0 root netem corrupt 5%

預期結果

  • 帶寬可能穩定在 ~95 Mbps(5% 損壞影響),不會驟降
  • 說明高發送速率下?netem?處理能力不足。

5. 解決方案

方案 1:降低?netem?處理壓力

  • 減少影響范圍

    # 僅對特定流量應用 corrupt(如通過 iptables 標記)
    sudo iptables -A PREROUTING -p tcp --dport 1234 -j MARK --set-mark 1
    sudo tc qdisc add dev enp4s0 root handle 1: prio
    sudo tc filter add dev enp4s0 parent 1: protocol ip prio 1 u32 match ip dport 1234 0xffff action mirred egress redirect dev netem_if
    # 需創建虛擬設備或使用其他方法限制流量

    (更簡單的方法是直接降低測試速率)

  • 降低損壞比例

    sudo tc qdisc change dev enp4s0 root netem corrupt 0.5% # 從 5% 降至 0.5%

方案 2:使用硬件加速(如 DPDK)

  • 若需高精度模擬損壞且保持高性能,可考慮:
    • 使用 DPDK 的?pktgen?工具(用戶態處理,繞過內核瓶頸)。
    • 專用網絡測試儀(如 Ixia、Spirent)。

方案 3:接受性能下降(測試目的)

  • 如果目標是?驗證系統在錯誤下的行為(如 TCP 重傳、應用層超時),帶寬驟降是合理現象。
  • 此時應關注:
    • 接收端是否正確處理損壞數據(如 TCP 校驗和失敗)。
    • 應用層是否觸發容錯機制(如重試、降級)。

6. 總結

現象原因是否正常
帶寬從 5.26 Gbps 驟降至 7 Mbpsnetem corrupt 5%?的高 CPU 開銷導致隊列堆積,觸發 TCP 擁塞控制正常(但需明確測試目標)
corrupt?比?loss/delay?更影響性能修改數據包內容需要逐包處理,開銷遠高于丟棄或延遲預期行為
低發送速率下?corrupt?不導致驟降netem?處理能力足夠時,帶寬僅受損壞比例影響驗證了瓶頸來源

建議

  • 若需測試高帶寬下的錯誤處理,改用?loss?或?delay,或降低?corrupt?比例。
  • 若需精確模擬損壞,接受性能下降,并監控 TCP 重傳等指標。

# 延遲

sudo tc qdisc add dev enp1s0 root netem delay 100ms 1000ms

# 服務器限速(丟棄超額包)
?tc qdisc add dev enp1s0 root netem loss 10% ?丟棄?


# 在接收端添加損壞規則# 5% 概率損壞包
sudo tc qdisc add dev enp1s0 handle 1: root netem corrupt 5%

限制發送端帶寬
# sudo tc qdisc add dev enp4s0 root netem rate 100mbit

#sudo tc qdisc add dev eth0?root tbf rate 100mbit burst 32kbit latency 400ms

使用?tc(流量控制工具)在網卡?eth0?上創建一個?TBF(令牌桶過濾器)?根隊列規則,限制出口流量速率為?100Mbps,允許突發流量最多?32Kbit,并設置最大延遲為?400毫秒,從而實現基礎的流量整形和限速。

刪除
#tc qdisc del dev enp4s0 root

查看
#tc qdisc show dev enp4s0?

無法識別?netem?隊列規則(qdisc)類型,通常是因為缺少必要的內核模塊或配置。以下是解決步驟:


1. 檢查內核模塊是否加載

netem?需要?sch_netem?內核模塊支持。運行以下命令檢查并加載模塊:

sudo modprobe sch_netem

如果模塊不存在,可能需要安裝內核擴展包(見步驟2)。


2. 安裝內核擴展包(如未安裝)

在基于RHEL/CentOS的系統上,確保安裝了內核擴展包:

sudo yum install kernel-modules-extra # CentOS/RHEL 7/8
# 或
sudo dnf install kernel-modules-extra # Fedora/RHEL 9+

3. 驗證模塊是否加載

運行以下命令確認模塊已加載:

lsmod | grep netem

如果看到?sch_netem,則模塊已加載。


4. 重新嘗試添加qdisc

加載模塊后,重新執行你的命令:

sudo tc qdisc add dev ens22f0 root netem rate 100mbit

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89514.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89514.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89514.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flask YAML管理工具

項目概述 項目地址&#xff1a;https://github.com/KaiqiZing/Flask_Yaml_Demo 這是一個基于Flask開發的YAML文件管理工具&#xff0c;提供了完整的YAML文件查看、編輯、管理功能&#xff0c;具有現代化的Web界面和強大的編輯能力。 核心功能 1. 文件管理功能 目錄掃描&am…

Embedding模型微調實戰(ms-swift框架)

目錄 簡介 1. 創建虛擬環境 2 安裝ms-swift 3安裝其他依賴庫 4. 下載數據集 5.開始embedding模型訓練 6. 自定義數據格式和對應的Loss類型 &#xff08;1&#xff09; infoNCE損失 (2)余弦相似度損失 (3)對比學習損失 &#xff08;4).在線對比學習損失 &#…

從性能優化賽到社區Committer,走進趙宇捷在Apache Fory的成長之路

Apache Fory 是一個基于JIT和零拷貝的高性能多語言序列化框架&#xff0c;實現了高效緊湊的序列化協議&#xff0c;提供極致的性能、壓縮率和易用性。在多語言序列化框架技術領域取得了重大突破&#xff0c;推動序列化技術步入高性能易用新篇章&#xff01;這一切&#xff0c;都…

Python實例題:基于 Flask 的任務管理系統

目錄 Python實例題 題目 要求&#xff1a; 解題思路&#xff1a; 代碼實現&#xff1a; Python實例題 題目 基于 Flask 的任務管理系統 要求&#xff1a; 使用 Flask 框架構建一個任務管理系統&#xff0c;支持以下功能&#xff1a; 用戶認證&#xff08;注冊、登錄、…

利用GPU加速TensorFlow

一、寫在前面 我們已經依靠keras和TensorFlow給大家做了一些機器學習在圖像處理中的應用(影像組學學習手冊,基于深度學習的圖像分類任務)&#xff0c;此前的教程中我們沒有用GPU進行加速&#xff0c;但是相較于CPU而言&#xff0c;GPU是設計用于處理大規模并行計算任務的硬件&…

模型預測專題:強魯棒性DPCC

0 1 前言 在進行DPCC的學習過程中&#xff0c;于下面鏈接看到了一篇強魯棒性算法&#xff1b;感覺挺有意思的&#xff0c;學習一下。 永磁同步電機高性能控制算法&#xff08;12&#xff09;——基于預測電流誤差補償的強魯棒預測控制/參數辨識&有限集預測控制與連續集預…

修復opensuse 風滾草rabbitmq的Error: :plugins_dir_does_not_exist問題

https://wiki.archlinux.org/title/Talk:RabbitMQ 報錯 yqh192 /u/l/r/l/r/plugins> sudo rabbitmq-plugins enable rabbitmq_management Error: :plugins_dir_does_not_exist Arguments given:enable rabbitmq_managementUsagerabbitmq-plugins [--node <node>] [--…

前端做gis地圖有哪些庫

以下是前端開發GIS地圖常用的庫&#xff1a; Leaflet&#xff1a;輕量級、易于使用的開源JavaScript庫&#xff0c;具有豐富的地圖功能和插件生態系統&#xff0c;支持多種地圖數據源&#xff0c;適合初學者和專業開發者。其優勢在于簡潔性和易用性&#xff0c;代碼結構清晰&am…

賦能城市安全韌性|眾智鴻圖總裁扈震受邀出席智慧城市大會發表主題報告

——“眾智鴻圖作為城市基礎設施智能化綜合服務提供商&#xff0c;以地理信息科學、時空大數據、人工智能為核心能力&#xff0c;長期深耕于燃氣、供水、排水等城市基礎設施生命線領域及港口、園區等工業領域&#xff0c;致力于為城市穩定運行與高效發展提供堅實保障。” 2025年…

【大語言模型入門】—— 淺析LLM基座—Transformer原理

【大語言模型入門】—— 淺析LLM基座—Transformer原理 解密GPT核心技術&#xff1a;Transformer架構深度解析被反復強調的核心概念意味著什么&#xff1f; GPT預測機制解析&#xff1a;從Next Token Prediction到任務推理核心機制的本質案例驅動的機制解析解構策略&#xff1a…

Django打造智能Web機器人控制平臺

Django 實現 Web 機器人控制 以下是關于 Django 實現 Web 機器人控制管理的實例思路和關鍵代碼片段,涵蓋多個常見場景。由于篇幅限制,剩余的可通過類似模式擴展。 基礎機器人模型定義 # models.py from django.db import modelsclass Robot(models.Model):name = models.C…

周賽98補題

題目意思&#xff1a; 給定一個數字判斷加上自身任意因子數&#xff0c;是否能成為一個奇數。 思路&#xff1a; 我們想一個最簡單的判斷方法&#xff0c; 任意的數字的因子數都有1&#xff0c;故&#xff0c;最簡單的方法就是判斷奇偶。 奇數1成偶數&#xff0c;偶數1成奇…

【STM32】 STM32低功耗模式詳解:睡眠模式與喚醒機制【待測試】

本篇知識點基于F0講解 一、STM32三種低功耗模式參考表格 模式功耗喚醒時間保持狀態典型應用場景睡眠模式中等 (mA級)最短 (μs級)CPU停止&#xff0c;外設保持短暫待機&#xff0c;快速響應停止模式低 (μA級)中等 (ms級)RAM保持&#xff0c;時鐘停止長時間待機&#xff0c;電…

【Vue入門學習筆記】Vue核心語法

目錄 準備工作刪除不需要的代碼 模版語法文本插值使用JavaScript表達式無效寫法原始HTML 屬性綁定簡寫布爾型Attribute動態綁定多個值 準備工作 刪除不需要的代碼 刪除components下的文件 進入App.vue 刪掉代碼&#xff0c;只保留如下內容 <template></template&g…

ClickHouse 窗口分析 argMax() / argMin()

argMin() 是 ClickHouse 中一個非常有用的聚合函數&#xff0c;它可以找出某個列的最小值&#xff0c;并返回該最小值對應的另一個列的值 函數語法 argMin(arg, val) arg&#xff1a;要返回的列&#xff08;當找到最小值時返回該列的值&#xff09; val&#xff1a;用于比較的…

k8s client 通過KubeConfig和證書方式連接api server

一、背景 本文以kubePi這樣一個k8s客戶端為示例,使用證書方式,怎么連接k8s集群。 然后告訴你證書是如何生成的, 最后通過一個Python編程示例,在程序里如何使用。 api server地址:比如https://110.206.56.308:6443 Certificate:證書內容 Certificate Key:證書的私鑰 先…

(2025.07)解決——ubuntu20.04系統開機黑屏,左上角光標閃爍

前面一些碎碎念&#xff1a; 電腦裝的雙系統&#xff0c;之前都還好著&#xff0c;今天突然ubuntu開機的時候黑屏了&#xff0c;左上角有光標在閃爍&#xff0c;也查了一些資料&#xff0c;基本上大家的都是驅動有問題&#xff0c;還有內存問題。&#xff08;個人建議&#xff…

一文講清libmodbus在STM32上基于FreeRTOS的移植

libmodbus 開發庫概述 libmodbus是一個免費的跨平臺支持RTU和TCP的Modbus庫&#xff0c;遵循LGPL V2.1協議。libmodbus支持Linux、 Mac Os X、 FreeBSD、 QNX和Windows等操作系統。 libmodbus可以向符合Modbus協議的設備發送和接收數據&#xff0c;并支持通過串口或者TCP網絡進…

go語言安裝達夢數據完整教程

一、安裝 go-dm 驅動 1. 使用 go get 命令安裝 # 打開PowerShell或命令提示符 go get github.com/dmdbms/go-dm# 若網絡問題&#xff0c;配置代理 go env -w GOPROXYhttps://goproxy.cn,direct2. 驗證驅動安裝 go list -m github.com/dmdbms/go-dm# 預期輸出類似 github.com…

華為云Flexus+DeepSeek征文|基于Dify構建音視頻內容轉錄工作流

華為云FlexusDeepSeek征文&#xff5c;基于Dify構建音視頻內容轉錄工作流 一、構建音視頻內容轉錄工作流前言二、構建音視頻內容轉錄工作流環境2.1 基于FlexusX實例的Dify平臺2.2 基于MaaS的模型API商用服務 三、構建音視頻內容轉錄工作流實戰3.1 配置Dify環境3.2 配置Dify工具…