龍蜥開源核心追蹤利器 Surftrace:協議包解析效率提升 10 倍! | 龍蜥技術
文/系統運維 SIG
一、理解 Linux 核心協議棧
1.1 網路報文分層結構
1.2 sk_buff 結構體
unsignedchar *head, *data;
1.3 核心網路協議棧地圖
不難發現,上圖中幾乎所有函式都涉及到 skb 結構體處理,因此要想深入瞭解網路報文在核心的處理過程,skb->data 應該就是最理想的引路蜂。
二、Surftrace 對網路報文增強處理
-
skb->data 指標在不同網路層指向的協議頭並不固定; -
除了獲取當前結構內容,還有獲取上一層報文內容的需求,比如一個我們在 udphdr結構體中,是無法直接獲取到 udp 報文內容; -
源資料呈現不夠人性化。如 ipv4 報文 IP 是以一個 u32 資料型別,可讀性不佳,過濾器配置困難。
2.1 網路協議層標記處理
staticint__netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc, struct packet_type **ppt_prev);
surftrace 'p __netif_receive_skb_core proto=@(struct iphdr *)l3%0->protocol`
-
可以跨協議層向上解析報文結構體,如在 l3 層去分析 struct icmphdr 中的資料成員 -
不可以跨協議層向下解析報文結構體,如在 l4 層去分析 struct iphdr 中的成員
2.2 擴充下一層報文內容獲取方式
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data=@(struct icmphdr*)l3%0->sdata[1]
2.3 IP 和位元組序模式轉換
字首名 | 資料輸出形式 | 資料長度(位元組) |
ip_ | a.b.c.d | ip字串 |
b16_ | 10 進位制 | 2 |
b32_ | 10 進位制 | 4 |
b64_ | 10 進位制 | 8 |
B16_ | 16 進位制 | 2 |
B32_ | 16 進位制 | 4 |
B64_ | 16 進位制 | 8 |
2.4 牛刀小試
intip_output(struct net *net, struct sock *sk, struct sk_buff *skb)
surftrace 'p ip_output proto=@(struct iphdr*)l3%2->protocol ip_dst=@(struct iphdr*)l3%2->daddr b16_dest=@(struct udphdr*)l3%2->dest comm=$comm body=@(struct udphdr*)l3%2->Sdata[0] f:proto==17&&ip_dst==10.0.1.221&&b16_dest==9988'
surftrace 'p ip_output proto=@(struct iphdr*)l3%2->protocol ip_dst=@(struct iphdr*)l3%2->daddr b16_dest=@(struct udphdr*)l3%2->dest comm=$comm body=@(struct udphdr*)l3%2->Sdata[0] f:proto==17&&ip_dst==10.0.1.221&&b16_dest==9988' echo 'p:f0 ip_output proto=+0x9(+0xe8(%dx)):u8 ip_dst=+0x10(+0xe8(%dx)):u32 b16_dest=+0x16(+0xe8(%dx)):u16 comm=$comm body=+0x1c(+0xe8(%dx)):string' >> /sys/kernel/debug/tracing/kprobe_events echo 'proto==17&&ip_dst==0xdd01000a&&b16_dest==1063' > /sys/kernel/debug/tracing/instances/surftrace/events/kprobes/f0/filter echo 1 > /sys/kernel/debug/tracing/instances/surftrace/events/kprobes/f0/enable echo 0 > /sys/kernel/debug/tracing/instances/surftrace/options/stacktrace echo 1 > /sys/kernel/debug/tracing/instances/surftrace/tracing_on <...>-2733784 [014] .... 12648619.219880: f0: (ip_output+0x0/0xd0) proto=17 ip_dst=10.0.1.221 b16_dest=9988 comm="nc" body="Hello World\! @"
三、實戰:定位網路問題
3.1 問題背景
3.2 surftrace 跟蹤
surftrace 'p dev_queue_xmit proto=@(struct iphdr *)l2%0->protocol ip_dst=@(struct iphdr *)l2%0->daddr f:proto==1&&ip_dst==192.168.1.3' -s
3.3 鎖定丟包點
rc = q->enqueue(skb, q, &to_free) & NET_XMIT_MASK;
surftrace 'p dev_queue_xmit+678 pfun=%bx'
四、總結
參考文獻、相關連結及加入系統運維SIG方式、或程式碼不清楚均處可移步龍蜥公眾號(OpenAnolis龍蜥)2022年5月11日相同推送檢視。
—— 完 ——
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004278/viewspace-2893682/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 入門即享受!coolbpf 硬核提升 BPF 開發效率 | 龍蜥技術
- 龍蜥開源Plugsched:首次實現 Linux kernel 排程器熱升級 | 龍蜥技術Linux
- 龍蜥利器:系統運維工具 SysAK的雲上應用效能診斷 | 龍蜥技術運維
- 萬里資料庫加入龍蜥社群,打造基於“龍蜥+GreatSQL”的開源技術底座資料庫SQL
- 助力Koordinator雲原生單機混部,龍蜥混部技術提升CPU利用率達60%|龍蜥技術
- 效能提升 57% ,SMC-R 透明加速 TCP 實戰解析 | 龍蜥技術TCP
- 技術門檻高?來看 Intel 機密計算技術在龍蜥社群的實踐 | 龍蜥技術Intel
- 龍蜥社群高效能儲存技術 SIG 11 月運營回顧 | 龍蜥 SIG
- 利器解讀!Linux 核心調測中最最讓開發者頭疼的 bug 有解了|龍蜥技術Linux
- 龍蜥社群&龍蜥開發者獲CSDN2021年度技術影響力「年度開源專案」獎和「年度社群之星」
- 龍蜥社群&龍蜥理事長分獲 2023 開源創新榜“優秀開源社群、優秀開源人物”獎項
- SysOM 案例解析:消失的記憶體都去哪了 !| 龍蜥技術記憶體
- eBPF 雙子座:天使 or 惡魔?| 龍蜥技術eBPF
- 載入速度提升 15%,關於 Python 啟動加速探索與實踐的解析 | 龍蜥技術Python
- 跨語言程式設計的探索 | 龍蜥技術程式設計
- 開源創新 源起潮“蜥”——龍蜥社群走進浪潮資訊 MeetUp 即將開幕
- 龍蜥LoongArch架構研發全揭秘,龍芯開闢龍騰計劃技術合作新正規化架構
- InfoQ專訪龍蜥社群陳緒:從CentOS 停服說起,龍蜥作業系統的開源觀CentOS作業系統
- 龍蜥開發者說:我眼裡的龍蜥社群:一個包容的大家庭 | 第 10 期
- 「龍蜥開發者說」徵稿啦!
- 晟盾科技加入龍蜥社群,共建開源新生態
- 永中軟體加入龍蜥社群,共建開源新生態
- 龍蜥社群成立雲原生 SIG,引入 3 大核心技術,共建雲原生生態
- 喜報!龍蜥作業系統&龍蜥社群雙雙榮登2021“科創中國”開源創新榜!作業系統
- 龍頭整機廠商寶德加入,共建龍蜥社群開源新生態
- 聊一聊龍蜥硬體相容性 SIG 那些事兒 | 龍蜥 SIG
- 鑑釋加入龍蜥社群,助力開源生態建設
- 龍蜥理事長馬濤榮獲 “2022 年度開源人物”
- 龍蜥白皮書精選:面向 DPU 場景的軟硬協同協議棧協議
- 開箱即用!Linux 核心首個原生支援,讓你的容器體驗飛起來!| 龍蜥技術Linux
- 龍蜥開發者說:首次觸電,原來你是這樣的龍蜥社群? | 第 8 期
- 中電科技加入龍蜥社群,助力開源生態建設
- 螞蟻安全科技 Nydus 與 Dragonfly 映象加速實踐 | 龍蜥技術Go
- 基於 Coolbpf 的應用可觀測實踐 | 龍蜥技術
- 浪潮資訊 KOS 助力企業核心業務完成 CentOS 遷移替換,效能提升 10%|龍蜥案例CentOS
- 提升龍蜥核心測試能力!探究持續性模糊測試最佳化實踐
- 雙龍賀歲,龍蜥 LoongArch GA 版正式釋出
- 華創視訊加入龍蜥社群,攜手共建開源新生態