那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

linux網絡棧監控及調優:數據接收

Linux閱碼場 ? 來源:窗有老梅 ? 2023-03-25 16:44 ? 次閱讀

4. 初始化

b5041890-cae8-11ed-bfe3-dac502259ad0.jpg

圖 1 網絡設備在 packet 到達并需要處理時,通常會觸發一個 IRQ。IRQ 處理函數是在很高的優先級下執行的,一般會阻塞其他 IRQs 的觸發(譯者注:often blocks additional IRQs from being generated。個人覺得原文這里并不準確,中斷上下文中關中往往只是讓 CPU 不響應中斷,而不是讓其他設備直接不發出中斷)。故而,設備驅動中的 IRQ 處理函數必須越快越好,并將比較耗時的工作挪到中斷上下文之外去執行,這就是為啥會有軟中斷系統。

linux 內核軟中斷系統支持在設備驅動的中斷上下文之外處理工作。網絡設備場景下,軟中斷系統用作處理 incoming packets。內核在 boot 階段做軟中斷系統的初始化。 圖 1 對應前文“軟中斷”一節,展示的是軟中斷系統及其 per-CPU 內核線程的初始化。 軟中斷系統的初始化流程如下:

spawn_ksoftirqd(kernel/softirq.c)調用 smpboot_register_percpu_thread(kernel/smpboot.c)創建軟中斷內核線程(每個 CPU 一個)。如代碼所示,run_ksoftirqd 作為 smp_hotplug_thread 的 thread_fn,會在一個 loop 中被執行。

ksoftirqd 線程會在 run_ksoftirqd 中運行其 processing loop。

隨后,創建 softnet_data 數據結構(前文“struct softnet_data 數據結構初始化”一節),每個 CPU 一個。此數據結構包含在網絡數據處理時所需要的重要信息。另外還有一個 poll_list,下文會說。設備驅動調用 napi_schedule 或其他 NAPI APIs,將 NAPI poll 數據結構添加至 poll_list 上。

net_dev_init 調用 open_softirq 向軟中斷系統注冊 NET_RX_SOFTIRQ 軟中斷,被注冊的軟中斷處理函數是 net_rx_action(前文“軟中斷處理函數初始化”一節)。軟中斷內核線程會調用此函數來處理 packets。

圖 1 中的第 5 - 8 步與數據的到達有關,下一節會說。

5. 數據到達

b536fc38-cae8-11ed-bfe3-dac502259ad0.jpg

圖 2 數據從網絡上來了(前文“數據到達”一節)! 網絡數據到達 NIC 時,NIC 會通過 DMA 將 packet 數據寫入 RAM。igb 網絡驅動會在 RAM 中構建一個 ring buffer,其指向接收到的 packets。值得注意的是,有些 NIC 支持 "multiqueue",這些 NIC 可以使用多個處理器來處理 incoming 網絡數據(前文“準備從網絡接收數據”一節)。

簡化起見,圖 2 只畫了一個 ring buffer,但取決于 NIC 以及硬件配置,你的系統可能使用的是多個隊列。 下面流程的細節參閱前文“數據到達”一節。 我們來過一遍數據接收流程:

數據從網絡到達 NIC。

NIC 通過 DMA 將網絡數據寫入 RAM。

NIC 觸發一個 IRQ。

執行設備驅動注冊的 IRQ 處理函數(前文“中斷處理”一節)。

NIC 清除 IRQ,這樣新 packet 到來時可以繼續觸發 IRQs。

調用 napi_schedule 拉起 NAPI 軟中斷 poll loop(前文“NAPI 與 napi_schedule”一節)。

napi_schedule 的調用觸發了 圖 1 中的 5 - 8 步。如后面所見,NAPI 軟中斷 poll loop 拉起的原理,就是翻轉一個 bit 域,并向 poll_list 上添加一個數據結構。napi_schedule 沒干什么其他事,這就是驅動將處理工作轉交給軟中斷系統的原理。

繼續分析 圖 1,對照圖中相應的數字:

驅動調用 napi_schedule 將驅動的 NAPI poll 數據結構添加至當前 CPU 的 poll_list 上。

