多佇列網絡卡是一種技術,最初是用來解決網路io qos (quality of service)問題的,後來隨著網路io的頻寬的不斷提公升,單核cpu不能完全處滿足網絡卡的需求,通過多佇列網絡卡驅動的支援,將各個佇列通過中斷繫結到不同的核上,以滿足網絡卡的需求。
常見的有intel的82575、82576,boardcom的57711等,下面以公司的伺服器使用較多的intel 82575網絡卡為例,分析一下多佇列網絡卡的硬體的實現以及linux核心軟體的支援。
圖1.1是intel 82575硬體邏輯圖,有四個硬體佇列。當收到報文時,通過hash包頭的sip、sport、dip、dport四元組,將一條流總是收到相同的佇列。同時觸發與該佇列繫結的中斷。
圖1.1 82575硬體邏輯圖
rss(receive side scaling)是一種能夠在多處理器系統下使接收報文在多個cpu之間高效分發的網絡卡驅動技術。
網絡卡對接收到的報文進行解析,獲取ip位址、協議和埠五元組資訊
網**過配置的hash函式根據五元組資訊計算出hash值,也可以根據
二、三或四元組進行計算。
取hash值的低幾位(這個具體網絡卡可能不同)作為reta(redirection table)的索引
根據reta中儲存的值分發到對應的cpu
下圖描述了完整的處理流程:
基於rss技術程式可以通過硬體在多個cpu之間來分發資料流,並且可以通過對reta的修改來實現動態的負載均衡。
dpdk支援設定靜態hash值和配置reta。 不過dpdk中rss是基於埠的,並根據埠的接收佇列進行報文分發的。 例如我們在乙個埠上配置了3個接收佇列(0,1,2)並開啟了rss,那麼 中就是這樣的:
執行在不同cpu的應用程式就從不同的接收佇列接收報文,這樣就達到了報文分發的效果。
在dpdk中通過設定rte_eth_conf中的mq_mode欄位來開啟rss功能, rx_mode.mq_mode = eth_mq_rx_rss。
當rss功能開啟後,報文對應的rte_pktmbuf中就會存有rss計算的hash值,可以通過pktmbuf.hash.rss來訪問。 這個值可以直接用在後續報文處理過程中而不需要重新計算hash值,如快速**,標識報文流等。
reta是執行時可配置的,這樣應用程式就可以動態改變cpu對應的接收佇列,從而動態調節報文分發。 具體通過pmd模組的驅動進行配置,例如ixgbe_dev_rss_reta_update和ixgbe_dev_rss_reta_query。
在網路應用中,如果同乙個連線的雙向報文在開啟rss之後被分發到同乙個cpu上處理,這種rss就稱為對稱rss。 對於需要為連線儲存一些資訊的網路應用來說,對稱rss對效能提公升有很大幫助。 如果同乙個連線的雙向報文被分發到不同的cpu,那麼兩個cpu之間共享這個連線的資訊就會涉及到鎖,而鎖顯然是會影響效能的。
rss一般使用toeplitz雜湊演算法,該演算法有兩個輸入:乙個預設的hash key和從報文中提取的五元組資訊。 dpdk使用的預設hash key是微軟推薦的,具體定義見lib/librte_pmd_e1000/igb_rxtx.c:1539, 同乙個連線的不同方向使用這個預設值計算出來的hash值是不一樣的。
具體講就是和 計算出來的hash值是不一樣的,hash值不一樣就會導致兩個方向的報文被分發到不同的接收佇列,由不同的cpu進行處理。
網絡卡多佇列
多佇列指例項規格支援的最大網絡卡佇列數。單個ecs例項vcpu處理網路中斷存在效能瓶頸時,您可以將例項中的網路中斷分散給不同的cpu處理。經測試,在相同的網路pps和網路頻寬的條件下,與1個佇列相比,2個佇列最多可提公升效能達50 到100 4個佇列的效能提公升更大。如果您使用的映象已預設開啟網絡卡...
lvs 網絡卡多佇列
bin bash 平均繫結cpu到網絡卡多個佇列上,避免單核cpu跑滿的問題 ipmi cpu高 f sys module ipmi si parameters kipmid max busy us echo 10 sys module ipmi si parameters kipmid max b...
DPDK 18 11下網絡卡配置RSS支援的特性
測試使用i350及i211網絡卡,有效值為0x38d34,二進位制為111000110100110100,對應巨集定義為 define eth rss e1000 igb eth rss ipv4 eth rss nonfrag ipv4 tcp eth rss nonfrag ipv4 udp e...