摘自:
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...