軟中斷 pending bit 會被置上,如此該 CPU 上的 ksoftirqd 線程知曉有 packets 需要處理。

執行 run_ksoftirqd 函數(在 ksoftirqd 內核線程的 loop 中執行)。

調用 __do_softirq 檢查是否有 pending 的 bit 域,以此確認是否有 pending 的軟中斷,進而調用 pending 軟中斷的處理函數:net_rx_action,該函數干了所有的 incoming 網絡數據處理的臟活。

需要注意的是,軟中斷內核線程執行的是 net_rx_action,而不是設備驅動的 IRQ 處理函數。

6. 網絡數據處理的開始

b556db02-cae8-11ed-bfe3-dac502259ad0.jpg

圖 3 至此開始數據的處理。net_rx_action 函數(在 ksoftirqd 內核線程中調用)會執行當前 CPU poll_list 上注冊的 NAPI poll 數據結構。poll 數據結構的注冊一般有兩種情況:

設備驅動調用 napi_schedule。

Receive Packet Steering 場景(前文“Receive Packet Steering(RPS)”一節)下使用 Inter-processor Interrupt。

我們將從 poll_list 獲取驅動 NAPI 數據結構的流程串起來(下一節會講 RPS 是怎么通過 IPIs 注冊 NAPI 數據結構的)。 圖 3 流程在前文有詳細拆解過,總結一下就是:

net_rx_action poll 檢查 NAPI poll list 中的 NAPI 數據結構。

校驗 budget 及消耗的時間,以確保軟中斷不會霸占 CPU。

調用注冊的 poll 函數(前文“NAPI poll 函數及權重”一節)。本文場景下,igb 驅動注冊的是 igb_poll 函數。

驅動的 poll 函數收取 RAM ring buffer 中的 packets(前文“NAPI poll”一節)。

packets 進一步給到 napi_gro_receive,其可能會進一步被 Generic Receive Offloading 處理(前文“Generic Receive Offloading(GRO)”一節)。

packets 要么被 GRO 處理,這樣整個調用鏈也就結束了;要么 packets 通過 net_receive_skb 進一步給到上層協議棧。

下面會講 net_receive_skb 是怎么實現 Receive Packet Steering,也就是在多個 CPUs 之間分發 packet 的。

7. 網絡數據的進一步處理

b55fbea2-cae8-11ed-bfe3-dac502259ad0.jpg

圖 4 從 netif_receive_skb 開始繼續網絡數據的處理,數據的具體路徑取決于是否使能了 Receive Packet Steering(RPS)。一個“開箱即用”的 linux 內核(譯者注:意思就是通用的發行版)默認是不使能 RPS 的,如果你想用 RPS,就必須顯式地配置及使能之。

RPS 禁能的情況下(前文“禁能 RPS 場景(默認配置)”一節),對應 圖 4 中的如下數字:

1. netif_receive_skb 將數據給到 __netif_receive_core。

