Tuesday, December 10, 2019

撥開迷霧 讓您明白了解路由器傳輸性能

什麼是路由器的吞吐量 包轉發率

  這是一篇討論如何測試路由器性能的文章,看完這篇文章您將了解到一些關於路由器方面的知識,這些知識是小新認為已經了解了的東西,當然,這些知識可能也不是全部都正確,有錯誤之處,還希望大家提出並討論。本人是一名網絡愛好者,但不是一名專業網絡技術從業人員。

  好,言歸正題,既然要說路由器,那一定要先說一下路由器是做什麼的。如果我們把處在同一網段內的主機的分布結構看作是平的,那我們與其它網段主機之間的關係就是“立體”的。大家應該都知道,互聯網,也就是Internet,它就是一個“立體”結構的網絡。訪問INTERNET,或訪問一切非本地網段內的資源,我們都要用到路由器。在一般小型網絡環境中,我們的電腦在路由器之後,路由器工作在NAT模式下,為了完成網絡通信,簡單來講,路由器需要做兩件事情:首先,將收到的來自內網的數據包“掐頭去尾”並填上新的地址信息;第二,將處理過的數據包發往下一“跳”。這一過程中,路由器可能會出現性能瓶頸,路由器把數據包“掐頭去尾”並替換上新地址信息的這一過程是需要時間的,單位時間內路由器能處理(轉發)多少數據包就是我們最能直觀體會到的路由器性能強弱。

  說到這裡要講一個概念,那就是包轉發率,單位是pps(包每秒),包轉發率的概念很好理解,就是每秒鐘路由器能轉發的數據包的數量。在這裡小新說一下對這一概念的理解,在網上查閱資料得知pps的計算方法是100Mbps / 8 / (64B+20B)=0.1488Mpps。100Mbps指的是路由器的設計帶寬,除以8是將bps轉化為Byteps,64B指的是以太網最小數據包的大小,20B是每個數據包在傳輸時的固定損耗,另外,要說明一下,這20B的損耗通過抓包工具是無法捕獲的。我們再來看一下pps這個計算工式,100Mbps / 8 / (64B+20B)=0.1488Mpps 的計數單位是“個”,因為在100Mbps除以8之後,此時計數單位就是Byteps了,也就是Byte每秒。再用Byteps除以Byte,所得到的就是pps,第一個p也就是包(package)的意思。包轉發率的概念是一個“以數量為基礎的概念”,通俗的講,就是一個以“個”為單位的概念,10pps指的就是每秒轉發了10個數據包。

  接下來我們反着看一下pps的計算方法,100Mbps / 8 / (64B+20B)=0.1488Mpps。如果我們使用的數據包大於64B會如何?假如是128B,那公式將會變成這樣。176Mbps / 8 / (128B+20B)=0.1488Mpps,但我們知道,百兆路由器的設計寬帶極限是100Mbps,不可能超過這個數值,所以如果計算百兆路由器的128B數據包轉發率,結果應該是100Mbps / 8 / (128B+20B)=0.08446Mpps。結果與0.1488Mpps相差甚遠,這說明產生了傳輸瓶頸,瓶頸來自於百兆路由器的設計標準,而非來自於包轉發性能。

