使用Iperf调整网络
Iperf 是一个 TCP/IP 和 UDP/IP 的性能测量工具,通过调谐各种参数可以测试TCP的最大带宽,并报告带宽、延迟,最大段和最大传输单元大小等统计信息。Iperf可以运行于Linux/BSD、Unix及Windows等操作系统。
一、Iperf工作原理
Iperf主要的功能是调谐基于特定路径的TCP连接的性能,我们知道TCP连接调谐最基本的措施是调谐TCP窗口的大小,窗口大小控制在任何节点网络中可以存在的数据大小如果该值太小, 发送者将会在某段时间处于空闲状态,从而影响发送的性能。TCP窗口大小的理论值为链路瓶颈带宽与往返时延的乘积:
bottleneck bandwidth * round trip time
例如链路瓶颈带宽为45Mbit/sec,往返时延为42ms(可以通过ping来测试),那么窗口的理论值为:
45Mbit/sec*42ms=(45e6)*(42e-3)
=1890000 bits
230KByte
调谐窗口大小即可以上.理论值为基准,在该值上慢慢增大或减少,即可获得最好的结果。
IperfN试TCP带宽的原理较简单,即客户端和服务器端建立连接,然后客户端发送一定大小的数据,并记下发送的时间, 或者客户端在一定的时间内发送数据,并记下发送的总数据。带宽的大小等于发送的总数据除以发送的总时间。对服务器端来说,就是在连接建立时间内,接收的总数据除以所花时间即为服务器端所测得的带宽。MSS的大小通过TCP内核接口函数直接获得。
测试UDP的性能,客户端可以指定UDP数据流的速率。客户端发送数据时将根据客户提供的速率计算数据报发送之间的时延。另外客户还可以指定发送数据报的大小。每个发送的数据报包含一个ID号,用来惟一的标识该报文。服务器端则根据该ID 号来确定数据报丢失和乱序。当把UDP报文大小设置可以将整个报文放入I P 层的包(packet)内时,那么UDP所测得的报文丢失数据即为IP层包的丢失数据。这提供了一个有效的测试包丢失情况的方法。数据报传输延迟抖动(Jitter)的测试由服务器端完成,客户发送的报文数据包含有发送时间戳,服务器端根据该时间信息和接收到报文的时间戳来计算传输延迟抖动。传输延迟抖动反映传输过程中是否平滑。由于它是一个相对值,所以并不需要客户端和服务器端时间同步。
二、Iperf实现
Iperf源代码采用面向对象的C++语言实现,主要包括基本类和实现类两部分。基本类提供了实现中需要用到的一些基本的对象,包括队列、链表、时间管理、锁、条件、线程等,这些代码不是特定于Iperf应用的,可以移植到其他应用程序。实现类中主要包括针对Iperf应用的类,包括实现客户端/服务器端发送和接收数据的类,以及用于统计信息的类等。这里主要讨论一下与应用关系最紧密的几个类,其他的类不做详述。
Iperf主要类图结构包括9个类。IPerf 的核心部分均在PerfSocket类中实现,包括客户端和服务器端发送和接收数据、带宽报告、数据丢失及延迟抖动报告,以及窗口大小和MSS报告等功能。其中Speaker和Client为客户端的对象,Listener、Audience和Server为服务器端的对象。客户端和服务器端的通信通过三个消息完成:Connect、write及shutdown。这里connect不同于TCP中的连接,它还包含一个数据报文,其信息为双向测试而传给服务器端的信息,主要用于双向测试时让服务器端启动客户端线程而所需要的信息。UDP 测试的过程基本上跟TCP类似。UDP报文包含了一个应用报文头,其主要字段为报文ID和时间信息,这个主要是为了测试UDP报文的丢失、乱序以及延迟抖动性能。UDP的第一个报文用来建立连接,不作为应用数据,其信息为双向测试而传给服务器端的信息,主要用于双向测试时让服务器端启动客户端线程而所需要的信息。UDP与TCP第一个报文内容的主要区别是UDP报文还包括一个应用报文头。UDP传输结束通过客户端发送一个FIN 的报文来实现,该报文的报文ID为负数,服务器端接收到FIN报文后即停止接收报文并回送一个AckFIN报文给客户,AckFIN 报文包含了服务器端得到的测试数据。
操作举例:
1)TCP测试
服务器执行:#iperf -s -i 1 -w 1M
客户端执行:#iperf -c host -i 1 -w 1M
其中-w表示TCP window size,host需替换成服务器地址。
2)UDP测试
服务器执行:#iperf -u -s
客户端执行:#iperf -u -c 10.32.0.254 -b 900M -i 1 -w 1M -t 60
其中-b表示使用带宽数量,千兆链路使用90%容量进行测试就可以了。
本文出自 “李晨光原创技术博客” 博客,谢绝转载!