隊列技術
路由器或者交換機的資料發送,必須依賴于隊列(queue),這是一個什麼樣的概念呢?首先從生活中打個比喻:有很多人在公共汽車站,排隊等待乘坐公共汽車離開站台去往各自的目的地,這種排隊有一個原則:排在前面的人會比排後面的先上車,如果客車滿載了,不好意思排後面的人就隻有等待下一班車,但是如果排在後面的人有急事怎麼辦?OK請将這個問題留在這裡。事實上,路由器或者交換機也是一樣,它首先是将資料存儲在記憶體中,如果目前的發送接口不繁忙,那麼它将轉發資料包,如果目前的接口繁忙,那麼網絡裝置會将資料包暫存于記憶體中,直到接口空閑,理發送資料包,為了更科學的管理和優先記憶體中的資料包,IOS建立了排隊這個概念。最基本的原則就是先進先出(FIFO),既排前面的資料包會被優先轉發,排後面的資料包将直到它前面的包被發送後才會被轉發,而且隊列是有長度限制的,是以當排隊的資料達到隊列長度的限制時,那麼資料包将被丢棄(不允許你排隊)。如下圖所示:
<a href="http://s3.51cto.com/wyfs02/M01/53/A4/wKiom1RsojXgx5tWAADe9eE6U-k687.jpg" target="_blank"></a>
如果資料包都被送進隊列排隊,那麼這個隊列要多大的容量才能裝載下海量的資料?
隊列中存放的并不是真實的資料,是以每個資料包本身的大小并不影響隊列的長度,換而言之,一個1500位元組的資料包和一個10K的資料抱在隊列裡面的概念是一樣的,因為隊列中隻儲存着一個名為“資料指針”的概念,而真正的資料被存儲在緩存區的“堆棧”中。資料指針就是申明該資料在“堆棧”中某個具體位置。
如果使用單一的先進先出隊列(FIFO),那麼FIFO隊列将不支援任何QOS功能,不能獲得優先排程哪些資料做轉發的能力,也就是說FIFO隊列是不可能影響延遲、抖動、丢棄。因為FIFO隻有一種原則“先進來的先出去”,但是這個FIFO隊列本身的大小(隊列的深度),将影響延遲、抖動、丢棄等網絡服務品質的因素。如果隊列被充滿,那麼後面持續到來的資料包會被丢棄,而且這種丢棄是不差別資料包的重要及緊急程度的,也就是說隻要該資料包是隊列最大容量的後面一個包,就會被丢棄,一般管這種丢棄叫做尾部丢棄(本書後面簡稱為“尾棄”),如果希望資料不被“尾棄”的一個方案就是增加隊列的長度,從表面上看增加隊列的長度它可能會緩解“尾棄”,但是它會增大資料包傳輸的平均延遲。
下面列出關于隊列長度的一些重要原則:
1較長的隊列相較于較短的隊列,資料被“尾棄”可能性降低,但是延遲和抖動會加大。
2較短的隊列相較于較長的隊列,資料的“尾棄”可能性會增加,但是延遲和抖動會下降
3如果産生了持續的擁塞,無論隊列是長或者短,資料都會被丢棄。
在思科的路由器上将存在兩種類型的隊列(軟體隊列和硬體隊列)
前面描述了隊列這個概念,現在需要說明一個原則如圖所示:在輸出隊列(通常訓示為軟體隊列)中的資料包并不是直接送到一個輸出接口進行轉發,而是将資料包從一個輸出隊列傳送到另一個更小的輸出隊列(通常訓示為硬體隊列),然後再從這個更小的輸出隊列進行轉發,思科管這種行為叫“Separate”。
<a href="http://s3.51cto.com/wyfs02/M00/53/A2/wKioL1RsovXhBJZhAAD3nDdc_dI365.jpg" target="_blank"></a>
通常,硬體隊列沒有被充滿時或者為空時,這說明網絡中沒有發生擁塞,是以資料被直接傳送入硬體隊列,而不會再被放入軟體隊列排隊,也就說此時不會使用軟體隊列,如果硬體隊列被充滿,那麼後繼到來的資料包将被放入軟體隊列排隊,如圖所示的第4-9的包将被送入軟體隊列排隊。硬體隊列是不支援QOS工具的,而軟體隊列支援QOS工具。
為什麼會存在軟體隊列和硬體隊列的概念、各自的優勢和特點是什麼?
硬體隊列(叫TX Queue或者TX Ring),網絡裝置具體是選用TX Queue或者Transmit TX Ring這取決于路由器的硬體子產品,但是在本書中将TX Queue和TX Ring等同化,給它一個名稱叫硬體隊列。通常硬體隊列的長度很小,這就意味着一件事,能快速的轉發硬體隊列中的資料,而且硬體隊列的轉發不依賴于通過處理器(General-Purpose Processor更通俗的名稱叫CPU)而被關聯到每一個實體接口上的ASIC(Application-SpecificIntegrated Circuits)直接通路的隊列。是以即便是路由器的CPU工作負荷很重,硬體隊列也可以快速的發送資料,而不需要去等待CPU做中斷處理的時間延遲。但是硬體隊列永遠都是遵守先進先出(FIFO)原則,它是不可以使用QOS的隊列工具來進行管理的,每個實體接口上都有一個且僅有一個硬體隊列。是以應該産生一種可能被使用者管理的隊列機制,特别是持續發送大量的資料時。
那麼這種可能被使用者執行管理的隊列就是軟體隊列,其實無論是從理論還是從實踐的角度來講路由器可以存在多個軟體隊列,它的工作機制如圖所示,假設現在硬體隊列已經被充滿,那麼待轉發的資料包将被分類,然後将不同的分類送入不同的軟體隊列,當然此時還要考慮軟隊隊列是否被充滿,如果定義的軟體隊列已經被充滿,那麼資料将被丢棄,根據不同軟體隊列的特點可以配置不同的丢棄方式。如果軟體隊列未充滿,那麼資料包将會被送入軟體隊列排隊,軟體隊列會存在多種類型(多種機制)和多個數量的隊列,這也是本章後繼要讨論的内容。然後排程器将決定先将那個軟體隊列的資料排程進入硬體隊列,比如軟體隊列3的資料是最重要且緊急的,那麼可以優先排程軟體隊列3的資料進入硬體隊列,然後硬體隊列将資料直接交給接口轉發,其實通過這個邏輯不難看出:軟體隊列是可以被管理的,排程器就是管理軟體隊列的核心元件,同時也可以看出軟體隊列、硬體隊列、接口三者之間的關系。
<a href="http://s3.51cto.com/wyfs02/M01/53/A4/wKiom1RsorqzQ8gEAAFB1bCmzTE057.jpg" target="_blank"></a>
注意:每一個接口都有一個且僅有一個硬體隊列,硬體隊列永遠是使用FIFO機制,不可以被隊列工具所管理;軟體隊列可以是FIFO、PQ、CQ、WFQ、CBWFQ、WRR等,通常網絡工程技術人員對隊列技術的學習是僅針對軟體隊列技術的學習!隻有硬體隊列被充滿時才使用軟體隊列,軟體隊列是可被隊列工具所管理的。
關于硬體隊列的長度問題:
在前面的描述了,筆者提到過一種描述“硬體隊列沒有沒充滿時,就不會使用軟體隊列,因為硬體隊列沒有被充滿時這意味着網絡暫時沒有發生擁塞,至少裝置所處的網絡節點暫時沒有發生擁塞。”那麼有朋友可能會誤解這個描述,如果這樣的話,那麼把硬體隊列通過手工配置得很長,長到資料永遠都無法塞滿硬體隊列,那麼不就成功的解決擁塞了嗎?在這裡筆者說明一下,硬體隊列沒有被充滿時,就不會使用軟體隊列,因為硬體隊列沒有被充滿時這意味着網絡暫時沒有發生擁塞,這裡有一個前提條件,就是硬體隊列的長度要配置得合理,通常讓路由器自己去決定,而它會被路由器配置得較短,因為硬體隊列是一個永遠使用先進先出原則的隊列,如果你把硬體隊列設定得太長,那麼在該隊列中的所有資料全部遵守先進先出,使用者重要的資料就無法得到優先排程。就直接導緻軟體隊列一直不生效,為什麼呢?因為隻有硬體隊列被塞滿時,資料才會進入軟體隊列,使用者才能使用排程器來決定,哪個軟體隊列的資料優先被放入硬體隊列,然後轉發。
硬體隊列的最佳長度是随時保證有資料進入該隊列,同時能随時快速釋放隊列中的資料,然後再讓後繼資料快速進入的狀态為最佳狀态,其實這關于這一點IOS系統會給裝置自動做調整,那麼怎麼才能知道硬體隊列的長度及IOS的調整狀态呢?
了解硬體隊列的關鍵點如下:
1 路由器決定硬體隊列的長度時和具體接口上的帶寬有關。
2 在路由器的接口上可以使用tx-ring-limit指令來手工配置,但不建議這樣做。
3 減小硬體隊列的尺寸,能減小在先進先出硬體隊列中資料被傳輸前等待的時間,能夠加速使用基于IOS軟體的QOS工具,事實上就是讓軟體隊列得以快速生效。
4相反如果一個硬體隊列太長,它将嚴重影響軟體隊列的使用或者讓軟體隊列的能效降低。
5如果将一個硬體隊列設定得太短,會發出大量中斷,制成CPU占用率過高,而鍊路的使用率過低。
IOS排隊工具将自動調整對硬體隊列的最小化影響。這是為了讓硬體隊列總是有資料。當任意的一種隊列工具(軟體隊列)在一個接口上被啟用時,IOS将減小硬體隊列的尺寸到一個非常小的值(典型的是2,一般産生在中低端的路由器上),因為這個很小的值,将最小化的影響硬體隊列的排隊方式。換而言之,能夠讓硬體隊列中的資料得到快速轉發。
檢視和變更路由器上的硬體隊列長度
可以通過在路由器上執行Showcontrollers s1/0指令來檢視某個實體接口上硬體隊列的大小,顯來的結果如圖所示Tx_limited1(2)就是目前硬體隊列的情況,“1”表示目前的接口上應用了隊列工具,這是因為預設在E1速率以下的鍊路,預設都啟動了WFQ隊列,關于這一點可以通過show interface s1/0來檢視目前的隊列工具,如圖所示。什麼是WFQ(權重公平隊列,關于WFQ的更多資訊将在後面作描述,目前請記住:隻要接口上使用隊列工具那麼Tx_limitedx(y)中的x就是1,如果目前接口沒有應用任何隊列工具那麼x就是0.而(y)則是指目前硬體隊列的深度是多少,如果(2),表示目前硬體隊列的深度為2個資料包。
<a href="http://s3.51cto.com/wyfs02/M00/53/A2/wKioL1Rso33Bdr2oAANF0pfsbxY469.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/53/A5/wKiom1Rsoyzw7z8CAAOOaEVIWnI586.jpg" target="_blank"></a>
如果希望接口不使用任何隊列工具,當然這并不是一項推薦的行為。那麼請在目前的S1/0的接口模式下接入如下所示的配置:
R1(config)#intes1/0
R1(config-if)#nofair-queue * 關閉WFQ隊列工具
當關閉S1/0接口上預設的隊列工具後,再次使用show interface s1/0檢視接口如圖所示,顯示該接口目前沒有使用任何隊列工具,而是使用先進先出(FIFO)原則。然後再使用Show controllers s1/0指令來檢視某個實體接口上硬體隊列的情況如圖所示, Tx_limited0(2)就是目前硬體隊列的情況,0表示目前接口上沒有任何隊列工具。目前硬體隊列的深度為2.
注意:請不要去關閉E1速率以下接口的預設隊列工具,這樣可能會導緻你網絡的資料無法公平的獲得接口上的有效帶寬,進而讓小體積的資料轉輸被大體積的資料傳輸所強占,得不到相應的服務!是以請在低于E1速率以下的接口配置fair-queue(當然預設它會被啟動),除非你有更好,更科學的隊列工具将要應用到該接口上,關于這一點将在驗證FIFO及WFQ隊列工具實施的效果部分給出理由。
<a href="http://s3.51cto.com/wyfs02/M00/53/A3/wKioL1Rso_GCGSmWAALyZqY5270948.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/53/A3/wKioL1Rso_Wjgsg-AANuKQByrBs425.jpg" target="_blank"></a>
如果希望通過手工改變硬體隊列的長度,比如将S1/0的硬體隊列從預設的長度2改為3,請在S1/0接口模式下執行tx-ring-limit3指令,此時再次通過執行Showcontrollers s1/0,可以看到目前硬體隊列的長度變為了3。
<a href="http://s3.51cto.com/wyfs02/M00/53/A5/wKiom1Rso8SAtZBuAALFJi_pKjY644.jpg" target="_blank"></a>
<b>本文轉自 kingsir827 51CTO部落格,原文連結:http://blog.51cto.com/7658423/1579813,如需轉載請自行聯系原作者</b>