路由器的傳輸瓶頸源自哪裡

  好,我們繼續往下看,0.1488Mpps的這個極限值,對於百兆路由器來講,基本上是不可能達到的,原因很簡單,路由器的性能不足。我們不妨反着使用一下pps的計算公式,pps * (64B+20B) * 8 = bps,如果pps很低,那kps也必然小得可憐。並且在測試中我們發現,一般路由器的pps確實很低。因為pps很低,那我們可以適當放大“64B”這個數值,也就是說,我們不使用小包,我們可以使用大包,只要最後的乘積bps不大於100Mbps就可以。因為只要不大於100Mbps,那傳輸瓶頸我們便可認為不存在,此時的瓶頸應該只來自於路由器的包轉發性能。

  說到這裡,可能您會問這樣一個問題,路由器轉發100個小包是不是比轉發100個大包要省事呢?關於這點,小新在網上找到一位前輩的文章,其中有這樣一段描述:

  路由器在處理數據包時,主要的時間花在處理包頭、包尾上,對不同大小的數據包,路由器每秒能處理的包數量差別不會太大。這就像郵局處理包裹,主要的時間是花在處理寄件人、收件人和物品信息以及檢查上,包裹重一點輕一點對處理速度影響不會太大。如128Byte包每秒能處理10000個,並不能做到64 Byte包每秒處理20000個,而是只比10000個略多一點點,比如10100個。

  我們按着這個思路,使用大包去測試一台路由器的吞吐量,在我們得到Mbps之後,只要這個值不大於100Mbps,那我們就可以認為,路由器的傳輸瓶頸是來自於性能,也就是pps,而非是設計帶寬。另外,由於路由器的性能瓶頸來自對包頭信息的處理,而非來自傳輸數據包本身,所以我們可以認為,測試不同大小數據包,雖然Mbps結果會不同,但pps性能應該是一個相對平均的數值。

  接下來說一下測試環境,搭建環境很簡單,只要有兩台電腦就可以了,當然,電腦的性能越強越好。測試軟件使用IxChariot,測試腳本採用High_Performance_Throughput,Pair數量為100。IxChariot是一款被普遍使用的網絡負載測試工具,對High_Performance_Throughput腳本進行修改,我們可以得到不同大小的數據包,Pair數量被設定在100是因為我們在測試中發現一個現象,比如,我們在測試1514B大小的數據包吞吐量時,一個Pair可能只有20Mbps左右,但隨着Pair數量的增加,吞吐量也會隨之上升,並最終達到吞吐最大值,Pair繼續增加,吞吐量也不會出現大的變化。使用100Pairs還有另外一個效果,多Pair在Netstat中看到的效果就是多TCP連接數,在多連接數下,高強度的吞吐測試對路由器性能和穩定性都是一個考驗。

  對於為什麼路由器的吞吐表現會隨着Pairs的數量增加而增加,這個小新不是很明白,不過使用抓包不具,我們也許能看出一些原因。我們修改High_Performance_Throughput腳本,讓Ixchariot產生1024B大小的數據包,使用1Pair從PC1發送數據包到PC2,在抓包工具中我們可以看到,PC1每發送一個1024B大小的數據偵,PC2就會返回一個60B左右的數據偵,絕不會出現“不對稱”的數據偵。小新的理解是,這是Ixchariot的確認和計數機制,Ixchariot通過統計一個預定長度和格式的腳本文件無差錯地從一台服務器傳送到另一台服務器的時間來計算出路由器的Throughput。可能也正因為這種計數、確認機制,使PC1發送出一個數據包後必須要等待一段時間,雖然這個時間很短,待得到PC2的回應後,才會再發出下一個數數包。此時路由器的包轉發性能並沒有得到全部利用。如果我們使用多Pairs,那這一問題就可以忽略不計了,在多Paris下,路由器的轉發性能會得到最大的利用。

