本文下载链接:
[学习笔记] Netperf 网络性能测试工具. PDF https://www.yuncpan.com/b11946
一, Netperf 工具简介
1, 什么是 Netperf ?
(1)Netperf 是由惠普公司开发的一种网络性能测量工具, 主要针对基于 TCP 或 UDP 的传输.
(2)Netperf 根据应用的不同, 可以进行不同模式的网络性能测试, 即批量数据传输 (bulk data transfer) 模式和请求 / 应答 (request/reponse) 模式.
(3)Netperf 测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送数据, 以及另外一个系统能够以多块的速度接收数据.
2,Netperf 工作原理
(1)Netperf 工具的工作方式
1 Netperf 工具以 client/server 方式工作.
2 server 端是 netserver, 用来侦听来自 client 端的连接.
3 client 端是 netperf, 用来向 server 发起网络测试.
(2)Netperf 工具的工作原理
在 client 与 server 之间, 首先建立一个控制连接, 用于传递有关测试配置的信息, 以及测试的结果. 在控制连接建立并传递了测试配置信息以后, client 与 server 之间会再建立一个测试连接, 用来来回传递着特殊的流量模式, 以测试网络的性能.
(3)Netperf 工具的工作流程
1 建立控制连接:
server 端 netserver 启动监听, 监听来自 client 端 netperf 的连接请求;
client 端向 server 端发送控制连接请求, server 端发现连接请求, 建立控制连接.
控制连接创建完成, 使用 BSD socket 传输信息, 属于 TCP 连接.
2 建立测试连接
client 端通过控制连接向 server 端传递测试配置信息.
server 端获取测试配置信息, 建立测试连接.
测试连接用于传输各种模式的流量测试网络的性能.
3 测试网络性能
client 端通过测试连接向 server 端发送 Bulk 模式流量模式的数据.
server 端接受 Bulk 模式流量模式的数据并产生测试结果 1.
client 端通过测试连接向 server 端发送 request/response 流量模式的数据.
server 端接受 request/response 流量模式的数据并产生测试结果 2.
4 输出测试结果
server 端通过控制连接向 client 端发送测试结果.
client 端接受到测试结果并显示或保存.
3,Netperf 安装
(1)下载安装 Netperf
- wget -c "https://codeload.github.com/HewlettPackard/netperf/tar.gz/netperf-2.5.0" -O netperf-2.5.0.tar.gz
- tar -zxvf netperf-2.5.0.tar.gz
- cd netperf-netperf-2.5.0
- ./configure
- make && make install
编译不过可尝试执行:./configure --build=mips
(2)确认安装成功
执行 netperf -h 和 netserver -h 命令, 确认安装成功.
注: 服务器及客户端使用相同的源码, 测试时关闭防火墙
4, 网络性能测量的五项指标
(1)可用性(availability)
测试网络性能的第一步是确定网络是否正常工作, 最简单的方法是使用 ping 命令. 通过向远端的机器发送 icmp echo request, 并等待接收 icmp echo reply 来判断远端的机器是否连通, 网络是否正常工作.
(2)响应时间(response time)
ping 命令的 echo request/reply 一次往返所花费时间就是响应时间.
(3)网络利用率(network utilization)
网络利用率是指网络被使用的时间占总时间 (即被使用的时间 + 空闲的时间) 的比例.
网络测试工具一般使用网络吞吐量和网络带宽容量来确定网络中两个节点之间的性能.
(4)网络吞吐量(network throughput)
网络吞吐量是指在某个时刻, 在网络中的两个节点之间, 提供给网络应用的剩余带宽.
网络吞吐量非常依赖于当前的网络负载情况, 可以帮组寻找网络路径中的瓶颈.
(5)网络带宽容量(network bandwidth capacity)
网络带宽容量指的是在网络的两个节点之间的最大可用带宽. 这是由组成网络的设备的能力所决定的.
二, Netperf 使用语法
1,neserver 语法格式
参数 | 说明 |
---|---|
-H host | 指定远端运行 netserver 的 server IP 地址 |
2,netperf 语法格式
netperf 通过命令行参数来控制测试的类型和具体的测试选项.
netperf 命令行参数分为两大类: 全局命令行参数, 测试相关的局部参数, 两者之间使用 -- 分隔.
- [root@Netperf-test ~]# netperf -h
- Usage: netperf [global options] -- [test options]
- Global options:
- -a send,recv Set the local send,recv buffer alignment
- -A send,recv Set the remote send,recv buffer alignment
- -B brandstr Specify a string to be emitted with brief output
- -c [cpu_rate] Report local CPU usage
- -C [cpu_rate] Report remote CPU usage
- -d Increase debugging output
- -D time,[units] * Display interim results at least every time interval
- using units as the initial guess for units per second
- A negative value for time will make heavy use of the
- system's timestamping functionality
- -f G|M|K|g|m|k Set the output units
- -F lfill[,rfill]* Pre-fill buffers with data from specified file
- -h Display this text
- -H name|ip,fam * Specify the target machine and/or local ip and family
- -i max,min Specify the max and min number of iterations (15,1)
- -I lvl[,intvl] Specify confidence level (95 or 99) (99)
- and confidence interval in percentage (10)
- -j Keep additional timing statistics
- -l testlen Specify test duration (>0 secs) (<0 bytes|trans)
- -L name|ip,fam * Specify the local ip|name and address family
- -o send,recv Set the local send,recv buffer offsets
- -O send,recv Set the remote send,recv buffer offset
- -n numcpu Set the number of processors for CPU util
- -N Establish no control connection, do 'send' side only
- -p port,lport* Specify netserver port number and/or local port
- -P 0|1 Don't/Do display test headers
- -r Allow confidence to be hit on result only
- -s seconds Wait seconds between test setup and test start
- -S Set SO_KEEPALIVE on the data connection
- -t testname Specify test to perform
- -T lcpu,rcpu Request netperf/netserver be bound to local/remote CPU
- -v verbosity Specify the verbosity level
- -W send,recv Set the number of send,recv buffers
- -v level Set the verbosity level (default 1, min 0)
- -V Display the netperf version and exit
- -y local,remote Set the socket priority
- -Y local,remote Set the IP_TOS. Use hexadecimal.
- -Z passphrase Set and pass to netserver a passphrase
(1)全局命令行参数 [global options]
参数 | 说明 |
---|---|
-H host | 指定远端运行 netserver 的 server IP 地址 |
-l testlen | 指定测试的时间长度 (秒) |
-t testname | 指定进行的测试类型 (包括 TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR)。 |
(2)局部可选参数 [test options]
参数 | 说明 |
---|---|
-s size | 设置本地系统的 socket 发送与接收缓冲大小 |
-S size | 设置远端系统的 socket 发送与接收缓冲大小 |
-m size | 设置本地系统发送测试分组的大小,测试 PPS 时值为 1。测试 BPS 时为 1400。 |
-M size | 设置远端系统接收测试分组的大小 |
-p port | 设置测试连接 Server 端的端口 |
-D | 对本地与远端系统的 socket 设置 TCP_NODELAY 选项 |
-r req,resp | 设置 request 和 reponse 分组的大小 |
2,Netperf 模拟的流量模式
(1)Netperf 模拟的 TCP 流量模式
单个 TCP 连接, 批量 (bulk) 传输大量数据
单个 TCP 连接, request/response 流量模式
多个 TCP 连接, 每个连接中一对 request/response 的交易 (transaction) 方式
TCP 协议提供端到端]的可靠传输, 但可靠性的建立会消耗一定的网络带宽.
(2)Netperf 模拟的 UDP 流量模式
从 client 到 server 的单向批量传输
请求 / 应答 request/response 的交易方式
UDP 不保证传输的可靠性, 在使用 netperf 时要确保发送的缓冲区大小不大于接收缓冲区大小, 否则数据会丢失, netperf 将给出错误的结果. 因此, 对于接收到分组的统计不一定准确, 需要结合发送分组的统计综合得出结论.
三, Netperf 测试实例
Netperf 测试主要分服务端和客户端, 在一台主机运行服务端 netserver, 在另一台主机运行客户端 netperf.
服务端: 192.168.0.128
客户端: 192.168.0.120
测试通过单个 TCP 连接传输批量数据.
1, 启动服务端
- [root@Netserver-test ~]# netserver -p 4444 // 服务端开放 4444 端口用于监听
- Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC
通常建议在 server 端执行 sar 命令来统计实际收到的包并作为实际结果: sar -n DEV 1 320.
2, 启动客户端
- [root@Netperf-test ~]# netperf -H 192.168.0.128 -l 60 --m 1
- Recv Send Send
- Socket Socket Message Elapsed
- Size Size Size Time Throughput
- bytes bytes bytes secs. 10^6bits/sec
- 87380 16384 16384 60.01 935.66
测试结果: 显示吞吐量是 881.21Mb/s.
四, Netperf 网络性能测试分类
1, 批量 (bulk) 网络流量的性能测试
根据使用传输协议的不同, 批量数据传输又分为 TCP 批量传输和 UDP 批量传输.
(1)TCP_STREAM
Netperf 缺省情况下进行 TCP 批量传输, 即 - t TCP_STREAM, 用来测试进行 TCP 批量传输时的网络性能.
测试过程中, netperf 向 netserver 发送批量的 TCP 数据分组, 以确定数据传输过程中的吞吐量.
- [root@Netperf-test ~]# netperf -H 192.168.0.128 -l 60
- TCP STREAM TEST to 192.168.0.128
- Recv Send Send
- Socket Socket Message Elapsed
- Size Size Size Time Throughput
- bytes bytes bytes secs. 10^6bits/sec
- 87380 16384 16384 60.00 88.00
从 netperf 的结果输出中可知:
远端系统 (即 server) 使用大小为 87380 字节的 socket 接收缓冲
本地系统 (即 client) 使用大小为 16384 字节的 socket 发送缓冲
向远端系统发送的测试分组大小为 16384 字节
测试经历的时间为 60 秒
吞吐量的测试结果为 88Mbits / 秒
在缺省情况下, netperf 向 netserver 发送的测试分组大小设置为本地系统所使用的 socket 发送缓冲大小.
如果怀疑路由器由于缺乏足够的缓冲区空间, 使得转发大的分组时存在问题, 就可以增加测试分组 (-m) 的大小, 以观察吞吐量的变化. 减小测试分组的大小, 如果吞吐量有了较大的提升, 则说明在网络中间的路由器确实存在缓冲区的问题.
(2)UDP_STREAM
UDP_STREAM 用来测试进行 UDP 批量传输时的网络性能.
测试 UDP 的网络性能时, 测试分组的大小不得大于 socket 的发送与接收缓冲大小, 否则 netperf 会报出错提示.
- [root@Netperf-test ~]# netperf -t UDP_STREAM -H 192.168.0.128 -l 60
- UDP UNIDIRECTIONAL SEND TEST to 192.168.0.128
- udp_send: data send error: Message too long
为了避免这样的情况, 可以通过命令行参数限定测试分组的大小, 或者增加 socket 的发送 / 接收缓冲大小.
UDP_STREAM 方式使用使用 - m 来修改测试中使用分组的大小.
- [root@Netperf-test ~]# netperf -t UDP_STREAM -H 192.168.0.128 -- -m 1024
- UDP UNIDIRECTIONAL SEND TEST to 192.168.0.128
- Socket Message Elapsed Messages
- Size Size Time Okay Errors Throughput
- bytes bytes secs # # 10^6bits/sec
- 65535 1024 9.99 114127 0 93.55
- 65535 9.99 114122 93.54
UDP_STREAM 方式的结果中有两行测试数据:
第一行显示的是本地系统的发送统计, 吞吐量 93.55Mbits / 秒表示 netperf 向本地 socket 发送分组的能力. 但是 UDP 是不可靠的传输协议, 发送出去的分组数量不一定等于接收到的分组数量.
第二行显示的就是远端系统接收的情况, 远端系统的吞吐量 93.54Mbits / 秒也几乎等于本地系统的发送吞吐量. 但是, 在实际环境中, 一般远端系统的 socket 缓冲大小不同于本地系统的 socket 缓冲区大小, 而且由于 UDP 协议的不可靠性, 远端系统的接收吞吐量要远远小于发送出去的吞吐量.
2, 请求 / 应答 (request/response) 网络流量的性能测试
在 client/server 结构中的 request/response 模式. 在每次交易 (transaction) 中, client 向 server 发出小的查询分组, server 接收到请求, 经处理后返回大的结果数据.
(1)TCP_RR
TCP_RR 方式的测试对象是多次 TCP request 和 response 的交易过程, 但发生在同一个 TCP 连接中, 这种模式常常出现在数据库应用中. 数据库的 client 程序与 server 程序建立一个 TCP 连接以后, 就在这个连接中传送数据库的多次交易过程.
- [root@Netperf-test ~]# netperf -t TCP_RR -H 192.168.0.128
- TCP REQUEST/RESPONSE TEST to 192.168.0.128
- Local /Remote
- Socket Size Request Resp. Elapsed Trans.
- Send Recv Size Size Time Rate
- bytes Bytes bytes bytes secs. per sec
- 16384 87380 1 1 10.00 9502.73
- 16384 87380
Netperf 输出的结果也是由两行组成. 第一行显示本地系统的情况, 第二行显示的是远端系统的信息. 平均的交易率 (transaction rate) 为 9502.73 次 / 秒.
通过使用 - r 参数设置 request 和 reponse 分组的大小, 可以进行更有实际意义的测试.
- [root@Netperf-test ~]# netperf -t TCP_RR -H 192.168.0.128 -- -r 32,1024
- TCP REQUEST/RESPONSE TEST to 192.168.0.128
- Local /Remote
- Socket Size Request Resp. Elapsed Trans.
- Send Recv Size Size Time Rate
- bytes Bytes bytes bytes secs. per sec
- 16384 87380 32 1024 10.00 4945.97
- 16384 87380
- (2)TCP_CRR
TCP_CRR 的测试对象是多次 TCP request 和 response 的交易过程, 但为每次交易建立一个新的 TCP 连接. 最典型的应用就是 HTTP, 每次 HTTP 交易是在一条单独的 TCP 连接中进行的. 因此, 由于需要不停地建立新的 TCP 连接, 并且在交易结束后拆除 TCP 连接, 交易率一定会受到很大的影响.
- [root@Netperf-test ~]# netperf -t TCP_CRR -H 192.168.0.128
- TCP Connect/Request/Response TEST to 192.168.0.128
- Local /Remote
- Socket Size Request Resp. Elapsed Trans.
- Send Recv Size Size Time Rate
- bytes Bytes bytes bytes secs. per sec
- 131070 131070 1 1 9.99 2662.20
- 16384 87380
即使是使用一个字节的 request/response 分组, 交易率也明显的降低了, 只有 2662.20 次 / 秒. TCP_CRR 使用与 TCP_RR 相同的局部参数.
(3)UDP_RR
UDP_RR 方式使用 UDP 分组进行 request/response 的交易过程. 由于没有 TCP 连接所带来的负担, 所以我们推测交易率一定会有相应的提升.
- [root@Netperf-test ~]# netperf -t UDP_RR -H 192.168.0.128
- UDP REQUEST/RESPONSE TEST to 192.168.0.128
- Local /Remote
- Socket Size Request Resp. Elapsed Trans.
- Send Recv Size Size Time Rate
- bytes Bytes bytes bytes secs. per sec
- 65535 65535 1 1 9.99 10141.16
- 65535 65535
结果证实了我们的推测, 交易率为 10141.16 次 / 秒, 高过 TCP_RR 的数值. 不过, 如果出现了相反的结果, 即交易率反而降低了, 也不需要担心, 因为这说明了在网络中, 路由器或其它的网络设备对 UDP 采用了与 TCP 不同的缓冲区空间和处理技术.
五, 学习笔记参考资料
1,《Netperf - 百度百科》,
2,《Netperf 安装及使用》,soloate,https://www.cnblogs.com/soloate/p/5763748.html
3,《netperf 与网络性能测量》, 汤凯,
4,《网络性能测试方法》, 阿里云帮助文档,
来源: https://www.cnblogs.com/davidesun/p/12726006.html