在公有云使用过程中,对于CVM (Cloud Virtual Machine)的网络性能测试需求比较普遍,例如:新上到腾讯云平台,或者有新的产品计划上线,这些情况下都希望对CVM实际网络情况做一个摸底。虽然官方文档[1]也有关于网络带宽测试的说明,但是仅仅给出了最基本的方法,对于可能遇到的问题并没有完整的指导。而为了测试到CVM标称的网络性能规格,需要将性能优化到极致,其中的细节尤其重要。腾讯云现网客户也因此有不少遇到此类问题提工单咨询,为此耗费了大量的时间。本文希望通过将此过程中遇到的问题进行系统性的说明,从而提高测试效率,为客户节省时间。
本次测试使用了4台IT5.8XLARGE128机型,其中1台为待测试的机器,其它3台作为陪练机。官方文档[1]给出了8台陪练机的建议,而经过网络参数调优后,使用3台陪练机就足够了。测试机器的操作系统选用了CentOS 7.9,对应镜像ID为img-l8og963d。实际验证CentOS 7.2 往上的系统都是可行的,这包括了:CentOS 8.x,CentOS Stream 8,以及 CentOS Stream 9。为了保持环境的一致性,4台测试机器安装了同样的OS版本。
测试过程分为了两个阶段:
第一阶段采用1对1测试,在此过程中摸索出哪些参数会对网络吞吐带宽有影响;
第二阶段采用1对n测试,通过多客户端将网络带宽打满,从而测试出性能极限。
详细的操作步骤分为如下几步:
测试的第一步需要确认CVM实例的网络规格参数。例如本测试中采用的实例规格型号为:IT5.8XLARGE128。根据官网说明[2],该型号硬件资源为CPU32核,内存128G,网络参数为:
网络收发包(pps)(出+入):250万
内网带宽能力(Gbps)(出+入):12
为了充分利用并发处理的能力,我们需要获取到网卡队列数,方法如下所示:
1) 确认网卡名称
运行ip a 查看网卡信息
这里第一个是loopback 虚拟网卡,用于与自身通信的;第二个,eth0 是实际的网卡名称。
2) 获取网卡队列数
采用如下命令获取网卡队列数:ethtool -l eth0 ,这里eth0是我们前面获取到的网卡名称。
可以看到对于该CVM机型,队列数是8,这个值是我们后面设置并发度测试的基础。顺便注意一下“current hardware settings” 中的combined 数值应该与“Pre-set maximums”中的一致,如果不一致,需要更改过来。
测试采用了iperf3软件。在CentOS下安装该软件,可以采用如下任何一种方式:
1) 采用yum方式安装
输入如下命令即可完成iperf3的安装:
yum install iperf3
采用yum方式安装的版本根据CentOS版本的不同会有不同。
2) 采用软件包方式安装
可以下载并安装该软件包[3]:
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/iperf3-3.1.7-2.el7.x86_64.rpm
chmod +x ./iperf3-3.1.7-2.el7.x86_64.rpm
rpm -ivh ./iperf3-3.1.7-2.el7.x86_64.rpm
安装完成后运行“iperf3 -v”可以查看版本信息。
测试时一个CVM以服务器的方式运行iperf3[4],另外一个CVM以客户端的方式运行。
1) 服务端测试命令
iperf3 -s -i 20 -p 9901
其中各项参数含义为:
-s 表示运行在服务端模式
-i 20 表示每隔20秒显示一次结果
-p 9901 表示在9901端口监听
2) 客户端测试命令
iperf3 -c $server_ip -p 9901 -t 300 -i 20 -P 8
其中各项参数含义为:
-c $server_ip -c表示连接到服务器,其中“$server_ip”用服务器IP地址替代
-p 9901 表示连接到端口 9901
-t 300 表示测试时长为300秒
-i 20 表示每隔20秒显示一次结果
-P 8 表示并发数为8
注意:这里“-p”是小写的,表示端口号;“-P”是大写的,表示并发数,并发数的大小与之前所查到的网卡队列数相对应。
为了观察网络流量情况,需要在server端安装sar工具,具体命令如下所示:
yum install sysstat -y
systemctl start sysstat.service
systemctl enable sysstat.service
安装完成后,在server端运行如下命令查询网络流量信息:
sar -n DEV 10
其中“10”表示每隔10秒显示一次统计信息。
3) -t 参数说明
上述测试中使用了“-t”指定了测试时长。这是因为根据TCP/IP协议的说明,网络数据发送过程中有一个滑动窗口的概念。若网络状态良好,其发送/接受窗口的大小是逐步增长的,并最终达到一个最大值。在这个过程中,网络吞吐带宽是逐步增大的,所以性能测试持续的时间建议不要太短。
4) -P 参数设置
如前所述,iperf3中P参数代表并发度。直觉上应该与网卡队列数相关,但是关于如何设置该参数并没有明确的理论说明。我们通过实际测试得到结果如下:
P值 | 带宽值Gbits/sec | 说明 |
---|---|---|
3.73 | 不指定P值 | |
-P 8 | 6.39 | |
-P 16 | 7.29 | |
-P 24 | 7.60 | 测得的最高值 |
-P 32 | 7.22 | |
-P 40 | 6.98 |
5) time-wait参数调整
在上述并发度的测试过程中,有时候会观察到time-wait连接参数保持水平状态,这时候表示server端已经无法接受新的连接。可以通过调小“net.ipv4.tcp_fin_timeout”并调大“net.ipv4.tcp_max_tw_buckets”这两个参数来解决这个问题。例如可以做如下调整:
sysctl -w net.ipv4.tcp_fin_timeout=30 (可以根据业务情况调小)
sysctl -w net.ipv4.tcp_max_tw_buckets = 6000 (可以根据业务情况调大)
1) 测试方式说明
在1对1测试的情况下还不能够将被测试机器的带宽推到极限,此时需要在server端启动多个监听端口,并启动多个陪练机测试。
可以通过多个终端登录服务器,并发别运行如下命令:
iperf3 -s -i 20 -p 9901
iperf3 -s -i 20 -p 9902
iperf3 -s -i 20 -p 9903
在3个陪练机器上分别运行:
iperf3 -c $server_ip -p 9901 -t 300 -i 20 -P 24
iperf3 -c $server_ip -p 9902 -t 300 -i 20 -P 24
iperf3 -c $server_ip -p 9903 -t 300 -i 20 -P 24
其中“$server_ip”用服务器的ip替换;9901,9902,和9903对应着服务上的不同监听端口。然后在服务器端运行“sar -n DEV 10”查看测试数据。
2) TCP参数调整
开启1对n测试后,发现server端的网络带宽还是没有达到标称值。经过深入研究发现,缺省的tcp参数并没有针对大带宽的机器做过优化,所以需要对tcp参数做一下特别设置。主要的修改包括如下几项[5]:
将读写缓冲区的最大值调整到2GB
sysctl -w net.core.rmem_max=2147483647
sysctl -w net.core.wmem_max=2147483647
TCP/IP的读写窗口是逐步变化的,调整如下
sysctl -w net.ipv4.tcp_rmem="4096 87380 2147483647"
sysctl -w net.ipv4.tcp_wmem="4096 65536 2147483647"
拥塞控制算法替换为htcp,通常默认的会是cubic。两种算法的对比参见文档
sysctl -w net.ipv4.tcp_congestion_control=htcp
建议开启fair queueing 特性
sysctl -w net.core.default_qdisc=fq
将上述调整应用到server端以及所有的client端,最后得到测试结果如下:
这里测试的是收数据性能,但是计算的时候需要把收发的值加到一起与规格说明做对比。此外需要注意,这里显示的是大B,而规格说明中用到的是小b,需要换算后再做比较。选取第一行测试值计算如下:
(1581994.24+6605.70)*8 = 12708799.52 kbps
可以看到达到了标称的12Gbps。
上面的测试是server工作在接收模式,若要转换成发送模式只要分别在client端加上“-R”参数,其格式如下所示:
iperf3 -c $server_ip -p 9901 -t 300 -i 20 -P 24 -R
iperf3 -c $server_ip -p 9902 -t 300 -i 20 -P 24 -R
iperf3 -c $server_ip -p 9903 -t 300 -i 20 -P 24 -R
这样得到发送模式下的带宽值如下所示:
同样选取第一行计算:
(7115.14+1608763.67)*8 = 12927030.48 kbps
可以看到也是达到了标称值的。
1) 测试过程中没有观察到带宽最大值达到标称值?
测试过程中我们会观察到网络带宽值是在动态变化的,这是因为实际带宽值受到通信链路中各个节点的影响,例如中间的交换机如果有其它大流量通信等就会影响到测试值。测试过程中以观察到的最大值为准,如果最大值还是不能达到标称值,建议一方面采用较长的测试时长,从而使得发送/接受窗口可以增长到最大值,获得最佳性能;另一方面,建议可以选择不同的时段多测试几次,选取最大值。
2) 测试过程中观察到有丢包现象?
CVM网络规格中对网络收发包和内网带宽能力均做了说明。如果超出上述规格限制,就有可能出现丢包现象。客户在某些限时抢购的业务场景下还有可能出现瞬时流量突发,此时也会导致流量超规格引起丢包。但是这种情况在CVM流量监控图上却不一定能发现问题,是因为监控图显示的数据粒度是分钟级别的,经过平均后不一定能够发现秒级的突发。
下图是一个业务场景中,客户端的CVM超过pps规格引起丢包的情况。可以看到在3次握手的过程中,客户端发送ack的应答包以及后续的重传包均没有能够到达server端。在宿主机层面的分析发现是因为超规格,数据包被丢弃了。
3) 不同操作系统版本对于测试结果是否有影响?
本测试采用了CentOS 7.9版本,而在客户生产环境中还有一些使用着CentOS 6.x 版本。根据参考文献[6]所做的分析,CentOS 7.2的TCP性能优于CentOS 6.5。所以建议尽量采用高版本的操作系统。
4) 优化网络性能的常用方法有哪些?
网络性能的测试同时也是优化网络的过程,这就涉及到对TCP/IP的各项参数进行调优。建议可以参考文档[5]《40G/100G Network Tuning》以及参考文档[7]《TCP/IP Tuning》对各项参数进行调整,此外也可根据其它文档进行绑核等操作,从而提高测试性能。
[1] 腾讯官网“网络性能测试”说明
https://cloud.tencent.com/document/product/213/11460
[2] CVM实例规格说明
https://cloud.tencent.com/document/product/213/11518
[3] CentOS 7, CentOS 8,CentOS 8 Stream以及CentOS 9 Stream 支持的软件包
https://centos.pkgs.org/
[4] iperf 官方参考文档
https://iperf.fr/iperf-doc.php#3doc
[5] 40G/100G Network Tuning
https://fasterdata.es.net/host-tuning/linux/100g-tuning/
[6] Recent Linux TCP Updates, and how to tune your 100G host
https://fasterdata.es.net/assets/Papers-and-Publications/100G-Tuning-TechEx2016.tierney.pdf
[7]《TCP/IP Tuning》
https://www.ateam-oracle.com/post/tcpip-tuning
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。