弈心:從事計算機網絡工作十年(新加坡7年,沙特3年),2013年考取CCIE,在新加坡先後任職于AT&T,新加坡交通部,蘋果,Equinix,蘇格蘭皇家銀行等大型企業、銀行和政府部門。 目前供職于“世界第一土豪大學“沙特阿蔔杜拉國王科技大學(KAUST),擔任Senior Network Engineer,爲KAUST校史上第一位也是唯一一位華人IT部門高級職員。2019年6月在知乎發布了華語圈第一本專門爲編程零基礎的網絡工程師量身打造的Python教程《網絡工程師的Python之路》。
今天聊下不少網工學了就忘,忘了又學,幹了一輩子網絡幾乎都沒一個完整的概念,甚至在工作中都沒太多機會接觸的一個技術話題:服務質量 (Quality of Serivce)。開篇前先講講爲什麽我要在標題裏加入一個“網絡很難學”的副標。
很多人在知乎上或私信或付費咨詢向我詢問如何學習計算機網絡,如何在短時間內迅速在這行裏積累拿到高薪。這些朋友當中既有爲高考後選擇大學專業感到困惑的大學新生,也有工作了若幹年對目前自己所在行業不甚滿意想要改行跳槽的職場人士。而我無一例外對他們的建議是:網絡知識很抽象、很枯燥、很難學,要想在這行走得遠,爬的高,你必須耐得住寂寞。
學網絡不像學編程,我可以10秒鍾教會你如何用python 3來print (“Hello World!”),5分鍾教會你什麽是列表,10分鍾教會你如何寫一個最簡單的for循環來遍曆列表裏的元素。但我沒辦法在同樣那麽短的時間內向你解釋清楚什麽是IP地址,什麽是子網掩碼(以及反掩碼),什麽是默認網關,更不用說跟你解釋清楚它們之間的關系(如果你沒有學過二進制就更難跟你講明白了),你就算把這類網絡最基礎的東西學會後也沒有像用編程語言打印出”Hello World”那種所見即所得的成就感可言,因爲你身邊沒有一個現成的網絡給你練習和試手;別人學編程一台筆記本就夠了,你學網絡考證還得租機架在真機上練習。就算有模擬器這個東西,真實的網絡和模擬器也是天差地遠,還得重頭向你解釋怎麽使用模擬器,怎麽搭建環境,在哪裏下模擬器裏要用到的IOS鏡像文件;別人編程2,3個月能夠開發一個網站,寫個小程序,你學兩三個月還在啃CCNA的書,還在背題庫准備迎接考試。。。總之一言以蔽之:網絡很難學,真的很難學,這個行業沒有捷徑可走,沒有短期拿高薪的可能,如果你耐不住及寂寞,那麽請謹慎入坑。
說完副標來說正題:
筆者從業10年來面試過不少人,發現很多網工對各種常用的VLAN,STP, NAT, 各種動態路由協議,網絡抓包排錯,甚至MPLS等等技術都掌握的很不錯,但是一向他們問到QoS,這個相對前面提到的那些二、三層來說並不是那麽常用的技術的相關問題時,他們的表現就不那麽理想了。雖然不少人能正確回答EF的DSCP值是什麽,能說出思科的MLS和MQC的區別及分別對應什麽型號的交換機,知道語音網絡對延遲,抖動,丟包能承受的範圍是多少,能給我講明白AF11和AF13在網絡阻塞時哪個更有可能被丟棄,也能畫圖給我解釋清楚流量整形(shaping)和流量整治(policng)的區別,因爲這些都是書本上能找到答案,能夠背下來的知識點。
但是當我拿出實際工作中遇到的和QoS相關的問題,並向他們詢問排錯思路、解法以及相應的原理是什麽時,很少有人能完美的講個清楚,所以今天這篇文章就來聊聊兩個網絡中常見的和QoS相關的問題及其解法。首先來看問題一:
問題一
背景:
網工A最近剛剛入職一家新公司,該公司的網絡配置采用的是End-to-end QoS(端到端的QoS)的設計, 所有接入層交換機(思科3750)和彙聚層交換機(思科4509)都開啓了QoS,接入層交換機下接網絡電話的端口以及彙聚層交換機連接接入層的交換機的端口都配置了mls qos trust dscp,劃分好了信任邊界。 剛入職的網工A爲了盡快了解現有網絡的規劃和部署,便將每台交換機的配置拿出來學習研究,他發現所有交換機中唯獨有一台接入層交換機沒有開啓QoS:
access-sw#sh mls qosQoS is disabled
于是便自作主張在該交換機上開啓了QoS,但是隨即網工A就收到了其他組同事開來的ticket,他們有一台服務器直連在該交換機下,在該服務器上跑的程序一直因爲高延遲的問題而報錯。
問題:
網工A並沒有改變該交換機下任何端口的配置,僅僅只是在這台3750上開啓了QoS,請問爲什麽會導致終端用戶應用延遲的問題發生?講下原理和解法。
問題二
背景:
某土豪大學爲所有師生和職員提供別墅作爲住房,每棟別墅都配置了一台思科2960交換機,該2960交換機的級聯端口(光纖)和用戶端的端口(RJ45)均爲100兆的Fastethernet,最近學校升級住家網絡,將級聯端口的SFP transceiver從100兆的GLC-FE-100BX-U換成了1G的GLC-BX-U,所有住家用戶的2960交換機均開啓了QoS(mls qos),級聯端口的配置如下(網速升級後沒有對交換機的配置做任何更改):
interface GigabitEthernet0/2 switchport trunk allowed vlan 2232-2235,3208,3999 switchport mode trunk switchport nonegotiate load-interval 30 media-type sfp srr-queue bandwidth share 1 40 30 30 priority-queue out mls qos trust dscp spanning-tree bpdufilter enable ip dhcp snooping trust
問題:
將級聯端口從100M升級到1G後,不久就收到用戶的投訴,說他們家裏的網速明顯變慢了很多,你在排錯時做了speedtest,將級聯端口爲100M時的測速結果和1G時的測速結果做了對比,結果如下:
級聯端口爲100M時,下行速度達到了93.9Mbps。
級聯端口爲1G時,下行速度只有8.31Mbps。
請問爲什麽?不用給出具體配置方案,講講排錯思路,以及涉及到的知識點即可。
答案:
這兩道題都是筆者在工作中親自碰到過的實戰問題,具有極強的實用性,計算機網絡那麽多知識點裏面就數QoS最抽象,最難學,很多網工能背下書本上的各種理論,但是一旦碰到和QoS相關的實戰問題就會顯得手足無措,不知從何下手。也有小部分網工能解決問題,但是無法系統的說出該問題涉及到了QoS的哪個知識點及其原理。筆者當年也是查閱了很多資料才做到了“知其然還要知其所以然“,希望下面的解答能給大家一點啓發。
問題一解答
在回答”爲什麽網工A開啓QoS後,用戶端程序出現了延遲問題”之前,先來看下”爲什麽QoS在沒有被開啓的時候一切正常”。答案其實很簡單:在QoS被關閉的時候,交換機對其吞吐的流量不做任何事情,從QOS的角度來講,這時沒有信任(Trust)和不信任(Untrust)之分,交換機不管這些流量自帶的是什麽DSCP, COS還是IPP值,統統放行。換句話說,這時給該程序流量做QoS標記(marking)的恰恰就是程序本身,並且該標記沒有受到任何行爲約束,自然該流量一切正常,沒有延遲發生。
當網工A開啓了QOS之後,交換機馬上做了兩件重要的事情:
- 所有端口默認爲不信任任何DSCP值,也就是說該交換機所有端口的配置裏現在多了一條”no mls qos trust dscp”。
2. 所有不信任DSCP值的端口會對流經該端口下的程序流量進行DSCP重寫(ip packet dscp rewrite),默認狀態下,所有程序自帶的DSCP值將被交換機重設爲0。
這點可以在3750上show mls qos驗證(看到QoS ip packet dscp rewrite is enabled了嗎?):
access-sw(config)#mls qos
access-sw(config)#end
access-sw#sh mls qos
QoS is enabled
QoS ip packet dscp rewrite is enabled
那麽DSCP被重設爲0意味著什麽?意味著現在該程序的流量在該網絡下被分類爲了BE(Best Effort,盡力而爲)流量,BE流量出現高延遲的情況並不罕見。
解法:
找到問題的原因後就可以對症下藥了,這道題大致有如下幾種解法:
- 在連接服務器的端口下開啓mls qos trust dscp,這個是最簡單也是最直接的辦法。
mls qos trust dscp
2. 還有一種很多人不太了解的解法,就是在交換機上開啓DSCP透明模式(DSCP transparency mode), 讓交換機不要重設不信任端口下收到的流量的DSCP值,(言下之意就是關閉默認開啓的DSCP重寫功能),開啓DSCP透明模式的命令如下:
no mls qos rewrite ip dscp
3. 創建一個ACL來匹配該程序流量,然後手動將它標記爲它原有的dscp值(複雜,不推薦)。
問題二解答
給出這道題的解法和原理之前,我們可以把級聯端口和用戶端口看成兩根水管,先來看下級聯端口提速前後的變化:
- 提速前:用戶端口和級聯端口均爲100Mbps, 下行流量從級聯端口到達用戶端口時不會發生擁塞現象,因爲兩根一樣粗的水管的容量是一樣的。
- 提速後:級聯端口變成了1G,管子增大了10倍,而用戶端口依然是100M,你現在將大水管裏的水往只有它容量10分之1的小水管裏灌水,顯而易見會發生擁塞現象。
既然涉及到了網絡擁塞的現象,那自然而然就涉及到了QoS的隊列(queueing)以及緩沖(buffering)的問題。隊列的知識點又分爲入隊列(Ingress Queue)和出隊列(Egress Queue)。這道題出現問題的是下行速度,所以我們要關心的是用戶端口的出隊列。
下面簡要回顧一下出隊列的相關知識點,注意加粗斜線部分爲涉及到本題的重點內容, 其他部分了解即可。
- 在思科的IOS交換機裏面(以這裏的2960爲例),每個交換機端口有4個出隊列。每個隊列默認分配的緩存空間(buffer size)相等,都爲緩存總量的25%(思科2960的硬件緩存總量爲2MByte),緩存的作用是在交換機出隊列出現擁塞的時候,額外分配硬件資源給出隊列,換句話說就是分配更多的帶寬給出隊列,也就是把這道題裏我們所比喻的客戶端管子加粗。每個隊列保留自己所得緩存空間的50%作爲保留阈值(threshold)。其中隊列1使用shaped模式,其他3個隊列使用shared模式,換句話說隊列1只能使用總緩存空間的25%,超出這個空間的數據將被丟棄,而其他3個隊列則是共享剩下的75%緩存空間,也就是它們理論上可以“獨享”75%的緩存空間。
- 要了解出隊列還必須了解Queue-set。Queue-set本身是一個列表, 用來設定每個出站隊列的buffer資源如何分配和使用。用戶可以自定義的queue-set有兩個:queue-set 1 和 queue-set 2。每個交換機的端口一次只能使用一個queue-set, 默認情況下,所有交換機的端口都在queue-set 1下。
我們可以使用show mls qos queue-set命令來查看Queue-set 1 和 2的參數,你可以看到默認狀態下4個隊列分別分配到了25%的buffers.
2960#show mls qos queue-set Queueset: 1Queue : 1 2 3 4———————————————-buffers : 25 25 25 25threshold1: 100 200 100 100threshold2: 100 200 100 100reserved : 50 50 50 50maximum : 400 400 400 400 Queueset: 2Queue : 1 2 3 4———————————————-buffers : 25 25 25 25threshold1: 100 200 100 100threshold2: 100 200 100 100reserved : 50 50 50 50maximum : 400 400 400 400
- 每個出站隊列的buffer有3個阈值(threshold):threshold 1, threshold2, threshold3。其中threshold 1和threshold 2可以自定義,threshold 3爲固定值(100%),不可修改。 上面的命令Show mls qos queue-set的時候只能看到threshold 1和2,看不到threshold 3。阈值的意思是,如果一個隊列使用的buffer達到了由阈值定義的百分比,則交換機開始丟包。比如說使用threshold 3(100%),那麽交換機會在buffer的使用率達到100%後開始丟包。阈值1和阈值2最大可以修改到3200。
說了那麽多,也許你有點眉目了,就是因爲在擁塞情況下,交換機默認給每個出隊列25%的buffer不夠用,以致丟包,最終造成下行速度在級聯端口升速後驟降。
如果你有經驗的話,你可以show interface x/x | i output drops以及show mls qos interface x/x stat | b dropped這兩條命令來查看output方向的丟包情況,通常這種級聯端口和用戶端口帶寬不對稱的情況都會造成output drop嚴重的問題(在跑完測速後,測速機器所連的用戶端口fa0/2的Total ouput drops 達到了9346180,這個數字和隊列2阈值1的丟包數據相同!
2960#show int fa0/2 | i output drops Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 93461802960#sh mls qos int f0/2 stat | b dropped output queues dropped: queue: threshold1 threshold2 threshold3———————————————– queue 0: 0 0 0 queue 1: 9346180 0 0 queue 2: 0 0 0 queue 3: 0 0 0
** 注意這裏的queue 0對應的是出隊列1, queue 1對應的是出隊列2, 以此類推。
解法:
要解決這個問題,還要了解DSCP值和4個出隊列的映射關系。
我們可以通過show mls qos maps dscp-output-q這個命令來查看DSCP值與出隊列即阈值的映射關系:
2960#show mls qos maps dscp-output-q Dscp-outputq-threshold map: d1 :d2 0 1 2 3 4 5 6 7 8 9 ———————————————————— 0 : 02-01 02-01 02-01 02-01 02-01 02-01 02-01 02-01 02-01 02-01 1 : 02-01 02-01 02-01 02-01 02-01 02-01 03-01 03-01 02-01 03-01 2 : 03-01 03-01 03-01 03-01 03-01 03-01 03-01 03-01 03-01 03-01 3 : 03-01 03-01 04-01 04-01 04-01 04-01 04-01 04-01 04-01 04-01 4 : 01-01 01-01 01-01 01-01 01-01 01-01 01-01 01-01 01-01 04-01 5 : 04-01 04-01 04-01 04-01 04-01 04-01 01-01 04-01 04-01 04-01 6 : 04-01 04-01 04-01 04-01
- 這個表的d1表示DSCP值的十位數,d2表示個位數。
- 02-01表示出隊列2,阈值1。 04-01表示出隊列4,阈值1, 依次類推。
回到這道題來看,我們做測速的時候是在某測速網站做的,互聯網流量的DSCP值爲0,也就是BE盡力而爲。通過上面的映射表可以看出,DSCP 00對應的是02-01,也就是出隊列2,阈值1。
知道了流量對應的出隊列和阈值後,我們就可以手動修改交換機對每個出隊列的緩沖空間的分配了,既然默認的25%不夠,那麽我們可以多分點,比如分60%給出隊列2,再把阈值1調高到3200。兩條命令分別如下:
2960(config)# mls qos queue-set output 1 buffers 10 60 15 152960(config)# mls qos queue-set output 1 threshold 2 3200 3200 50 3200
首先講下這條命令mls qos queue-set output 1 buffers 10 60 15 15, 這裏的1表示queue-set 1,前面提到了IOS交換機有兩個queue set,默認使用的是Qset 1,所以這裏我們就直接改Qset 1的配置。 後面的10,60,15,15的意思也許你也猜到了,就是分別給出隊列1分配10%的buffer, 給出隊列2分配60%的buffer, 給出隊列3分配15%的buffer, 給出隊列4分配15%的buffer。
第二條命令mls qos queue-set output 1 threshold 2 3200 3200 50 3200, 這裏output後面的1表示的依然是Qset 1, threshold後面的2表示的是出隊列2,第一個和第二個3200分別表示阈值1和阈值2,50表示默認的保留阈值(前面有提到),最後的3200表示最大阈值。
配置好這兩條命令後,問題完美解決。關于思科IOS交換機的完整出隊列機制可以用下圖概括起來。
結語:
如果從難度來評價這兩道題的話,第一道題姑且算中級,第二道題則是真正的專家級難度,我在技術面試環節問到QOS時通常會用這兩道題來考應聘者。
就如我在上篇文章裏提到的一樣:
當我在面試的時候向應聘者問到QoS相關的問題時,雖然不少人能正確回答EF的DSCP值是什麽,能說出思科的MLS和MQC的區別及分別對應什麽型號的交換機,知道語音網絡對延遲,抖動,丟包能承受的範圍是多少,能給我講明白AF11和AF13在網絡阻塞時哪個更有可能被丟棄,也能畫圖給我解釋清楚流量整形(shaping)和流量整治(policng)的區別,因爲這些都是書本上能找到答案,能夠背下來的知識點。
但是當我拿出實際工作中遇到的和QoS相關的問題,並向他們詢問排錯思路、解法以及相應的原理是什麽時,很少有人能完美的講清楚。
QoS很難,真的很難,要想在這行混得好,成爲真正的技術大神,那就絕對不能抱有“不求甚解”的態度。