接口限速功能测试的时候发现一个问题,使用iperf3打流总是打不满接口上配置的速率,而使用iperf却可以。而且在使用iperf3 的时候,我尝试过调大接口限速所使用的令牌桶的桶深,发现桶深达到一定程度的时候,流量可以达到接口速率。很容易让人想到突发流量导致丢包,从而导致无法打满接口速率。
令牌桶算法的桶深就是为突发流量提供一个缓冲,以使限速可以更加平滑,一般至少大于接口MTU,一些厂家会提供一些计算方式,如juniper就有一段描述(https://www.juniper.net/documentation/en_US/junos/topics/concept/policer-mx-m120-m320-burstsize-determining.html) ,但效果还是需要根据实际需求调整。桶深在流量持续且均匀的时候作用不大,但在有突发流的情况下作用很大。配置太小,会丢弃大量的突发报文,效果上看实际速率会小于接口限速;配置太大,在持续突发流的情况下,会放过很多需要限速的报文,效果上看实际速率会大于接口限速,但这种情况使用iperf工具很难构造,需要改写软件,或者使用专业的打流测试仪(非常贵)。
那iperf3打的是突发流?iperf打的较均匀的流量吗?一般一个工具的不同版本不会有着么大的差别,但不需要看源码,抓个包看看就行了,也不浪费时间。
如上图,iperf3工具每100ms发一轮报文,每次在2、3ms内瞬间发完;
如上图,iperf工具则均匀的发送报文,证明 iperf 和 iperf3的发包机制确实是有差别的,接口限速使用 iperf3 作为测试工具需要调整令牌桶参数以达到最佳效果。