VPC 网卡和直通网卡

VPC 网卡是软件模拟出来的,位于 Overlay 网络。直通网卡一般是位于 Underlay 网络的,原因很简单,VM 能够通过直通网卡直连交换机。

VPC 网卡都是通过 OVS 做过网络虚拟化之后的。VPC 网卡一般都是 NAT 模式还是桥接模式?

VPC 网卡是使用桥接模式,只不过 OVS 创建的网桥 br0 或者什么的里面使用了 VLAN 技术可以形成一个自己的私网 VPC。

竖向流量和横向流量 / 南北向东西向流量

南北向流量主要是在公网与 VPC 内的交互:虚拟机访问公网、公网用户访问私有网络内的云服务器等场景的流量均属于南北向流量。

东西向流量是数据中心环境中不同服务器之间之间的通信流量。

还没有搞清楚。

VPC 私有网络

为云上资源构建隔离的、自主配置和管理的虚拟网络环境。

俗话:给自己买的这些 ECS 机器开一个私网。

OVS 组件使用 VxLAN/GRE 的方式 Overlay 模式完成节点间网络平面的互通,形成自己的 VPC。

也就是需要虚拟交换机,桥接模式。

VPC-RDMA (字节 vRDMA) / 阿里云 eRDMA

在 VPC 网络内(机头 RDMA 网卡)提供 RDMA 高性能网络通信能力。并不只是需要机头是 RDMA 网卡,也需要一些其他方面的使能。

和 OVS Offload 是一个意思,把 OVS 的数据转发通路 offload 到了 RDMA 硬件上,是基于 vDPA 的吗?

