《实战录》导语
本期分享人为云端卫士安全能力工程师陈冲,将介绍使用netperf进行测试传统socket性能测试。由于本文较长,为方便离线阅读,在文末点击阅读原文,可以下载PDF版本。
Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。Netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送数据,以及另外一个系统能够以多快的速度接收数据。本文中我们将介绍使用netperf进行测试传统socket性能测试。
1. 系统环境
1. 发报机测试环境
Ø 操作系统类型: Linux
Ø 操作系统版本: CentOS 7.0
Ø 内核版本:3.10.0-123.el7.x86_64
Ø 千兆网卡型号:BCM5720
2. 收报机测试环境
Ø 操作系统类型: Linux
Ø 操作系统版本: CentOS 7.0
Ø 内核版本:3.10.0-123.el7.x86_64
Ø 千兆网卡型号:Intel Corporation I350 Gigabit
测试中发报网口和收报网口采用直连的方式。
2. Netperf版本
版本:netperf-2.7.0
Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接,client端是netperf,用来向server发起网络测试。在client与server之间,首先建立一个控制连接,传递有关测试配置的信息,以及测试的结果;在控制连接建立并传递了测试配置信息以后,client与server之间会再建立一个测试连接,用来来回传递着特殊的流量模式,以测试网络的性能。
Server端运行命令: netserver -D -p 4444
当netserver在server端启动以后,就可以在client端运行netperf来测试网络的性能。netperf通过命令行参数来控制测试的类型和具体的测试选项。根据作用范围的不同,netperf的命令行参数可以分为两大类:全局命令行参数、测试相关的局部参数。
两者之间使用--分隔:netperf [global options]-- [test-specific options]
这里我们只解释那些常用的命令行参数,其它的参数读者可以查询netperf的man手册。
-H host :指定远端运行netserver的server IP地址。
-p port : 指定远端运行netsever的端口
-l testlen:指定测试的时间长度(秒)
-t testname:指定进行的测试类型,包括TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR。
TCP_STREAM: Netperf缺省情况下进行TCP批量传输,即-t TCP_STREAM。测试过程中,netperf向netserver发送批量的TCP数据分组,以确定数据传输过程中的吞吐量:
TCP_RR: 方式的测试对象是多次TCP request和response的交易过程,但是它们发生在同一个TCP连接中,这种模式常常出现在数据库应用中。数据库的client程序与server程序建立一个TCP连接以后,就在这个连接中传送数据库的多次交易过程。
TCP_CRR: 与TCP_RR不同,TCP_CRR为每次交易建立一个新的TCP连接。最典型的应用就是HTTP,每次HTTP交易是在一条单独的TCP连接中进行的。因此,由于需要不停地建立新的TCP连接,并且在交易结束后拆除TCP连接,交易率一定会受到很大的影响。
UDP_STREA: 用来测试进行UDP批量传输时的网络性能。需要特别注意的是,此时测试分组的大小不得大于socket的发送与接收缓冲大小,否则netperf会报出错提示.
UDP_R: 方式使用UDP分组进行request/response的交易过程。由于没有TCP连接所带来的负担,所以我们推测交易率一定会有相应的提升。
局部参数:
-s size: 设置本地系统的socket发送与接收缓冲大小
-S size:设置远端系统的socket发送与接收缓冲大小
-m size:设置本地系统发送测试分组的大小
-M size: 设置远端系统接收测试分组的大小
-r req,resp: 设置re’quest和reponse分组的大小
1. TCP网络性能
1).单个TCP连接,批量传输大量数据
1. 测试网络分组对于传统socket速率的影响,网络分组可以理解为一次性发送一组报文,主要测试路由器是否缺乏足够的缓冲区空间进而对socket的传输速率有影响,但是在本测试环境下两个网口是直连的,所以预计分组对于吞吐量没有任何影响。
客户端运行命令: ./netperf –H 192.168.20.124 -l 20 –p 4444 -- -m size
网卡速率(Mbps) |
本地socket缓冲(bytes) |
远端socket缓冲(bytes) |
测试分组大小(bytes) |
测试时间(s) |
客户端个数 |
吞吐量(Mbit/s) |
1000 |
16834 |
87380 |
2048 |
20 |
1 |
941.42 |
1000 |
16384 |
87380 |
4096 |
20 |
1 |
941.43 |
1000 |
16384 |
87380 |
8192 |
20 |
1 |
941.23 |
1000 |
16384 |
87380 |
16384 |
20 |
1 |
941.43 |
2. 测试本地缓冲对于传统socket速率的影响。
客户端运行命令: ./netperf –H 192.168.20.124 -l 20 –p 4444 -- -s size
本地socket缓冲(bytes) |
远端socket缓冲(bytes) |
测试分组大小(bytes) |
测试时间(s) |
客户端个数 |
吞吐量(Mbit/s) |
|
2048 |
87380 |
16834 |
20 |
1 |
180.62 |
|
1000 |
4096 |
87380 |
16384 |
20 |
1 |
487.49 |
1000 |
8192 |
87380 |
16384 |
20 |
1 |
911.80 |
1000 |
16384 |
87380 |
16384 |
20 |
1 |
941.43 |
3. 测试远端缓冲对于传统socket速率的影响。
客户端运行命令: ./netperf –H 192.168.20.124 -l 20 –p 4444 -- -S size
网卡速率(Mbps) |
本地socket缓冲(bytes) |
远端socket缓冲(bytes) |
测试分组大小(bytes) |
测试时间(s) |
客户端个数 |
吞吐量(Mbit/s) |
1000 |
16834 |
10922 |
16834 |
20 |
1 |
361.88 |
1000 |
16384 |
21845 |
16384 |
20 |
1 |
633.07 |
1000 |
16384 |
43960 |
16384 |
20 |
1 |
935.92 |
1000 |
16384 |
87380 |
16384 |
20 |
1 |
941.25 |
4. 测试多客户端的传统socket速率。
客户端运行命令: ./netperf –H 192.168.20.124 -l 20 –p 4444
网卡速率(Mbps) |
本地socket缓冲(bytes) |
远端socket缓冲(bytes) |
测试分组大小(bytes) |
测试时间(s) |
客户端个数 |
吞吐量(Mbit/s) |
1000 |
16834 |
87380 |
16834 |
60 |
1 |
941.45 |
1000 |
16384 |
87380 |
16384 |
60 |
2 |
946.18 |
1000 |
16384 |
87380 |
16384 |
60 |
3 |
955.00 |
1000 |
16384 |
87380 |
16384 |
60 |
4 |
966.76 |
2).