本文将详细介绍如何使用 iperf3 工具,测试弹性云主机间网络性能。内容主要包括“测试前准备”、“TCP 带宽测试”、“UDP PPS 测试”。
基础信息
- 被测机:被压力测试网络性能的弹性云服务器,可作为 iperf3 测试中的 client 端(发送端)。
- 辅助云服务器:作为 iperf3 测试中的 server 端(接收端)。
- 测试工具 iperf3 常用参数说明如表 1 所示。
表1 iperf3工具client端常用参数说明
client端参数 | 参数说明 |
---|---|
-p | 端口号,iperf3的默认端口号是5201 |
-c | 接收端(server端)IP地址 |
-u | 如果发送UDP报文,则使用该参数 |
-b | 发送带宽 |
-t | 测试时长 |
-l | 数据包大小 |
-R | 以反向模式运行(服务器发送数据,客户端接收数据) |
表2 iperf3工具server端常用参数说明
server端参数 | 参数说明 |
---|---|
-s | 以 Server 模式运行 |
-D | 在后台以守护进程运行 |
测试准备
- 准备弹性云服务器。
要求:创建5台弹性云服务器作为被测机,创建5台弹性云服务器作为辅助云服务器,保证被测机和辅助云服务器之间能够正常通信。
表3 测试准备
类型 | 数量 | 镜像 | 规格 |
---|---|---|---|
被测机 | 5台 | CentOS 7.6 64bit(推荐) | 4C8G(推荐) |
辅助云服务器 | 5台 | CentOS 7.6 64bit(推荐) | 4C8G(推荐) |
- 准备测试工具。
要求:需分别在被测机和辅助云服务器上安装测试工具iperf3,将被测机和辅助云服务器分别绑定弹性EIP,使用如下安装命令安装测试工具:yum -y install iperf3
- 在辅助云服务器上开启iperf3服务。
执行以下命令,在辅助云服务器上开启iperf3服务,开启的端口号为xxx。iperf3 -s -D -p xxx
TCP带宽测试
-
测试TCP发送带宽。
a. 分别在“所有辅助云服务器”中执行以下命令,启动iperf3 server进程。iperf3 -s -D -p xxxx
其中,-p用于指定监听端口。
b. 在“被测机”中执行以下命令,启动iperf3打流进程,分别指定到不同辅助云服务器的监听端口。其中,iperf3工具的常用参数说明请参见表1和表2。
IP地址对应第1台辅助云服务器:
iperf3 -c
辅助云服务器1的ip地址-p xxx -t 60
IP地址对应第2台辅助云服务器:
iperf3 -c
辅助云服务器2的ip地址-p xxx -t 60
IP地址对应第3台辅助云服务器:
iperf3 -c
辅助云服务器3的ip地址-p xxx -t 60
IP地址对应第4台辅助云服务器:
iperf3 -c
辅助云服务器4的ip地址-p xxx -t 60
IP地址对应第5台辅助云服务器:
iperf3 -c
辅助云服务器5的ip地址-p xxx -t 60
-
测试TCP接收带宽。
a. 分别在“所有辅助云服务器”中执行以下命令,启动iperf3 server进程。iperf3 -s -D -p xxxx
其中,-p用于指定监听端口。
b. 在“被测机”中执行以下命令,启动iperf3打流进程,分别指定到不同辅助云服务器的监听端口。其中,iperf3工具的常用参数说明请参见表1和表2。
IP地址对应第1台辅助云服务器:
iperf3 -c
辅助云服务器1的ip地址-p xxx -t 60 -R
IP地址对应第2台辅助云服务器:
iperf3 -c
辅助云服务器2的ip地址-p xxx -t 60 -R
IP地址对应第3台辅助云服务器:
iperf3 -c
辅助云服务器3的ip地址-p xxx -t 60 -R
IP地址对应第4台辅助云服务器:
iperf3 -c
辅助云服务器4的ip地址-p xxx -t 60 -R
IP地址对应第5台辅助云服务器:
iperf3 -c
辅助云服务器5的ip地址-p xxx -t 60 -R
-
解析TCP测试结果。
测试结束后,发送端iperf3进程输出结果如图所示:最终结果为所有iperf3进程测试结果之和。
UDP PPS测试
-
测试UDP发送PPS。
a. 登录辅助云服务器。
b. 分别在所有“辅助云服务器”中执行以下命令,启动server进程。iperf3 -s -p xxxx -D
其中,-p用于指定监听端口
c. 在“被测机”中执行如下命令,启动client进程。其中,iperf3工具的常用参数说明请参见表1和表2。IP地址对应第1台辅助云服务器:
iperf3 -c
辅助云服务器1的ip地址-p xxx -t 60 -u -b 30M
IP地址对应第2台辅助云服务器:
iperf3 -c
辅助云服务器2的ip地址-p xxx -t 60 -u -b 30M
IP地址对应第3台辅助云服务器:
iperf3 -c
辅助云服务器3的ip地址-p xxx -t 60 -u -b 30M
IP地址对应第4台辅助云服务器:
iperf3 -c
辅助云服务器4的ip地址-p xxx -t 60 -u -b 30M
IP地址对应第5台辅助云服务器:
iperf3 -c
辅助云服务器5的ip地址-p xxx -t 60 -u -b 30M
-
测试UDP接收PPS。
a. 执行以下命令,在“被测机”中启动server进程。其中,iperf3工具的常用参数说明请参见表1和表2。
IP地址对应第1台辅助云服务器:
iperf3 -c
辅助云服务器1的ip地址-p xxx -t 60 -u -b 30M -R
IP地址对应第2台辅助云服务器:
iperf3 -c
辅助云服务器2的ip地址-p xxx -t 60 -u -b 30M -R
IP地址对应第3台辅助云服务器:
iperf3 -c
辅助云服务器3的ip地址-p xxx -t 60 -u -b 30M -R
IP地址对应第4台辅助云服务器:
iperf3 -c
辅助云服务器4的ip地址-p xxx -t 60 -u -b 30M -R
IP地址对应第5台辅助云服务器:
iperf3 -c
辅助云服务器5的ip地址-p xxx -t 60 -u -b 30M -R
-
解析UDP PPS测试结果。
UDP PPS测试结果示例如图所示:
多流打流测试方案(针对大规格云主机)
针对大规格云主机,单进程打流可能无法发挥出云主机的性能,可以参考下述多流打流测试方案。
虚机网络性能说明
虚机从同⼀个队列发出的报文,在底层只能被⼀个cpu转发。即虚机⼀个队列的发包性能 <= ovs单核转发性能。
虚机网络性能测试瓶颈主要可能出现在如下几个地方:
- 虚机发包能力不足: 查看发包进程cpu是否打满。通过增加发包进程/cpu数量可能提高发包性能。
- 虚机收包能⼒不足: 查看收包进程/softirq cpu是否打满。通过增加虚机队列数量,或者开启rps可能提高性能。
- ovs转发性能不足: ovs-util.py perf可以查看转发cpu使用情况,如果出现idl=0,则说明转发cpu可能性能不足。
- iperf测试udp丢包严重:可以尝试增大收发包缓冲区。
echo 16777216 > /proc/sys/net/core/rmem_max echo 16777216 > /proc/sys/net/core/rmem_default echo 16777216 > /proc/sys/net/core/wmem_max echo 16777216 > /proc/sys/net/core/wmem_default
性能测试步骤
- 确定两个⽤于性能测试的计算节点: A, B。
- .在每个计算节点上分别创建2个虚机,虚机规格尽量大,虚机内核版本4.19及以上(建议使用ctyunos2)。
- 4个测试虚机内安装iperf3包。
yum install iperf3
- B计算节点上的两个虚机(B1, B2)分别起iperf服务端。
for i in {0..63}; do iperf3 -s -D -p 520$i ; done
- A计算节点上两个虚机(A1, A2)起iperf客户端(A1给B1发包, A2给B2发包)。
创建发包脚本:cat > iperf-client.sh <<\EOF #!/usr/bin/env bash max_thread=64 run_time=60 udp_opts="-u -b 100G" tcp_opts="" use_tcp=1 usage() { echo ' usage: $0 -s <server-ip> [--pps] [-n <nprocess>] [-t <time>] [--tcp] -s Iperf server ip address. --pps Send small pkts for pps benchmark. By default send large pkts for bandwidth benckmark. -n Set max process number. If not set, tx queue number is used. -t time in seconds to transmit for, default 60 seconds. --udp Send udp instead of tcp(default). Udp is good for some special scenarios. ' } while [ $# -gt 0 ]; do case $1 in -s | --server) server="$2" shift ;; -n | --nprocess) max_thread="$2" shift ;; -t | --time) run_time="$2" shift ;; --pps) # 144 bytes tcp_opts="$tcp_opts -M 90" # 18(eth) + 28(ip) + 18(udp) = 64 udp_opts="$udp_opts -l 18" ;; --udp) use_tcp=0 ;; -h | --help) usage exit 0 ;; *) usage exit 1 ;; esac shift done interface=$(ip route get $server |grep -oP "(?<=dev )\S+") i=0 for fxps in `ls /sys/class/net/$interface/queues/tx-*/xps_cpus | sort` do aff=$(cat $fxps) if ((i >= max_thread));then break fi no_zero_aff=$(echo "$aff" | tr -d '0xX') if [ -z "$no_zero_aff" ];then _aff=$((1 << $i)) aff=$(printf "%x" $_aff) echo $aff > $fxps fi # Affinity on only one core suffix="" for (( j=${#aff}-1; j>=0; j-- )); do if [ "${aff:$j:1}" == "," ];then continue fi if [ "${aff:$j:1}" != "0" ];then aff_one="${aff:$j:1}${suffix}" break fi suffix+="0" done if [ -z "$aff_one" ];then echo "Failed to find txq affinity core" exit 1 fi aff_one=`echo $aff_one | tr '13579bdf' '1' | tr '26ae' '2' | tr '4c' '4'` if ((use_tcp > 0)) ;then taskset $aff_one iperf3 -c $server $tcp_opts -P 2 -p 520$i -t $run_time & else taskset $aff_one iperf3 -c $server $udp_opts -P 2 -p 520$i -t $run_time & fi ((i++)) done wait EOF
测试pps(144B/64B小包):
bash iperf-client.sh -s <B1-ip> --pps -t 300
测试带宽(1500B大包):
bash iperf-client.sh -s <B1-ip> -t 300
- 打流的过程中ovs会根据流量做balance,所以我们流量测试应持续5分钟。等待底层balance到最佳状态,以得到较好的性能结果。