Azure的VM采用FPGA硬件加速的方式,通过硬件实现TCP/UDP的加速。对ICMP,不同的硬件的VM采用不同的方式对ICMP进行转发。
- 在第四代之前的VM,采用Host CPU的方式
- 最新的第五代VM采用Host上SoC芯片进行ICMP数据包转发
具体内容可以参考Azure VM的加速网络。
很多用户在使用VM时,会实时监控VM间的时延,并根据VM间的时延进行部署的调度。在Azure的Linux VM上,建议采用sockperf进行时延的测试。
本文会介绍:
- 如何创建带有网络加速的VM
- 将多台VM部署到邻近放置组,减少时延
- 采用sockperf测试时延
一 创建邻近放置组
将多个 VM 放置在单个Zone中,可以减少实例之间的物理距离。但是,随着 Azure 数据中心规模的增加,单个Zone会跨多个物理数据中心,这会增加VM间的物理距离,从而增加网络的时延。
若要让 VM 尽可能靠近,将VM间时延尽可能降至最低,应该将 VM 部署到一个邻近放置组中,这样Azure平台会将在一个邻近放置组中的资源放置在尽可能近的物理位置。
具体创建方式如下:
az group create -n vm-latency -l uswest2 az ppg create -n inwestus2 -g vm-latency |
二 创建带有网络加速的VM
Azure VM Host上运行虚拟化软件,如果采用网络加速,会实现Hypervisor-Bypass,从而减少时延,增加吞吐量。
配置网络加速,需要在网卡上开启Network Accelerate。
创建VM的命令行如下:
az vm create -n newvm -g vm-latency -l westus2 -z 1 \ --accelerated-networking true \ --image centos \ --size Standard_D2s_v5 \ --ppg inwestus2 \ --authentication-type ssh \ --admin-username user01 \ --ssh-key-values ~/.ssh/id_rsa.pub \ --count 2 |
添加防火墙规则,允许sockperf的TCP流量:
az network nsg create -g vm-latency -n sockperf -l westus2 az network nsg rule create -g vm-latency \ --nsg-name sockperf \ --name in_80 \ --priority 300 \ --source-address-prefixes Internet \ --source-port-ranges '*' \ --destination-address-prefixes '*' \ --destination-port-ranges 80 \ --access Allow \ --protocol Tcp \ --direction Inbound
az network vnet subnet update -g vm-latency \ --vnet-name newvmVNET \ --name newvmSubnet \ --nsg sockperf |
三 安装sockperf测试网络时延
如前文所述,sockperf是Azure推荐的测试tcp时延的工具。sockperf是一个基于socket API的网络基准测试工具,被设计用于测试高性能系统的性能(延迟和吞吐量)(它也适合于测试普通网络系统的性能)。它涵盖了大部分的套接字API调用和选项。具体来说,除了标准的吞吐量测试外,sockperf还做了以下工作。
以亚纳秒级的分辨率测量每个离散数据包的延迟,可以在ping-pong模式或负载模式下进行延迟测量。这意味着,即使在每秒数百万个数据包的负载下,我们也能测量单个数据包的延迟。
1 安装sockperf
通过git clone获取源代码,进行编译安装:
yum install gcc-c++ automake make git -y git clone https://github.com/Mellanox/sockperf.git cd sockperf ./autogen.sh ./configure --prefix=/usr make make install |
查看安装版本:
# sockperf --version sockperf, version 3.7-7.git05c62507670b compiled Nov 5 2021, 12:27:43
Copyright (C) 2011-2021 Mellanox Technologies Ltd. SockPerf is open source software, see http://github.com/mellanox/sockperf |
2 服务器端配置
在服务器端开启Daemon,监听client的sockperf请求:
ip_add=$(ifconfig eth0 | grep inet | grep -v inet6 | awk '{print $2}') sockperf sr -i $ip_add -p 80 --tcp --daemonize |
通过netstat可以看到sockperf在监听80端口
3 客户端时延测试
通过下面的命令测试客户端到服务器端的时延:
while true; \ do sockperf ping-pong \ -i 10.0.0.4 -p 80 --tcp \ --full-rtt -m 64 | awk '{print $0 " --- " strftime()}' >> sock.txt; \ sleep 60; \ done |
测试结果如下:
可以看到,每一次sockperf测试的平均时延是在4x-5x us左右。
四 总结
由于Azure VM对ICMP数据包没有加速的功能,我们通过TCP的方式检测两台VM的时延。Mellanox的sockperf网络检测工具,可以非常方便的检测Azure Linux VM间的时延。