解讀Ixchariot測試結果 一

  好,說了這麼多,希望您還沒有感到厭煩。下面我們以兩台寬帶路由器的測試結果來深入說明一下如何認識路由器的性能。兩台路由器同屬一個品牌,一款面向SOHO家用市場,價位在100左右,另一款面向小型企業市場,價位在1000元左右。

  在討論測試結果之前,小新還要說一下Ixchariot這個測試工具,Ixchariot本身是有損耗的,使用Ixchariot測得的Throughput結果是有效數據負載,不包括TCP協議損耗、幀間隔、應答和Ixchariot本身系統損耗,此部分典型損耗根據理論計算約6M,就是說即使你測試的是一台能線速轉發的交換機,測出來的Throughput也只可能是94M左右,這是理論極限值,不可能大於這個值,當然這是對百兆交換機而言。但這個損耗也是佔用了路由器性能的,所以我們需要在測得的Throughput結果上加6Mbps。

  我們分別測試64B、128B、256B、512B、1024B、1514B大小數據偵的傳輸表現,對於測試結果,只要加上Ixchariot的傳輸損耗(6Mbps)沒有超過100Mbps這個極限值,我們便認為,傳輸瓶頸是來自於包轉發性能,而不是路由器的帶寬標準。我們需要的,也正是路由器在出現轉發瓶頸時的數值。

  使用Ixchariot測得的是Mbps,需要將其轉換為pps,轉換的方法在上面已經說過,(Mbps + 6Mbps) / 8 / (64B、128B、256B…1514B +20B) = Mpps * 1000000 = pps。

  下面我們來解讀上圖的測試結果。紅色曲線描繪的是bps (右側Y軸),可以看到,隨着數據包從64B至1024B,bps一路飆升,但在第一個1514B處幾乎停止了增長,再看一下此時的bps值,是91.212Mbps,再加上6Mbps的損耗,已經接近100Mbps極限,顯然在傳輸1514B數據包時,瓶頸來自於百兆路由器的帶寬標準,而非是包轉發性能。將bps換算為pps後,如上圖中的黃色曲線,從64B至1024B的傳輸表現基本保持在一個量級,但在第一個1514B處大幅下降。pps下降而bps卻有小量增加,這也說明,100Mbps的帶寬標準成為了轉輸瓶頸。

  最後一個Mbps值,小新測試的是1Pair 默認High_Performance_Throughput腳本,使用這一腳本跑出的數據最為好看,93.523Mbps,如果再加上6Mbps的損耗,已經非常接近100Mbps了。

  在這裡說一下High_Performance_Throughput這個腳本。我們使用Wireshark抓包軟件,所捕獲的Ixchariot最大數據偵為1514B,所以在數據偵遞增測試中,我們最後使用的是1514B。前面已經說過,PC1每向PC2發送一個數據包,PC2必須要向PC1返回一個數據包後,PC1才會繼續發送下一個包,這是Ixchariot的確認機制。PC2之所以要返回一個確認信息,應該是通知Ixchariot,本次傳輸完畢,請記錄下傳輸時使用的帶寬。但這裡會有一個問題,傳輸一個1514B大小的數據包,不會用滿所有路由器的帶寬,就是還沒有用到100Mbps這個數據就傳輸完了,但High_Performance_Throughput腳本默認卻不是這樣的。默認情況下High_Performance_Throughput是每傳完10MB數據才會計數一次,傳輸10MB數據是需要一定時間的,這樣也會用滿路由器的全部帶寬,所以我們看到1Pair時,High_Performance_Throughput的測試結果是93.523Mbps。

  從上面的分析中我們可以看到,bps高pps一定也就高嗎?其實不然,相反的pps是一個比較穩定的值,在傳輸大包時,反而還會受到寬帶標準的制約。

解讀Ixchariot測試結果 二

  百元路由器的pps測試結果就比較奇怪了,吞吐值是正常的,雖然峰值也只達到了43.633Mbps,這是性能決定的,畢竟價格只有千元路由器的十分之一。但它的pps曲線就太不正常了,如果按照之前的理論,pps應該是一個波動不大的值,可為什麼這裡的跨度從9346到3146?

  這一問題可能出在Ixchariot的6Mbps損耗上。我們在測試小包吞吐量時,bps成績是很小的,如上圖中,百元路由器的測試成績只有0.281Mbps,如果加上6Mbps,那結果將會與千元的0.907Mbps加上6Mbps變得十分接近,顯然這是不對的。小新覺得,對於Ixchariot的測試成績,我們應該盡量“弱化” 損耗(6Mbps)的影響。

  我們可以想一下,損耗是怎麼產生的。每一個數據偵從PC1至PC2都會附帶產生一定的損耗, 但如果測試結果(Mbps)非常低,那,這個損耗值還會是6Mbps嗎?小新認為應該就不會了。但同時,吞吐率隨着數據包的增大而增大,數據包的增大其實是有效數據增大所至,而損耗是一個固定的值。所以我們可以參照大包吞吐測試的結果來推算包轉發率(pps),只要吞吐測試的成績加上損耗沒有超過100Mbps。這樣便可以盡量“弱化”Ixchariot損耗(6Mbps)的影響

  從上圖的百元路由器測試結果來看,小新認為,這款路由器的包轉發性能應該在4000-3000pps之間。在這個測試中,不存在帶寬(100Mbps)瓶頸的問題,因為吞吐量最高也只是使用1Pair High_Performance_Throughput腳本測到的43.633Mbps。