见 [[#机头机尾]]

如何查看一张网卡(一般是 eth0)是 VPC 网卡还是 vRDMA 网卡(show_gids 没有用,因为已经预埋了 vRDMA 的能力)?

VM 里看不到的,不感知 vRDMA 是否开启。但是有一个讨巧的办法,vRDMA 的 MTU 是 4200,但是普通 VPC 网卡的 MTU 是 1500。

可以在 vnet 里查看一台主机支不支持 vRDMA:直接在 vnet 里输入宿主机的 ip 地址即可,右下角会展示这台机器支不支持 vRDMA,支持其实也可以不开(不勾选 vRDMA),只是预埋了这个能力。

另一种方式查看宿主机有没 vRDMA 的能力:在宿主机上执行:curl -X GET http://127.0.0.1:2929/v1/capability/show

vRDMA 在 VM 内目前没有屏蔽,即使在控制台没有勾选 vRDMA 创建的 VM,VM 里看到的 VPC 网卡也是支持 RDMA 的。目前没有屏蔽掉的规划。

如果开启了 vRDMA,所有包都走 vRDMA;如果没有开启,只有小包会走,所以会发现在里面跑测试还是可以跑通的。但是下面这个命令强制使用了大包,所以可以直接用来检查有没有开启 vRDMA:

# 强制设置使用大包
taskset -c 1 ib_write_bw -d mlx5_0 -x 3  -q 16 -D1 -s 64K --report_g --run_infinitely -F
taskset -c 1 ib_write_bw -d mlx5_0 -x 3  -q 16 -D1 -s 64K --report_g --run_infinitely -F <ip>

vRDMA 相比于 Underlay 网卡劣势

Underlay 可以直接进行 GDR,显存里的数据不需要搬运到内存中,而是直接 P2P 到网卡发送即可;

vRDMA 仍需要先 d2h 拷贝到内存,然后 CPU 再通过传统的 RDMA 使用方式来从内存 h2d 通过 BVS 发送到 VPC 网卡上,VPC 网卡再传输出去。可以说,vRDMA 内存拷贝这一步,不是 GDR。

机头机尾

See JBOG^. 一般来说一个 JBOG 就是一个机尾。

机头表示 CPU,机尾表示 GPU。也可以引申为一个表示控制面,另一个表示数据面。

机头网卡和机尾网卡的区别在于:

  • 机头网卡用于 VPC 内通信,属于 overlay 网络(可用于不同高性能计算集群间的通信,或者计算集群到存储集群);
  • 机尾网卡用于高性能计算集群内通信,属于 underlay 网络。

高性能计算集群(HPC Cluster)

注:只有高性能计算 GPU 实例才支持放在高性能计算集群内。

高性能计算集群主要是从网络角度考虑的,用于实现高性能计算 GPU 实例的逻辑隔离。属于是 Underlay 网络,也就是需要使用到真实的物理交换机:

  • 同一可用区内实例间 RDMA 网络互联互通;
  • 不同可用区内实例间 RDMA 网络相互隔离。

可以大幅提高大规模集群加速比,适用于高性能计算、人工智能、机器学习等大规模集群业务场景。

不要和 VPC 弄混。不通集群下的机器可以通过 VPC 互联。

高性能计算集群里面可以是虚拟机,也可以是裸金属的机器。

一个 HPC Cluster 里的机器只能是一个 BigPod 里面的,一个 BigPod 可以有很多个 HPC Cluster,但是一个 HPC Cluster 只能对应一个 BigPod。

OVS

OVS 的原理主要基于 SDN,通过软件实现传统硬件交换机的功能。OVS 和 VirtIO 的 vHost 是紧密相连的,两者需要同时理解。

OVS 主要工作在机头网卡机头网络场景,机尾的 Underlay 网络不需要用到 OVS。

It has traditionally been divided into:

  • a fast kernel-based datapath (fastpath,或者也叫做 forwarding plane,在内核中实现) consisting of a flow table and,
  • a slower userspace datapath (slowpath,在用户空间中实现) that processes packets that did not match any flow in the fastpath.

OVS 的数据通路其实有三种实现方式:

  • OVS + 传统网卡:因为传统网卡的数据包都是先拷贝到内核再到 userspace,把 OVS 的数据通路也设置在 kernel space,可以避免再拷贝到 userspace 这一步,这样会更快;
  • OVS + DPDK,数据通路在 user space,因为 DPDK 本身就是一个用户态的硬件,这样也更快;
  • OVS offload 到 CX 做 vRDMA,数据通路在 user space,因为更快。

参考文献:

OVS vs. Linux Bridge

都是虚拟交换机,OVS 更高级。

OVS 数据通路 Datapath

OVS 数据通路也在内核中实现。

OVS 在网卡直通场景

在 Underlay 网络,网卡是直接和云服务厂商的交换机相连的,如果我们把网卡直接直通给了 VM,那么客户就有了访问云服务厂商内部网络的能力,这是非常危险的(排除 HPC 需要 RDMA Underlay 网络的场景),因此需要一个虚拟机交换机,让 VM 的直通网卡连到这个虚拟交换机上,而不是物理交换机上。

那么如何让 VM 的直通网卡接再虚拟交换机呢?只有虚拟网卡才能接虚拟交换机,物理网卡没有办法接虚拟交换机吧,这个理论上是无法实现的吧。

是的,一般来说,VPC 网卡都是虚拟网卡,然后接 OVS,都是软件模拟出来的,这种情况 OVS 接的就是 DPDK。

当然也有特例:OVS 也可以 offload 到物理硬件上比如 CX 网卡上做 vRDMA,依赖于 Switchdev^ 模式,把 OVS 数据路径 offload 到了网卡上,同时网卡以 VF 的形式透传给 VM。相当于把网卡功能和交换机功能都 offload 了,真是万物皆可 offload。

OVS 在虚拟化网卡场景

一个简单的抽象的图:

下面这个图介绍了实现的架构图,非常直观。不难发现:

  • vHost kernel 部分接 TAP 而不是直接接 eth0 的原因是可以再走一遍 OVS,从而实现自定义的路由功能;
  • OVS 作为一个交换机,连接的两端网卡分别是 Host 为 Guest 模拟出来的设备的代理设备,也就是 TAP 设备(其背后其实就是给 guest 所提供的 VirtIO 设备),另一端的网卡就是真实的硬件设备,这样我们才能添加一些自定义的路由功能(应该主要是加 VLAN 的一些标记吧)。
  • 这种情况处理都在 kernel space,转发也是基于的 OVS 的 kernel space module,因此其实不需要用到 DPDK。

https://k48xz7gzkw.feishu.cn/docx/QcsXdAc3PoF6VHxhHM5cPeuHnhe#share-DzjIdXk47owsUmxwJ00czTuInoh

vhost-user + OVS + DPDK 场景:

使用 OVS 搭建一个 VM 之间的虚拟网络

一些安装的步骤会省略,只列出关键步骤。

# Create a bridge
ovs-vsctl add-br br0
# Add port to bridge
ovs-vsctl add-port br0 eth0

VLAN / VXLAN / VPC / MACVLAN

现在一个物理交换机的一个端口虽然还是连接一个物理主机,但是可能进而连接几十个甚至上百个虚拟机和相应数量的 MAC 地址。传统交换机是根据 MAC 地址表实现二层转发。如下图所示,交换机在收到一个数据帧之后,根据 VLAN 和目的 MAC 地址,查找到相应的交换机端口,再将数据帧从相应的端口发出。

同一个 VLAN 内的主机共享同一个广播域,它们之间可以直接进行二层通信;VLAN 间的主机属于不同的广播域,不能直接实现二层互通。

VXLAN: Virtual eXtensible Local Area Network.

VLAN 直接在 VM 发出来的 Ethernet 帧的头部加上 4 个字节的 VLAN Tag,用来标识不同的二层网络。VLAN 已经在大部分的网络设备和操作系统中得到了支持,它处理起来也比较简单,在读取 Ethernet 数据的时候,只需要根据 EtherType 相应的偏移 4 个字节就行。

VXLAN 协议将 VM 发出来的 Ethernet 帧再次封装在 UDP 内,再加上 8 个字节的 VXLAN header,用来标识不同的二层网络。

VPC 是一种比 VLAN 更好的技术。

VXLAN vs VLAN - 知乎

交换机是如何根据 VLAN 和 MAC 转发的?

用户直通网卡之间的 VPC 必须要基于 OVS 来实现吗?