1.網絡卡多佇列
網絡卡多佇列是需要多佇列網絡卡支援的。所謂網絡卡多佇列是網絡卡硬體支援的。
(1)開啟軟體多佇列的方法
(2)檢視軟體多佇列開啟的效果
cat /proc/interrupts | grep eth0
cat /proc/interrupts | grep eth0
2.設定irq affinity的目的
過多的網絡卡收包和發包中斷集中在乙個cpu上,在系統繁忙時,cpu對網絡卡的中斷無法響應,這樣導致了伺服器端的網路效能降低,從這裡可以看出其實網路效能的瓶頸不在於網絡卡,而是cpu,因為現在的網絡卡很多都是萬兆並且多佇列的,如果有過多的中斷集中在乙個cpu上,將導致該cpu無法處理,所以可以使用該方法將網絡卡的中斷分散到各個cpu上。
3.rps/rfs
rps/rfs 功能是在linux- 2.6.35中有google的工程師提交的兩個補丁(
注意,這個功能是在linux核心裡面的,即是軟體層面的),這兩個補丁的出現主要是基於以下兩點現實的考慮:
(1)對於支援多佇列的網絡卡而言,由於伺服器的cpu越來越強勁,可以到達十幾核、幾十核,而網絡卡硬體佇列則才4個、8個,這種發展的不匹配造成了cpu負載的不均衡。也就是,網絡卡硬體佇列少於cpu核數的情況,即使設定了網絡卡的irq affinity,cpu在處理網絡卡請求時,仍然各cpu負載不均衡。
(2)對於不支援網絡卡多佇列的網絡卡而言,即單佇列網絡卡,rps/rfs相當於在系統層用軟體模擬了多佇列的情況,以便達到cpu的均衡。
rps/rfs有稱為是軟體多佇列。
a)rps
rps(receive packet steering)主要是把軟中斷的負載均衡到各個cpu,簡單來說,是網絡卡驅動對每個資料報生成乙個hash標識,這個hash值得計算可以通過四元組來計算(sip,sport,dip,dport),然後由中斷處理的地方根據這個hash標識分配到相應的cpu上去,這樣就可以比較充分的發揮多核的能力了。通俗點來說就是在軟體層面模擬實現硬體的多佇列網絡卡功能,如果網絡卡本身支援多佇列功能的話rps就不會有任何的作用。該功能主要針對單佇列網絡卡多cpu環境,如網絡卡支援多佇列則可使用smp irq affinity直接繫結硬中斷。rps的功能如下圖簡要呈現:
由於rps只是單純把資料報均衡到不同的cpu,這個時候如果應用程式所在的cpu和軟中斷處理的cpu不是同乙個,此時對於cpu cache的影響會很大,那麼rfs(receive flow steering)確保應用程式處理的cpu跟軟中斷處理的cpu是同乙個,這樣就充分利用cpu的cache,這兩個補丁往往都是一起設定,來達到最好的優化效果, 主要是針對單佇列網絡卡多cpu環境。同時開啟了rps/rfs的處理流程簡要如下:
4.設定irq affinity
在smp體系結構中,我們可以通過呼叫系統呼叫和一組相關的巨集來設定 cpu 親和力(cpu affinity),將乙個或多個程序繫結到乙個或多個處理器上執行。中斷在這方面也毫不示弱,也具有相同的特性。中斷親和力是指將乙個或多個中斷源繫結到特定的 cpu 上執行。
開啟網絡卡硬體多佇列後,還要將不同的硬體佇列的irq關聯到不同的cpu上才有效果的,即是irq affinity的設定。
設定的方法:
在 /proc/irq 目錄中,對於已經註冊中斷處理程式的硬體裝置,都會在該目錄下存在乙個以該中斷號命名的目錄 irq# ,irq# 目錄下有乙個 smp_affinity 檔案(smp 體系結構才有該檔案),它是乙個 cpu 的位掩碼,可以用來設定該中斷的親和力, 預設值為 0xffffffff,表明把中斷傳送到所有的 cpu 上去處理。如果中斷控制器不支援 irq affinity,不能改變此預設值,同時也不能關閉所有的 cpu 位掩碼,即不能設定成 0x0。即是我們echo乙個位掩碼就可以設定irq affinity。
綜合來說,網絡卡多佇列的優化就是開啟網絡卡多佇列和irq affinity的結合。當然也可以配置軟體多佇列(pfs/prs).
網絡卡多佇列
多佇列指例項規格支援的最大網絡卡佇列數。單個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...
Linux網路協議棧 多佇列網絡卡原理
背景 近日因公司大促,mysql從伺服器前端共享的一台lvs因流量跑到2gps 而出現 lvs丟包,client端 不停丟擲mysql connect failed異常.故障特徵 大流量時為lvs的cpu其中乙個core使用率100 其他23個core使用率小於10 明顯地 根本原因 lvs使用li...