天天看點

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

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

所謂的網卡對發送資料包的排程指的是多個資料包共享一個網卡的規則,當然就要擁有一系列的約定,比如區分資料包的優先級,區分資料包的類型,核心根據不同的排程政策來對不同的資料包進行排隊,然後按照隊列的順序進行發送,關于這些細節不是本文要讨論的内容,可以參考linux核心對網絡流量控制的支援方面的資料,需要明白的是,以往不支援多隊列的核心中每個網卡擁有一個排隊規則,然後根據排隊規則的過濾器将資料包區分為一個一個的類,類中還可以嵌套新的更 細的排隊規則,這個過程可以看到是以網卡為中心的,因為是每網卡一隊列,這個隊列指的是根隊列,以網卡為中心實際上是一種過時的方式,還可以看成是以現在的觀點來看偷懶的方式,畢竟網卡是核心和整個系統中的靜态資料,是完全可以把握的,可是這已經不能适合當今的網絡應用了,當今是一個必須适應大環境的世界 而不再是局部意義上的入鄉随俗的世界了,豐富的資料沒有必要入linux網卡的鄉随網卡唯一的根隊列的俗了,取而代之的是必須為豐富的網絡資料提供屬于它 們自己的舞台而不是逼迫它們強擠到網卡的根隊列等待排程。我們來看一下具體的意義。 

特别在無線裝置上,幾乎都是網絡應用,有聲音,有視訊,有電子郵件,有實時資料等等。如果将這些資料都統一到一個隊列中當然是可以的,因為2.6.27之 前的核心并沒有因為沒有實作多隊列而出現問題,但是這麼做是有弊端的,因為我們将必須用一種統一的方式管理它們,可實際上它們的差別很大很大,如果統一的隊列有一些什麼限制的話,這種限制将會限制到所有的資料,這将導緻排程程式的複雜化。事實上真的需要将事情攪和在一起進而必須增加複雜性嗎?我們在遇到困 難的時候必須想想現實是什麼樣子的,然後我們按照真實的世界的樣子去做就會得到最好的解決方案,返璞歸真真的是一條亘古不變的真理。實作了多隊列,每個網卡将擁有很多的根隊列,每個應用一個都有可能,這樣的話我們就可以随心所欲的控制并且僅僅控制我們想控制的資料包了,比如視訊資料強調實時性而對資料的準 确性要求不高,這樣我們需要給視訊資料包隊列更高的發送優先級,為了不使視訊效果變得很卡,我們縮短視訊資料包隊列的長度,而對那些要求準确性但是不要求實時的比如電子郵件的資料包隊列,我們可以降低其優先級但是增加隊列的長度,僅此而已,不需要變更已經很優美的排程機制就可以輕松實作。實作了多隊列的網 卡的圖示如下: 

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

static inline void qdisc_reset_all_tx(struct net_device *dev) 

 { 

-

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1273947

繼續閱讀