linux核心對網絡卡驅動多佇列的支援

2021-06-22 18:51:07 字數 1134 閱讀 3710

摘自:

linux的招牌就是它強大的網路功能,穩定,高效,能隨著現實的日新月異而日趨完善。眾所周知,linux的網絡卡由結構體net_device表示,一 個該結構體對應乙個可以排程的資料報傳送佇列,注意,這裡不談資料報接收,資料報的實體在核心中以結構體sk_buff表示,這樣的話,上述文字就可以用 以下圖示來表示: 

前面簡要說明了多佇列的意義,在對核心的更改上也很簡單,就是將原先的每個net_device乙個的佇列改為多個就可以了: 

static inline void qdisc_reset_all_tx(struct net_device *dev) 

int dev_queue_xmit(struct sk_buff *skb) 

gso: 

-       txq = &dev->tx_queue; 

+       txq = dev_pick_tx(dev, skb); 

spin_lock_prefetch(&txq->lock); 

/* disable soft irqs for various locks below. also 

@@ -3788,8 +3794,9 @@ static void rollback_registered(struct net_device *dev) 

dev_put(dev); 

} dev_pick_tx之後的一些**就是:

...txq = dev_pick_tx(dev, skb);  //選出乙個佇列,不像以前那樣的直接得到本網絡卡的佇列。

q = rcu_dereference(txq->qdisc);

if (q->enqueue) else

spin_unlock(root_lock);

goto out;

}...

我們看一下dev_pick_tx:

static struct netdev_queue *dev_pick_tx(struct net_device *dev, struct sk_buff *skb)

另外,在網絡卡的hard_start_xmit中,驅動程式可以反饋給排程**是否繼續排程該佇列或者下乙個排程哪個佇列,這些的具體策略全看場景怎麼設定了,linux總是可以在機制和策略之間達到乙個完美的平衡,比如利用一些標誌位之類的小技巧。

linux核心對網絡卡驅動多佇列的支援

linux的招牌就是它強大的網路功能,穩定,高效,能隨著現實的日新月異而日趨完善。眾所周知,linux的網絡卡由結構體net device表示,一 個該結構體對應乙個可以排程的資料報傳送佇列,注意,這裡不談資料報接收,資料報的實體在核心中以結構體sk buff表示,這樣的話,上述文字就可以用 以下圖...

網絡卡多佇列

多佇列指例項規格支援的最大網絡卡佇列數。單個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...