DGX-2 KVM 网络

简介

NVIDIA DGX-2 系统通过 NVIDIA 基于内核的虚拟机解决方案(基于 Linux 内核虚拟机 (https://www.linux-kvm.org))支持 GPU 多租户。这允许不同的用户在单个 DGX-2 系统中使用多个虚拟机(guest GPU VM)同时运行深度学习作业。

本章介绍了 NVIDIA® DGX-2™ 服务器上运行的基于 KVM 的 guest GPU VM 的标准和最常用的网络配置。 本文档中描述的所有网络配置均基于 Netplan - Ubuntu 18.04 系统(例如 DGX-2 服务器)的首选网络配置方法。

网络配置选项

两种常见的网络配置是“虚拟网络”和“共享物理设备”。前者在所有 Linux 发行版中都是相同的,并且开箱即用。后者需要特定于发行版的手动配置。

适用于任何部署的网络配置类型取决于以下因素

  • guest VM 是否需要可由 DGX-2 KVM 主机外部的用户访问
  • guest VM 托管的网络服务类型
  • 可用的公共 IPv4 和 IPv6 地址的数量
  • guest VM 需要哪种安全级别
  • guest VM 的吞吐量和延迟要求

本文档的其余部分详细描述了以下网络配置。

  • 虚拟网络
  • 桥接网络
  • SR-IOV

缩略语

  • KVM - 基于 Linux 内核的虚拟机
  • NAT - 网络地址转换
  • DHCP - 动态主机配置协议
  • SR-IOV - 单根 I/O 虚拟化
  • QOS - 服务质量
  • MTU - 最大传输单元

虚拟网络

Libvirt 虚拟网络使用虚拟网络交换机的概念,也称为用户模式网络。虚拟网络交换机是在物理服务器主机上运行的软件构造,guest VM 连接到该主机。默认情况下,它以 NAT 模式运行。guest VM 的网络流量通过此交换机定向,因此,当与外部世界通信时,所有 guest VM 都将使用连接的物理网卡接口的主机 IP 地址。

默认配置

Linux 主机物理服务器将虚拟网络交换机表示为网络接口。当首次安装并启动 libvirtd 守护程序 (libvirtd) 时,表示虚拟网络交换机的默认网络接口是 virbr0。

默认情况下,libvirt 会为每个需要它的虚拟网络交换机自动配置并启动 dnsmasq 服务器的实例。它负责运行 DHCP 服务器(以决定将哪个 IP 地址租用到每个 VM)和 DNS 服务器(以响应来自 VM 的查询)。

在默认的虚拟网络交换机配置中,guest 操作系统将获得 192.168.122.0/24 地址空间中的 IP 地址,并且主机操作系统将在 192.168.122.1 可达。您应该能够从 guest 操作系统内部 SSH 连接到主机操作系统(在 192.168.122.1),并使用 SCP 来回复制文件。

在默认配置中,guest 操作系统将有权访问网络服务,但自身对网络上的其他机器不可见。例如,guest VM 将能够浏览网页,但将无法托管可访问的 Web 服务器。

您可以按照本节后面部分描述的步骤创建其他虚拟网络,但必须使用不同的 DHCP IP 地址范围。例如,192.168.123.0/24。

                                                                 

以下是在 NAT 模式下使用虚拟网络配置的限制。

  • Guest VM 不通过唯一的地址与外部网络通信。
  • Guest VM 通过连接的物理网卡接口的主机 IP 地址与外部网络通信。

在 NAT 模式下使用时,您可能会遇到某些限制(例如连接超时),因为每个主机/IP 地址的活动连接数,尤其是在所有 guest VM 同时与同一服务器通信时。这也取决于在服务器端强制执行的功能和限制。

net/http: request canceled while waiting for connection(Client.Timeout exceeded while awaiting headers)

如果默认配置适合您的目的,则不需要其他配置。

可以使用一些高级虚拟网络配置来获得更好的网络性能。有关更多详细信息,请参阅 提升网络性能

验证主机配置

每个标准的 libvirt 安装都为虚拟机提供了开箱即用的基于 NAT 的连接。这被称为“默认虚拟网络”。使用 virsh net-list --all 命令验证它是否可用。

$ virsh net-list --all
Name                 State      Autostart
-----------------------------------------
default              active     yes

如果默认网络丢失,则可以重新加载和激活以下示例 XML 配置文件。

$ virsh net-dumpxml default
<network>
  <name>default</name>
  <uuid>92d49672-3020-40a1-90f5-73fe07216122</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:40:cc:23'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

在上面的 XML 内容中,“default”是虚拟网络的名称,“virbr0”是虚拟网络交换机的名称。

$ virsh net-define /etc/libvirt/qemu/networks/default.xml
The default network is defined from /etc/libvirt/qemu/networks/default.xml

标记默认网络以自动启动

$ virsh net-autostart default
Network default marked as autostarted

启动默认网络

$ virsh net-start defaultNetwork default started

一旦 libvirt 默认虚拟网络运行,您将看到一个虚拟网络交换机设备。此设备没有任何物理接口添加,因为它使用 NAT 和 IP 转发来连接到外部世界。此虚拟网络交换机将仅使用主机正在使用的任何物理网卡接口。不要添加新接口。

$ brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.000000000000       yes

一旦主机配置完成,guest 就可以根据其名称或桥接器连接到虚拟网络。要使用虚拟桥接器名称“virbr0”连接 guest VM,可以在 guest VM 的 virsh 配置中使用以下 XML

<interface type='bridge'>
  <source bridge='virbr0'/>
  <model type='virtio'/>
</interface>

使用静态 IP

您可以从虚拟网络交换机的默认 DHCP 范围 (192.168.122.2 - 192.168.122.254) 中为特定的 guest VM 预留和分配静态 IP 地址。此外,您应该从 DHCP 范围中排除这些预留/分配的静态 IP 地址。

从主机进行的配置

要使用静态 IP 地址,请检查 guest VM 的 Mac 地址。

$ virsh edit 1gpu-vm-1g0
<domain type='kvm' id='3'>
  <name>1gpu-vm-1g0</name>
  <uuid>c40f6b9d-ea15-45b0-ac42-83801eef73d4</uuid>
  ……..
   <interface type='bridge'>
    <mac address='52:54:00:e1:28:3e'/>
    <source bridge='virbr0'/>
    <model type='virtio'/>
    <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
  </interface>
  ….
</domain>
$ virsh net-edit default
<network>
  <name>default</name>
  <uuid>92d49672-3020-40a1-90f5-73fe07216122</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:40:cc:23'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.100' end='192.168.122.254'/>
      <host mac='52:54:00:e1:28:3e' ip='192.168.122.45'/>
    </dhcp>
  </ip>
</network>
$ virsh net-destroy default
$ virsh net-start default

在使用 guest Mac 地址更新“default”虚拟网络后,启动/重启 guest VM。

$ virsh net-dhcp-leases default
Expiry Time         MAC address        Protocol  IP address        Hostname Client ID or DUID
------------------------------------------------------------------------------------------------
2018-08-29 13:18:58 52:54:00:e1:28:3e  ipv4      192.168.122.45/24 1gpu-vm-1g0

将虚拟网络绑定到特定物理网卡

KVM 将使用虚拟网络交换机作为所有 guest VM 的默认网络配置,并且它将在 NAT 模式下运行。guest 的网络流量通过此交换机定向,因此,当与外部世界通信时,所有 guest 都将使用主机物理网卡接口之一。 默认情况下,它未绑定到任何特定的物理网卡接口,但您可以限制虚拟网络交换机仅使用特定的物理网卡接口;例如,您可以限制虚拟网络仅使用 enp6s0。

$ virsh net-edit default
<network>
  <name>default</name>
  <uuid>92d49672-3020-40a1-90f5-73fe07216122</uuid>
  <forward dev='enp6s0'  mode='nat' />
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:40:cc:23'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>
$ virsh net-destroy default
$ virsh net-start default

在使用“default”虚拟网络配置更新后,启动/重启 guest。

桥接网络

简介

桥接网络与 KVM guest VM 共享真实的以太网设备。当使用桥接模式时,所有 guest 虚拟机都显示在与主机物理机器相同的子网中。同一物理网络上的所有其他物理机器都知道并可以访问虚拟机。桥接在 OSI 网络模型的第 2 层上运行。

每个 guest VM 都可以直接绑定到 LAN 上的任何可用 IPv4 或 IPv6 地址,就像物理服务器一样。在所有 libvirt 网络类型中,桥接提供最佳性能和最少的复杂性。只有当有足够的 IP 地址为每个 guest VM 分配一个时,桥接才是可能的。这对于 IPv6 不是问题,因为托管提供商通常提供许多免费的 IPv6 地址。但是,额外的 IPv4 地址很少是免费的。

使用 DHCP

来自主机的配置

$ sudo vi /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    enp134s0f0:
      dhcp4: yes
  bridges:
    br0:
      dhcp4: yes
      interfaces: [ enp134s0f0 ]
注意: 使用系统上连接的主机网卡接口(例如:enp134s0f0)。
$ sudo netplan apply

Guest VM 配置

一旦主机配置完成,guest 就可以根据其名称连接到桥接网络。要将 guest 连接到“br0”网络,可以为 guest 使用以下 XML

$ virsh edit <VM name or ID> 
<interface type='bridge'>
  <source bridge=br0/>
  <model type='virtio'/></interface>

有关如何确定 guest VM IP 地址的说明,请参阅 获取 Guest VM IP 地址

使用静态 IP

主机配置

$ sudo vi /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    enp134s0f0:
      dhcp4: no
  bridges:
    br0:
      dhcp4: no
      addresses: [ 10.33.14.17/24 ]
      gateway4: 10.33.14.1
      nameservers:
          search: [ nvidia.com ]
          addresses: [ 172.16.200.26, 172.17.188.26 ]
      interfaces: [ enp134s0f0 ]
注意: 使用您已连接到网络的主机网卡接口(例如:enp134s0f0)。请咨询您的网络管理员以获取 guest VM 的实际 IP 地址。
$ sudo netplan apply

Guest VM 配置

一旦主机配置完成,guest VM 就可以根据其名称连接到桥接网络。要将 guest VM 连接到“br0”网络,可以为 guest VM 使用以下 XML

$ virsh edit <VM name or ID> 
<interface type='bridge'>
  <source bridge=br0/>
  <model type='virtio'/>
</interface>

有关如何确定 guest VM IP 地址的说明,请参阅 获取 Guest VM IP 地址

带绑定的桥接网络

简介

网络绑定是指将一台主机上的多个物理网络接口组合起来,以实现冗余和/或提高吞吐量。冗余是关键因素:我们希望保护我们的虚拟化环境免受因单个物理链路故障而导致的服务丢失。此网络绑定与 Linux 网络绑定相同。绑定被添加到桥接器,然后 guest 虚拟机被添加到桥接器上,类似于 桥接网络 中讨论的桥接模式。但是,绑定驱动程序有多种操作模式,只有少数几种模式适用于正在使用虚拟机 guest 的桥接器。

网络绑定有三种主要模式

  • 主动-被动:有一个网卡处于活动状态,而另一个网卡处于休眠状态。如果活动网卡出现故障,则另一个网卡变为活动状态。
  • 链路聚合:聚合的网卡充当一个网卡,从而实现更高的吞吐量。
  • 负载均衡:网络流量在机器的网卡上均匀平衡。

以下部分解释了基于 IEEE 802.3 链路聚合的绑定配置。此模式也称为动态链路聚合模式,它创建具有相同速度的聚合组。它需要支持 IEEE 802.3ad 动态链路聚合的交换机。

使用 DHCP

来自主机的配置

$ sudo vi /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    bond-ports:
      dhcp4: no
      match:
        name: enp134*
  bonds:
    bond0:
      dhcp4: no
      interfaces: [ bond-ports ]
      parameters:
        mode: 802.3ad
  bridges:
    br0:
      dhcp4: yes
      interfaces: [ bond0 ]
 
注意: 根据系统上连接的内容,使用主机网卡接口(例如:enp134*)。
$ sudo netplan apply

Guest VM 配置

一旦主机配置完成,guest 就可以根据其名称连接到桥接网络。要将 guest 连接到“br0”网络,可以为 guest 使用以下 XML

$ virsh edit <VM name or ID> 
<interface type='bridge'>
  <source bridge=br0/>
  <model type='virtio'/>
</interface>

有关如何确定 guest VM IP 地址的说明,请参阅 获取 Guest VM IP 地址

使用静态 IP

主机配置

$ sudo vi /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    bond-ports:
      dhcp4: no
      match:
        name: enp134*
  bonds:
    bond0:
      dhcp4: no
      interfaces: [ bond-ports ]
      parameters:
        mode: 802.3ad
  bridges:
    br0:
     addresses: [ 10.33.14.17/24 ]
      gateway4: 10.33.14.1
      nameservers:
          search: [ nvidia.com ]
          addresses: [ 172.16.200.26, 172.17.188.26 ]
      interfaces: [ bond0 ]
注意: 根据系统上连接的内容,使用主机网卡接口(例如:enp134*)。
$ sudo netplan apply

Guest VM 配置

一旦主机配置完成,guest 就可以根据其名称连接到桥接网络。要将 guest 连接到“br0”网络,可以为 guest 使用以下 XML

$ virsh edit <VM name or ID> 
<interface type='bridge'>
  <source bridge=br0/>
  <model type='virtio'/>
</interface>

有关如何确定 guest VM IP 地址的说明,请参阅 获取 Guest VM IP 地址

MacVTap

简介

作为默认 NAT 连接的替代方案,您可以使用 macvtap 驱动程序将 guest 的网卡直接连接到主机机器的指定物理接口。Macvtap 是一种 Linux 设备驱动程序,基于 Macvlan 和网络终端访问点 (TAP)(如下所述)的组合,允许创建虚拟(类似 tap 的)接口。每个虚拟网络接口都分配有自己的 MAC 和 IP 地址,然后连接到物理接口(也称为下层接口),

  • Macvlan - Linux 内核驱动程序,使创建可以连接到物理网络适配器(又名下层接口)的虚拟网络接口成为可能。

  • TAP - 一种纯软件接口,允许用户空间程序通过 TAP 设备文件 (/dev/tapN) 进行读取和写入。

使用桥接器和使用 macvtap 之间的主要区别在于,macvtap 直接连接到 KVM 主机中的网络接口。这种直接连接有效地缩短了代码路径,绕过了 KVM 主机中与连接和使用软件桥接器相关的许多代码和组件。这种更短的代码路径通常可以提高吞吐量并减少到外部系统的延迟。

Macvtap 模式

有四种操作模式控制端点如何相互通信 - VEPA、桥接、私有和直通。

VEPA

虚拟以太网端口聚合器 (VEPA) 通常是默认模式。数据从一个端点向下流经 KVM 主机中的源设备,然后流向外部交换机。如果交换机支持 hairpin 模式,则数据将发送回 KVM 主机中的源设备,然后从那里发送到目标端点。

桥接

在桥接模式下,所有端点都直接相互连接。都处于桥接模式的两个端点可以直接交换帧,而无需通过外部桥接器的往返行程。对于具有经典交换机的设置以及当访客间通信对性能至关重要时,这是最有用的模式。

私有

所有数据包都发送到外部交换机,并且仅当通过外部路由器或网关发送数据包时,才将数据包传递到同一主机上的目标 guest。然后,数据包将发送回主机。私有模式可用于防止单个主机上的各个 guest 相互通信。

直通

此功能将物理接口设备或 SR-IOV 虚拟功能 (VF) 直接连接到 guest,而不会丢失迁移功能。所有数据包都直接发送到指定的网络设备。请注意,单个网络设备只能直通到单个 guest,因为网络设备不能在直通模式下的 guest 之间共享。

如果没有支持 hairpin 模式的交换机,则配置为使用 VEPA 模式的 KVM guest 将与桥接模式的工作方式相同,并且将无法使用 KVM 主机接口直接与 KVM 主机通信。如果 KVM 主机具有使用不同以太网网段(子网)的多个接口,则可以克服此限制。

MacVTap 模式 VM<->VM VM<->外部 VM<->主机<->VM 注释
Vepa 是/否 是/否 仅当外部交换机支持 hairpin 模式时才是
桥接

推荐配置。

在此配置中,主机无法与 VM 连接。

私有 没有 hairpin 模式的外部交换机
直通 是? SR-IOV 和非 SR-IOV 网卡

如何更改 Macvtap 和物理网卡配置

默认情况下,KVM guest 中的 DGX 系统配置为使用“桥接”模式下的 macvtap 网络。使用以下命令更改物理网卡和 macvtap 模式。

  1. 编辑 macvtap-net
    $ virsh net-edit macvtap-net<network>
     <name>macvtap-net</name>
     <uuid>8b403750-2ad5-49df-8a7b-26b10053429d</uuid>
     <forward dev='<device-interface>' mode='<macvtap-mode>'
     <interface dev='<device-interface>'/>
     </forward>
    </network>

    其中

    <device-interface> 是网络端口的名称,例如 enp1s0f0。

    <macvtap-mode> 是您要设置的模式。

    • bridge = 桥接模式
    • private = 私有模式
    • vepa = VEPA 模式
    • passthrough = 直通模式
  2. 使用以下命令重启 macvtap-net。
    $ virsh net-destroy macvtap-net
    $ virsh net-start macvtap-net 

如何使用 privateIP 配置 Guest VM

如果 macvtap 配置为“桥接”模式,但您需要主机到 VM 的网络连接,则可以按如下方式为 VM 配置 privateIP 网络。

  • 在创建新的 guest VM 时配置 privateIP

    在创建 VM 时指定 --privateIP,以便将基于 private-net 网络的第二个虚拟网络接口添加到主机到 VM 的连接。

  • 为现有 guest VM 配置 privateIP
    1. 编辑 VM (virsh edit <vm-name>) 并将以下行添加到 <devices> 部分
      <interface type='network'>
        <source network='private-net'/>
        <model type='virtio'/>
      </interface>
    2. 关闭并重启 VM。
      $ virsh shutdown <vm-name> 
      $ virsh start <vm-name> 

SR-IOV

简介

SR-IOV 技术是一种基于硬件的虚拟化解决方案,可提高性能和可扩展性。SR-IOV 标准支持在虚拟机之间高效共享 PCIe(外围组件互连)Express 设备,并在硬件中实现,以实现与本机性能相当的 I/O 性能。SR-IOV 规范定义了一个新标准,其中创建的新设备将使虚拟机能够直接连接到 I/O 设备。

SR-IOV 规范由 PCI-SIG 在 http://www.pcisig.com 定义和维护。

单个 I/O 资源可以由多个虚拟机共享。共享设备将提供专用资源,并且还利用共享的公共资源。通过这种方式,每个虚拟机都将有权访问唯一资源。因此,SR-IOV 启用的 PCIe 设备(例如,以太网端口)在具有适当的硬件和操作系统支持的情况下,可以显示为多个独立的物理设备,每个设备都有自己的配置空间。

下图说明了 PCIe 硬件的 SR-IOV 技术。

SR-IOV 中的两种新功能类型是

物理功能 (PF)

一种 PCI 功能,它支持 SR-IOV 规范中定义的 SR-IOV 功能。PF 包含 SR-IOV 功能结构,用于管理 SR-IOV 功能。PF 是全功能的 PCIe 功能,可以像任何其他 PCIe 设备一样进行发现、管理和操作。PF 具有完整的配置资源,可用于配置或控制 PCIe 设备。

虚拟功能 (VF)

虚拟功能是与物理功能关联的功能。VF 是一种轻量级 PCIe 功能,它与物理功能以及与同一 PF 关联的其他 VF 共享一个或多个物理资源。VF 仅允许具有用于自身行为的配置资源。

SR-IOV 设备可以具有数百个与物理功能 (PF) 关联的虚拟功能 (VF)。VF 的创建可以通过旨在开启 SR-IOV 功能的寄存器由 PF 动态控制。默认情况下,SR-IOV 功能已关闭,PF 的行为类似于传统的 PCIe 设备。

以下是 SR-IOV 的优点和缺点。

  • 优点
    • 性能 – 从虚拟机环境直接访问硬件,优点包括:
      • 更低的 CPU 利用率

      • 更低的网络延迟

      • 更高的网络吞吐量

    • 成本降低 - 资本和运营支出节省包括:
      • 节省电力

      • 减少适配器数量

      • 减少布线

      • 更少的交换机端口

  • 缺点
    • Guest VM 迁移 - 更难将 guest 从一台物理服务器迁移到另一台物理服务器

      行业中正在使用或实施多种提案,每种提案都有其自身的优点/缺点。

设备配置

SR-IOV 和 VF 在所有设备中默认情况下未启用。例如,DGX-2 中的双端口 100GbE Mellanox 卡默认情况下未启用 VF。按照 Mellanox SR-IOV 网卡配置 指南的第 5 节中的说明启用固件中的 SR-IOV 和所需的功能数量。

通用配置

使用以下步骤在 KVM 主机中启用 SR-IOV,因为它将定义与物理网卡关联的虚拟功能 (VF) 设备池,并自动将 VF 设备从池分配给 VF BDF 的每个 guest。
来自主机的配置
  1. 为 VF 池定义网络。
  2. 读取支持的 VF 数量。
    $ cat /sys/class/net/enp134s0f0/device/sriov_totalvfs63
  3. 启用所需的 VF 数量(例如:16)。
    $ sudo echo 16 > /sys/class/net/enp134s0f0/device/sriov_numvfs
  4. 创建新的 SR-IOV 网络。 生成一个 XML 文件,其中包含类似于以下示例的文本。
    $ sudo vi /etc/libvirt/qemu/networks/iovnet0.xml
    <network>
         <name>iovnet0</name>
         <forward mode='hostdev' managed='yes'>
            <pf dev='enp134s0f0'/>
         </forward>
     </network>
    注意: 注意:将 pf dev 的值更改为与您的 SR-IOV 设备的物理功能相对应的 ethdev(例如:enp134s0f0)。
  5. 执行以下命令
    $ virsh net-define /etc/libvirt/qemu/networks/iovnet0.xml
    $ virsh net-autostart iovnet0
    $ virsh net-start iovnet0

    Guest VM 配置

    在定义和启动 SR-IOV (iovnet0) 网络后,修改 guest XML 定义以指定网络。

    $ virsh edit <VM name or ID>
    <interface type='network'>    <source network='iovnet0'/> </interface>

    当 guest VM 启动时,会自动为 guest VM 分配一个 VF。 如果 guest VM 已经在运行,则需要重启它。

Guest VM 配置

在定义和启动 SR-IOV (iovnet0) 网络后,修改 guest XML 定义以指定网络。

$ virsh edit <VM name or ID>
<interface type='network'>
    <source network='iovnet0'/>
</interface>

当 guest VM 启动时,会自动为 guest VM 分配一个 VF。 如果 guest VM 已经在运行,则需要重启它。

使用 DHCP

来自主机的配置

$ sudo vi /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    enp134s0f0:
      dhcp4: yes
注意: 根据系统上连接的内容,使用主机网卡接口(例如:enp134s0f0)。
$ sudo netplan apply

Guest VM 配置

$ sudo vi /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    enp8s0:
      dhcp4: yes
注意: 通过检查 “ifconfig -a” 输出,使用 guest VM 网卡接口(例如:enp8s0)。
$ sudo netplan apply

有关如何确定 guest VM IP 地址的说明,请参阅 获取 Guest VM IP 地址

使用静态 IP

来自主机的配置

$ sudo vi /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    enp134s0f0:
      dhcp4: no
      addresses: [ 10.33.14.17/24 ]
      gateway4: 10.33.14.1
      nameservers:
          search: [ nvidia.com ]
          addresses: [ 172.16.200.26, 172.17.188.26 ]
注意: 根据系统上连接的内容,使用主机网卡接口(例如:enp134s0f0)。
$ sudo netplan apply

Guest VM 配置

$ sudo vi /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    enp8s0:
      dhcp4: no
      addresses: [ 10.33.14.18/24 ]
      gateway4: 10.33.14.1
      nameservers:
          search: [ nvidia.com ]
          addresses: [ 172.16.200.26, 172.17.188.26 ]
注意: 通过检查 “ifconfig -a” 输出,使用 guest VM 网卡接口(例如:enp8s0)。
$ sudo netplan apply

有关如何确定 guest VM IP 地址的说明,请参阅 获取 Guest VM IP 地址

获取 Guest VM IP 地址

如果您使用的是桥接和 SR-IOV 网络配置,请使用以下步骤从主机确定 guest VM IP 地址。

安装和配置 QEMU Guest Agent 以检索 guest VM IP 地址。QEMU guest agent 在 guest VM 内部运行,并允许主机使用 libvirt 向 guest VM 操作系统发出命令。然后,guest VM 操作系统异步响应这些命令。

注意: 注意:仅当由受信任的 guest 运行时,才可以安全地依赖 guest agent。不受信任的 guest 可能会恶意忽略或滥用 guest agent 协议,并且尽管存在内置的安全措施来防止对主机的拒绝服务攻击,但主机需要 guest 协作才能使操作按预期运行。

来自主机的配置

使用以下命令将以下行添加到 <devices> 下的 guest VM XML 文件中

$ virsh edit <VM name or ID> 
    <channel type='unix'>
        <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>

Guest VM 配置

$ sudo apt-get install qemu-guest-agent
$ virsh shutdown <VM name or ID>
$ virsh start <VM name or ID>

完成这些步骤后,在主机中运行以下命令以检查特定的 guest VM IP 地址。

$ virsh domifaddr <VM name or ID> --source agent
Name       MAC address          Protocol     Address
-----------------------------------------------------------------------
 lo         00:00:00:00:00:00    ipv4        127.0.0.1/8
 -          -                    ipv6        ::1/128
 enp1s0     52:54:00:b2:d9:a7    ipv4        10.33.14.18/24
 -          -                    ipv6        fe80::5054:ff:feb2:d9a7/64
 docker0    02:42:3e:48:87:61    ipv4        172.17.0.1/16

提升网络性能

本节介绍了一些提高网络性能的方法。

巨型帧

巨型帧是以太网帧,其有效负载大于 1,500 字节的标准最大传输单元 (MTU)。 巨型帧用于支持至少 1 Gbps 的局域网,并且可以高达 9,000 字节。启用巨型帧可以通过提高数据传输效率来提高网络性能。交换机和路由器上的 CPU 一次只能处理一个帧。通过在每个帧中放入更大的有效负载,CPU 需要处理的帧更少。仅当网络路径中的每个链路(包括服务器和端点)都配置为在相同的 MTU 下启用巨型帧时,才应启用巨型帧。否则,性能可能会降低,因为不兼容的设备会丢弃帧或对其进行分片;后者可能会增加 CPU 的处理要求。

在 libvirt 管理的网络(转发模式为 NAT、路由的网络)的情况下,这将是 libvirt 创建桥接设备 (virbr0) 时分配给它的 MTU,然后也分配给所有为连接 guest 接口而创建的 tap 设备。如果未指定 MTU,则假定为所用设备类型的默认设置,通常设置为 1500 字节。

我们可以使用以下命令为默认虚拟网络交换机启用巨型帧配置。所有 guest 虚拟网络接口都将继承巨型帧或 9000 字节的 MTU 配置。

$ virsh net-edit default
<network>
  <name>default</name>
  <uuid>a47b420d-608e-499a-96e4-e75fc45e60c4</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mtu size='9000'/>
  <mac address='52:54:00:f2:e3:2a'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
     <range start='192.168.122.2' end='192.168.122.254'/>
     </dhcp>
  </ip>
</network>
$ virsh net-destroy default
$ virsh net-start default

多队列支持

本节介绍多队列,并且对于 dgx-kvm-image-4-0-3 之前的 KVM 软件包,提供了启用多队列的说明。从 dgx-kvm-image-4-0-3 开始,默认情况下启用多队列。

KVM 虚拟机 (VM) 在使用基于虚拟网络交换机的网络接口时(无论是在 NAT 模式还是桥接模式下),将使用 virtio-net 驱动程序。默认情况下,此 virtio-net 驱动程序将使用一对 TX 和 RX 队列,这可能会限制虚拟机网络的性能,即使虚拟机可能配置为使用多个 vCPU 并且其网络接口绑定到 10/100G 主机物理网卡。virtio-net 驱动程序中的多队列支持将

  • 使数据包发送/接收处理能够随着虚拟机中可用虚拟 CPU 的数量而扩展
  • 允许每个虚拟机 vCPU 拥有自己独立的 TX 和 RX 队列以及中断,这些队列和中断可以在不影响其他虚拟 CPU 的情况下使用。
  • 在许多情况下提供更好的应用程序可扩展性和改进的网络性能。

当以下情况发生时,多队列 virtio-net 提供最大的性能优势:

  • 流量数据包相对较大。
  • 虚拟机同时处于多个连接的活动状态,流量在虚拟机之间、虚拟机与主机之间或虚拟机与外部系统之间运行。
  • 队列的数量等于 vCPU 的数量。这是因为多队列支持优化了 RX 中断亲和性和 TX 队列选择,以便使特定队列专用于特定 vCPU。

注意: 多队列 virtio-net 非常适用于入站流量,但偶尔会降低出站流量的性能。启用多队列 virtio-net 会增加总吞吐量,并同时增加 CPU 消耗。

要使用多队列 virtio-net,请在虚拟机中启用支持,方法是将以下内容添加到虚拟机 XML 配置中(其中 N 的值从 1 到 256,因为内核最多支持 256 个多队列 tap 设备的队列)。为了获得最佳效果,请使队列数量与虚拟机上配置的 vCPU 核心数量相匹配。

注意: 对于 KVM 镜像 dgx-kvm-image-4-0-3 或更高版本,则不需要这样做。

 

$ virsh edit <VM name or ID>
<interface type='bridge'>
       <source bridge='virbr0'/>
       <model type='virtio'/>
       <driver name='vhost' queues='N'/
</interface>

当运行具有 N 个 virtio-net 队列的虚拟机时,您可以使用以下命令检查已启用的队列数量:

$ ethtool -L <interface> 
$ /sys/class/net/<interface>/queues

您可以更改已启用的队列数量(其中 M 的值从 1 到 N):

$ ethtool -L <interface> combined M
注意: 当使用多队列时,建议将 /etc/libvirt/qemu.conf 文件中的 max_files 变量更改为 2048。默认限制 1024 对于多队列来说可能不足,并可能导致在配置多队列时虚拟机无法启动。

在当前版本的 KVM SW 中,DGX-2 虚拟机默认启用此功能。

QOS

默认情况下,虚拟网络交换机将平等对待来自所有虚拟机的网络流量,并按照接收数据包的顺序处理它们。虚拟机网络服务质量 (QoS) 是一项功能,允许限制单个虚拟网络接口控制器或虚拟机的入站和出站流量。

虚拟机网络服务质量设置允许您在三个不同的级别配置入站和出站流量的带宽限制。

  • 平均:入站或出站流量的平均速度。  指定要进行整形处理的接口所需的平均比特率(单位为千字节/秒)。
  • 峰值:峰值时段的入站或出站流量速度。 可选属性,指定网桥可以发送数据的最大速率(单位为千字节/秒)。 请注意实现的限制:出站元素中的此属性将被忽略(因为 Linux 入口过滤器尚不了解它)。
  • 突发:突发期间的入站或出站流量速度。 这是一个可选属性,指定可以在单次突发中以峰值速度传输的千字节数。

libvirt 域规范已经包含此功能。 您可以为入站和出站流量指定单独的设置。  当您打开虚拟机的 XML 文件时,找到带有 interface type 标签的块。 尝试添加以下内容。

$ virsh edit <VM name or ID>
<bandwidth>
  <inbound average='NNN' peak='NNN' burst='NNN'/>
  <outbound average='NNN' peak='NNN' burst='NNN'/>
</bandwidth>

其中 NNN 是所需的 KBS 速度,入站/出站可以不同,并且平均/峰值/突发也可以具有不同的值。

在当前版本的 KVM SW 中,DGX-2 虚拟机默认未启用此功能。