Wednesday, November 14, 2018

拨开迷雾 让您明白了解路由器传输性能

什么是路由器的吞吐量 包转发率

  这是一篇讨论如何测试路由器性能的文章,看完这篇文章您将了解到一些关于路由器方面的知识,这些知识是小新认为已经了解了的东西,当然,这些知识可能也不是全部都正确,有错误之处,还希望大家提出并讨论。本人是一名网络爱好者,但不是一名专业网络技术从业人员。

  好,言归正题,既然要说路由器,那一定要先说一下路由器是做什么的。如果我们把处在同一网段内的主机的分布结构看作是平的,那我们与其它网段主机之间的关系就是“立体”的。大家应该都知道,互联网,也就是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

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.