總結及測試中的一些事:

  最後,我們總結一下路由器標稱帶寬(吞吐量)、實際吞吐量(bps)和包轉發率(pps)之間的關係。我們常說的百兆路由器、千兆路由器,這指的就是路由器的標稱吞吐量,對於百兆路由器來講,達到100Mbps吞吐量其實並不是什麼難事,只要使用大數據包,像那台千元路由器,我們在測試中使用的1Pair High_Performance_Throughput腳本測出的結果,成績是非常好看的。但僅憑此,就能說明路由器的性能很好嗎?顯然不能。

測試總結及一些疑惑

  從千元路由器的測試結果中我們可以看出,包轉發率(pps)達到8000左右,傳輸大數據包,吞吐量就能達到100Mbps了,但此時,小數據包的轉發性能其實也只有10000左右。試想一台包轉發率為20000的設備,與包轉發率為10000的設備在轉發大數據包上,表現會有什麼不同嗎?似乎不會有任何不同,因為標稱帶寬(吞吐量)就只有100Mbps,這是上限。但兩者的區別會反應在轉發小包時的效率上,在沒有到達標稱帶寬(吞吐量)之前,pps為20000的設備將比pps為10000的要設備快上一倍,當然,這樣的設備價錢也會更高。我們關注的核心應該是包轉發率(pps),而不應是吞吐量,因為包轉發率高了,吞吐量必然高,而吞吐量高,包轉發率卻不一定高。

  在實際應用中,包轉發能力十分關鍵,比如網吧里經常玩遊戲,每操作一個遊戲指令,每扣動一個扳機,轉發的全部是小包,這種情下,不存在標稱帶寬(吞吐量)瓶頸的問題,考驗的僅是路由器的包轉發能力。如果路由器包轉發能力不強,就很難應付大量小包轉發的需求,對於一些時延敏感的應用,例如在線遊戲,玩起來就會很不順暢。

  千元路由器的包轉發率達到了10000pps左右,雖然距理論最大值148800pps相去甚遠,但這一表現到底有多強或有多弱,我們如何判斷。比較這兩個數字,單從數量級來看,千元路由器的包轉發性能確實夠差的,僅為理論值的1/14左右。包轉發率越高越好,但在實際應用中我們真的需要那麼高的包轉發率嗎?對於這點,小新也沒有一個判斷標準,不過講一個在測試中發生的現象,也許從側面能看出一些問題。

  使用多Pairs跑Ixchariot腳本,Ixchariot會是一個非常吃機器性能的軟件,我們所有的測試使用的都是100Pairs,這對發包PC是個不小的考驗,在本測試中也就是PC1,CPU為P8400,1G內存,後來發現,內存有些小。我們在測試百元路由器時,PC1 的CPU和內存佔用都不高,可以輕鬆應付測試。這應該是因為路由器包轉發率低的原因,因為PC1在發出一個包之後,需要收到來自PC2的確認,才能再發送第二個包,如果路由器包轉發率不高,那PC1發出的包就少,PC1跑這個測試就會非常輕鬆。

  問題出現在測試千元路由器時。在測試中,Ixchariot幾乎將PC1拖垮。不過測試還是可以順利進行的,只是感覺PC1明顯非常繁忙,CPU和內存佔用都非常高,PF使用率達到了2G以上。千元路由的包轉發性能要高出百元產品不少,“等待”少了,包發得多了,PC1也就受不了了。為了驗證這點,小新最後將PC1與PC2直接使用網線相連,跑同樣的測試,這下PC1徹底被托垮了,整個電腦無法操作,不一會居然出現了WINDOWS 98時代的經典藍屏,反覆測試,次次藍屏。這應該說明PC1發揮了性能的極限,然後“陣亡”了,而在測試千元路由器時,PC1也是已經非常接近極限了。

  回到剛才所說的問題,10000pps幾乎拖垮了Intel P8400,在實際應用中,路由器有機會承受這個量級的數據量嗎?這個問題,小新無法回答,各位看官有什麼看法,歡迎討論。 另外,對於文中的一些錯誤之處,還望您指出,共同探討,共同學習。

原文地址:http://network.pconline.com.cn/cehua/0906/1672182_all.html

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.