Linux網路協議棧 多佇列網絡卡原理

2021-07-31 11:58:23 字數 1109 閱讀 7777

背景: 近日因公司大促, mysql從伺服器前端共享的一台lvs因流量跑到2gps 而出現 lvs丟包, client端**不停丟擲mysql connect failed異常. 

故障特徵:大流量時為lvs的cpu其中乙個core使用率100%, 其他23個core使用率小於10% ; 明顯地 

根本原因: lvs使用linux核心為2.6.18, kernel處理入站資料報時全部交給乙個核心處理;  

解決方法: 公升級os為kernel 2.6.32以上版本, 使用支援msi-x網絡卡(現市面大部分機型如dell r730、hp dl580都支援), lvs軟體調優

優化效果: top的si%(軟中斷)平均分布到所有核心, 單機承載力上公升400%, new_connection處理能力從3w上公升到20w, 流量承載力從700m上公升到1500m. 

2.1  網絡卡預先在ram分配多個ring_buffer佇列, 每佇列繫結乙個cpu(/proc/irq/$/smp_affinity

2.2  網絡卡收到資料報, 儲存在 nic的 internal buffer(64k), 

2.3  網絡卡根據hash演算法, 通過dma將skb儲存到多個ring_buffer佇列中的乙個(假設此佇列繫結irq為irq100, 繫結cpu核心為 core-03),  

2.4 網絡卡使用irq100 中斷號hardirq通知core-03(irq-handler)ring的資料就緒. 

2.5 core-03(driver)啟動napi處理ring內資料(skb), 此過程為軟中斷

2.6 napi將處理後的skb交給網路協議棧(ip_rcv,tcp_rcv處理), 且儲存在socket_buffer區

2.7 應用程式用read方法讀取socket_buffer區就緒的資料報. 

關鍵資訊:  

napi:  2.5核心版本引入的網路子系統, 提供給driver的介面; 

優點: 傳統intterrupt每個資料要中斷一次cpu, napi改為一次中斷消費n個資料報(budget), 大大減少中斷數量; 

適用場景: 大量小包的環境. 

網絡卡多佇列

多佇列指例項規格支援的最大網絡卡佇列數。單個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核心網路協議棧 網絡卡報文收發(十六)

linux版本 3.10.103 網絡卡驅動 ixgbev 網絡卡驅動預設採用的是napi的報文處理方式。即中斷 輪詢的方式,網絡卡收到乙個報文之後會產生接收中斷,並且遮蔽中斷,直到收夠了netdev max backlog個報文 預設300 或者收完網絡卡上的所有報文之後,重新開啟中斷。網絡卡啟用...