6. __netif_receive_core 將數據給到系統中可能存在的 taps(前文“packet tap 投遞”一節)(比如 PCAP,https://www.tcpdump.org/manpages/pcap.3pcap.html)。

7. __netif_receive_core 將數據給到協議層注冊的 handlers(前文“協議層投遞”一節)。大多數情況下,此 handler 是 IPv4 協議棧所注冊的 ip_rcv 函數。

RPS 使能的情況下(前文“使能 RPS 場景”一節):

netif_receive_skb 將數據給到 enqueue_to_backlog。

packets 會被送到 per-CPU 的輸入隊列上以待后續處理。

將遠端 CPU 的 NAPI 數據結構添加至該遠端 CPU 的 poll_list 上,并向該 CPU 發一個 IPI,進而喚醒遠端 CPU 上的軟中斷內核線程(如果其并未在運行的話)。

當遠端 CPU 上的 ksoftirqd 內核線程運行起來后,其處理模式與上一節中的相同,不同之處是,注冊進來的 poll 函數是 process_backlog,該函數會從當前(譯者注:本 CPU) CPU 的輸入隊列收取 packets。

packets 進一步給到 __net_receive_skb_core。

__net_receive_skb_core 將數據給到系統中可能存在的 taps(前文“packet tap 投遞”一節)(比如 PCAP)。

__net_receive_skb_core 將數據給到協議層注冊的 handlers(前文“協議層投遞”一節)。大多數情況下,此 handler 是 IPv4 協議棧所注冊的 ip_rcv 函數。

8. 協議棧及用戶 sockets

數據接下來要走的路徑是:協議棧、netfilter、Berkeley Packet Filters,最終到達用戶 socket。 雖然代碼路徑挺長的,但是邏輯是直白清晰的。 網絡數據路徑更詳細地拆解見前文“協議層注冊”一節。下面是 high level 的簡要總結:

IPv4 協議層通過 ip_rcv 收取 packets。

會做 netfilter 以及路由優化。

目標是本機的數據,會進一步給到更 high level 的協議層,比如 UDP。

UDP 協議層通過 udp_rcv 收取 packets,并通過 udp_queue_rcv_skb 及 sock_queue_rcv 將數據入隊到用戶 socket 的接收 buffer 中。在入隊到接收 buffer 之前,會做 Berkeley Packet Filters。

值得注意的是,netfilter 在這個過程中會被調用多次,具體位置參考前文的詳細拆解(前文“協議層注冊”一節)。

9. 總結

linux 網絡棧極其復雜,涉及到的系統很多。如果要監控這個復雜的系統就必須得搞清楚這些系統之間是怎么交互的,以及對某一系統配置的調整,會如何影響到其他系統。本文作為前文的補充,試圖把這些問題梳理的更清晰易懂一些。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10905

    瀏覽量

    213030
  • Linux系統
    +關注

    關注

    4

    文章

    596

    瀏覽量

    27510
  • IRQ
    IRQ
    +關注

    關注

    0

    文章

    16

    瀏覽量

    10797
  • 中斷系統
    +關注

    關注

    1

    文章

    96

    瀏覽量

    61071

原文標題:圖解之 linux 網絡棧監控及調優:數據接收

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    深度解析Linux網絡路徑及sk_buff struct 數據結構

    的 Segmentation Offloading 技術(接收端) 1. Linux 網絡路徑 1.1 發送端 1.1.1 應用層 (1) Socket 應用層的各種網絡應用程序基本上
    的頭像 發表于 10-22 15:04 ?5672次閱讀
    深度解析<b class='flag-5'>Linux</b><b class='flag-5'>網絡</b>路徑及sk_buff struct <b class='flag-5'>數據</b>結構

    Linux網絡原理與實現

    本文嘗試從技術研發與工程實踐(而非純理論學習)角度,在原理與實現、監控告警、 配置調三方面介紹內核5.10 網絡。由于內容非常多,因此分
    發表于 08-10 08:58 ?3805次閱讀

    基于全HDD aarch64服務器的Ceph性能調實踐總結

    提升吞吐率。- Linux內核中有很多網絡相關的參數,我們可以根據不同的應用場景,不同的塊大小來調整這些網絡參數,以達到最優的性能。- 中斷也是網絡
    發表于 07-05 14:26

    infosphere CDC 性能調及MC性能指標監控

    infosphere CDC 性能調及MC性能指標監控
    發表于 09-07 09:26 ?4次下載
    infosphere CDC 性能<b class='flag-5'>調</b><b class='flag-5'>優</b>及MC性能指標<b class='flag-5'>監控</b>

    機器學習如何調數據

    在延遲方面,相比 Postgres 默認配置,OtterTune、調工具、DBA 和 RDS 的配置獲得了近似的提升。我們大概可以把這歸于 OLTP-Bench 客戶端和 DBMS 之間的網絡開銷
    發表于 11-07 13:50 ?1177次閱讀
    機器學習如何<b class='flag-5'>調</b><b class='flag-5'>優</b><b class='flag-5'>數據</b>庫

    如何對電機進行調?調的好處是什么?

    如何自動對電機進行調
    的頭像 發表于 08-22 00:03 ?3187次閱讀

    Linux網絡接收過程的監控調

    、ksoftirqd軟中斷處理幾個過程。其中在ksoftirqd軟中斷處理中,把數據包從RingBuffer中摘下來,送到協議的處理,再之后送到用戶進程socket的接收隊列中。 圖1 Li
    的頭像 發表于 11-10 14:50 ?1718次閱讀

    Linux查看資源使用情況和性能調常用的命令

    ,包括進程、線程、程序堆棧、內存、Swap、CPU調度、內存調度、網絡連接和IO讀寫等。 本文介紹了Linux查看資源使用情況和性能調常用的命令,包括top、htop、ps、free
    的頭像 發表于 11-12 17:54 ?4275次閱讀

    Linux用電功耗調的筆記分享

    整理一些Linux用電功耗調的筆記,分享給小伙伴,關于用電調個人覺得
    的頭像 發表于 06-23 15:19 ?4214次閱讀

    Linux性能調常見工具和堆棧解析

    ? Linux系統性能調涉及多個方面,包括內核參數調整、文件系統優化、網絡設置等。 ? 1. 內核參數調整:通過調整內核參數來提高系統性能。例如,調整進程調度策略、內存管理參數等。
    的頭像 發表于 06-29 09:45 ?999次閱讀
    <b class='flag-5'>Linux</b>性能<b class='flag-5'>調</b><b class='flag-5'>優</b>常見工具和堆棧解析

    Linux網絡技術的相關知識

    網絡是一個很復雜的協議,今天網絡這么發達,網絡協議起到關鍵性作用。 這里就給大家詳細描述一下:Linux
    的頭像 發表于 08-24 10:33 ?704次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>網絡</b>技術<b class='flag-5'>棧</b>的相關知識

    jvm調參數

    JVM(Java虛擬機)是Java程序的運行環境,它負責解釋Java字節碼并執行相應的指令。為了提高應用程序的性能和穩定性,我們可以調JVM的參數。 JVM調主要涉及到堆內存、垃圾
    的頭像 發表于 12-05 11:29 ?696次閱讀

    jvm調主要是調哪里

    JVM調主要涉及內存管理、垃圾回收、線程管理與鎖優化等方面。下面將詳細介紹每個方面的調技術和策略以及如何進行優化。 內存管理 JVM的內存管理主要包括堆內存、
    的頭像 發表于 12-05 11:37 ?1607次閱讀

    jvm調工具有哪些

    JVM調是提高Java應用程序性能的重要手段,而JVM調工具則是輔助開發人員進行調工作的利
    的頭像 發表于 12-05 11:44 ?1168次閱讀

    Linux網絡協議的實現

    網絡協議是操作系統核心的一個重要組成部分,負責管理網絡通信中的數據包處理。在 Linux 操作系統中,
    的頭像 發表于 09-10 09:51 ?368次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>網絡</b>協議<b class='flag-5'>棧</b>的實現
    百家乐官网小音箱| 菲律宾百家乐官网太阳城| 百家乐网址是多少| 百家乐官网有赢钱公式吗| 赌场百家乐怎么破解| 百家乐官网赌博游戏| 德州扑克在线游戏| 百家乐出千赌具| 百家乐官网高档筹码| 太阳城娱乐城官方网站| 网上赌百家乐的玩法技巧和规则| 百家乐官网必胜法技巧| 陆河县| 大发888 备用6222.co| 百家乐天下| 大发888娱乐场漏洞| 百家乐官网电子路单下载| 星期八娱乐| 注册娱乐城送体验金| 网上老虎机游戏| 真人百家乐官网ea平台| 百家乐机器图片| 百家乐娱乐平台官网网| 百家乐的玩法和技巧| 威尼斯人娱乐城排名| 华泰百家乐的玩法技巧和规则| 百家乐破解方法技巧| 百家乐输了100万| 百家乐破解打法| 现金百家乐人气最高| 百家乐官网庄闲的分布| 星河百家乐现金网| 百家乐娱乐皇冠世界杯| 澳门百家乐什么规则| 奔驰百家乐游戏电玩| 云赢百家乐分析| 巴西百家乐的玩法技巧和规则| 大发888娱乐场下载 zhldu| 百家乐平台| 千亿国际娱乐城| 百家乐官网真钱路怎么看|