『壹』 一文看懂linux 內核網路中 RPS/RFS 原理
Linux內核中的RPS/RFS原理解析
在理解Linux內核網路中RPS(Round Robin Packet Scheling)和RFS(Round Robin Flow Scheling)原理之前,需先認識到基於簡單中斷負載均衡(如系統自帶的irqbalance進程)可能產生的問題。這些負載均衡器識別的是數據包,而不是數據包的元組信息,無法識別網路流。因此,多處理器系統中,數據包需要被分配給特徵相似的CPU進行處理,以降低CPU硬體高速緩存的刷新頻率。
在多處理器系統中,每個處理器擁有單獨的硬體高速緩存。當其中一個CPU修改了自己的硬體高速緩存,它必須通知其他CPU更新緩存,以保證緩存一致性。這樣,CPU間的數據一致性問題需要解決,以避免數據亂序導致的重傳問題。當Linux主機作為路由器時,進入系統的一個TCP包的不同分段如果被不同的CPU處理並向一個網卡轉發,同步問題將變得復雜,這與一個CPU串列處理相比,效果更差。
RPS/RFS旨在解決上述問題,需要解決三個關鍵問題:數據包如何更高效地分配給CPU、TCP/IP包分段重組同步問題、以及如何確保數據流處理的一致性。
在Linux底層,數據結構隱藏了許多機密信息,包括面向對象的設計。以下是對關鍵數據結構的解析:
- 網卡的硬體接收隊列(netdev_rx_queue):存放解析結果,其中cpus數組記錄參與報文分發處理的CPU數組,len成員表示cpus數組的長度。
- CPU負載表(rps_map):存放解析結果的容器,用於管理分配給CPU的數據包。
- 設備流表(rps_dev_flow_table):由mask成員控制流表項的數量,通過配置文件指定。
- 全局數據流表(rps_sock_flow_table):包含處理數據流的CPU信息,通過調用recvmsg、sendmsg等函數更新。
RPS工作流程如下:將數據包加入其他CPU的接收隊列,這些CPU在軟中斷中執行process_backlog,接收隊列中的所有數據包並調用__netif_receive_skb進行後續操作。
Linux通過配置文件指定參與報文分發處理的CPU列表,路徑為/sys/class/net/(dev)/queues/rx-(n)/rps_cpus。內核根據配置生成用於處理報文的CPU列表,實現基於報文哈希值的負載均衡。RPS不關注處理該流中報文的應用程序所在CPU,但有NAPI介面的驅動中,上半部主要將設備加入到CPU私有數據待輪詢列表,下半部從網卡緩沖區獲取報文。
函數get_rps_cpu在netif_rcv_skb調用,獲取目標CPU,將其加入到CPU私有數據對象的input_pkt_queue隊列中。數據對象中的backlog成員類型為struct napi_struct,在enqueue_to_backlog函數中,將backlog加入待輪詢列表,觸發軟中斷處理,最後從input_pkt_queue隊列中取出報文並上報協議棧。
RFS作為RPS的改進,在RPS的基礎上,將同一流的數據包分發給同一個CPU核,但有可能導致處理該數據流的應用程序CPU核和實際執行處理的CPU核不同,導致緩存不命中問題。RFS通過指派應用程序所在CPU在內核態處理報文,增加緩存命中率,主要差別在於選擇分發處理報文的目標CPU。
RFS實現通過設備流表和全局socket流表的記錄比較,判斷處理報文的CPU核是否一致。如果當前CPU表對應表項未設置或CPU核離線,使用期望CPU表對應表項映射的CPU核。如果當前和期望CPU核不同,RFS會使用設備流表和全局流表設置的CPU核。未設置時,使用RPS策略中的CPU流表或返回無效CPU_index。
配置方法:RPS和RFS在Linux kernel 2.6.35及以上版本中默認關閉,可通過/sys/class/net/(dev)/queues/rx-(n)/rps_cpus設置RPS接收隊列和CPU列表,/sys/class/net/(dev)/queues/rx-(n)/rps_flow_cnt設置設備流表數量,/proc/sys/net/core/rps_sock_flow_entries設置全局數據流表數量。
『貳』 Linux 網路調優:內核網路棧參數篇
Linux 網路優化:內核網路參數詳解
在 Linux 網路優化中,了解並合理調整內核參數是關鍵。本文將從網路架構入手,詳細解讀一些常用的內核網路參數及其作用、注意事項。
Linux 網路架構
Linux 網路優化是高性能伺服器中的重要部分,本文主要聚焦於協議棧的配置。關鍵參數涉及網路幀處理、緩存管理、隊列控制等。
關鍵參數詳解
1. **/proc/net/softnet_stat**:該文件記錄內核網路狀態,包括已處理幀數、丟包數、NAPI 中的預算或時間限制退出次數等。注意,描述中省略了 NAPI 的配置項和 CPU 分配問題。
2. **backlog 隊列和緩存**:
- **net.ipv4.tcp_rmem** 和 **net.ipv4.tcp_wmem**:定義了收發緩沖區大小,參數分為最低、默認、最大值。建議根據可用內存動態調整,避免過大影響擁塞控制。
- **net.core.rmem** 和 **net.core.wmem**:為全局收發緩沖區參數,確保緩沖區大小適中,避免 bufferbloat 問題。
- **net.core.netdev_max_backlog**:網路設備接收緩沖隊列長度,與中斷頻率共同影響收包速度和吞吐量。
- **net.ipv4.tcp_max_syn_backlog** 和 **net.ipv4.tcp_syncookies**:控制 SYN 請求隊列長度和 SYN 包處理,對於高並發服務至關重要。
3. **TIME_WAIT 相關**:
- **TIME_WAIT**:原為避免連接混淆,持續時間固定為60秒,對於高 QPS 網路中可能影響連接建立。服務端使用 RST 關閉連接有助於緩解此問題。
- **net.ipv4.tcp_max_tw_buckets**:定義系統能同時保持的 TIME_WAIT socket 數量上限。
- **net.ipv4.tcp_tw_reuse** 和 **net.ipv4.tcp_tw_recycle**:與 TCP 時間戳相關,影響 TIME_WAIT socket 復用。4.12 內核後,此配置項被廢棄。
4. **流控和擁塞控制**:
- **net.ipv4.tcp_congestion_control**:用於調整擁塞控制演算法,bbr 演算法適合長胖管道,但不適用於所有網路環境。
- **net.core.default_qdisc**:隊列控制,選擇適合終端用戶或轉發設備的 qdisc,如 fq、codel 等。
- **net.ipv4.tcp_window_scaling**:啟用窗口擴展,允許在長延遲網路中實現更大窗口大小。
5. **TCP keepalive**:
- **net.ipv4.tcp_keepalive_time**、**net.ipv4.tcp_keepalive_intvl** 和 **net.ipv4.tcp_keepalive_probes**:配置 keepalive 功能,避免長時間空閑的連接干擾網路。
總結與建議
合理配置上述內核網路參數,結合具體應用場景和硬體配置,能顯著優化網路性能。確保參數調整時充分考慮系統的負載平衡和資源使用效率,避免引入不必要的延遲和瓶頸。
『叄』 Linux查看網卡隊列信息指南linux查看網卡隊列
Linux是一個愛好者和程式文件和性能的熱門運行系統,因此,查看有關網卡的信息是一個很常見的任務。在Linux操作系統中可以使用各種指令來查看網卡隊列信息。
要查看每個網卡隊列的信息,可以使用ethtool來檢查:
$ ethtool -l eth0
該指令將顯示每個網卡隊列的信息,包括隊列ID,類型,數據流模式,等待模式,順序模式,工作者隊列數量和工作者隊列每次事件最大數量。
此外,可以使用以下指令查看每個 NIC 隊列的設置:
$ ethtool –g eth0
該指令顯示每個網卡隊列的突發和常見的參數,Sunyan Linux中的文件系統在不同的狀態下提供不同的封裝大小以滿足具體的應用需要以及更高的突發性能。
此外,還可以使用以下指令查看每個網卡隊列的”累計活動”或突發數據總量:
$ ethtool -S eth0
該指令將顯示每個網卡隊列的累計活動點數,如發送,接收,碎片,丟失碎片和重發比特率,One way用戶保護系統採用時間和頻寬控制以允許合理的網路資源分享,從而提高網路效率。可以使用它們來監控網路的性能,此外,還可以查看每個網卡隊列的總裝箱數量:
$ ethtool -c eth0
提供的訊息將包括總接收裝箱數量,總發送裝箱數量和每個工作者網卡隊列裝箱數量。
通過使用以上指令,Linux用戶可以輕松查看網卡隊列信息,用於控制網路流量和解決網路問題。這些指令非常容易學習,用於觀測網路性能,並對其性能做出適當的調節。