网络带宽


Google Cloud 会考虑每个计算实例的带宽,而不是考虑每个虚拟网络接口 (vNIC) 或 IP 地址的带宽。实例的机器类型定义了其最大可能的出站流量速率;但是,您只能在特定情况下达到此最大可能的出站流量速率。

本页面概述了对于计划部署非常有用的预期方向。它使用两个维度对带宽进行分类:

  • 出站流量或入站流量:此页面上使用的出站流量和入站流量始终从 Google Cloud 实例角度来看:
    • 从 Google Cloud 实例发送的数据包构成其出站流量。
    • 发送到 Google Cloud 实例的数据包构成其入站流量
  • 数据包的路由方式:可以使用下一个跃点位于 VPC 网络中的路由或 VPC 网络外部的路由从发送方实例路由数据包或将数据包路由到接收方实例

更多虚拟网络接口 (vNIC) 和每个 vNIC 更多 IP 地址都不会增加计算实例的入站流量或出站流量带宽。例如,具有 22 个 vCPU 的 C3 虚拟机的总出站流量带宽上限为 23 Gbps。如果您配置具有两个 vNIC 的 C3 虚拟机,则该虚拟机的总出站流量带宽仍然限制为 23 Gbps,而不是每个 vNIC 的带宽为 23 Gbps。

本页面上的所有信息均适用于 Compute Engine 计算实例以及依赖 Compute Engine 计算实例的产品。例如,Google Kubernetes Engine 节点是 Compute Engine 实例。

带宽摘要

下表展示了根据数据包是从计算实例发送(出站)还是由计算实例接收(入站)这两种情况的带宽预期和数据包路由方法。

出站

带宽预期
在 VPC 网络中路由
  • 主要由每个实例的最大出站流量带宽定义,具体取决于发送方实例的机器类型以及是否启用了 Tier_1 网络。

    • 使用 Tier_1 网络的 N2、N2D、C2、C2D 和 C4A 虚拟机支持最高 100 Gbps 的出站流量带宽限制。
    • H3 虚拟机支持最高 200 Gbps 的虚拟机间出站流量带宽限制。
    • X4、A2 和 G2 实例支持高达 100 Gbps 的出站流量带宽限制。
    • A3 实例支持高达 1,800 Gbps 的出站流量带宽限制。
    • 使用 Tier_1 网络时,C4、C3、C3D 和 Z3 实例的出站流量带宽限制可提高到 200 Gbps。
  • 对于其他因素、定义和场景,请参阅流向 VPC 网络中可路由的目标位置的出站流量
在 VPC 网络外部路由
  • 主要由每个实例的最大出站流量带宽定义,具体取决于发送方实例的机器类型以及是否启用了 Tier_1 网络。除 H3 虚拟机外,发送方实例到其 VPC 网络之外的目标位置的出站流量上限不能超过以下值:

    • 未启用 Tier_1 网络时,总计 7 Gbps
    • 启用 Tier_1 网络时,总计 25 Gbps
    • 每个流 3 Gbps
  • 如需了解其他因素、定义和注意事项,请参阅流向 VPC 网络外部的目标位置的出站流量

入站流量

带宽预期
在 VPC 网络中路由
  • 通常,入站流量速率类似于机器类型的出站流量速率。
  • 计算实例的大小、服务器 NIC 的容量、传入在同一宿主机硬件上运行的其他客户机的流量、客户机操作系统网络配置,以及实例读取磁盘的次数等都会影响入站流量速率。
  • Google Cloud 不会对 VPC 网络内的入站流量速率施加任何其他限制。
  • 对于其他因素、定义和场景,请参阅流向 VPC 网络中可路由的目标位置的入站流量
在 VPC 网络外部路由
  • Google Cloud 通过限制在 VPC 网络外部路由的入站流量来保护每个计算实例。 该限制是以下速率中先达到的那一个:

    • 180 万 pps(每秒数据包数)
    • 30 Gbps
  • 对于支持多个物理 NIC 的机器系列(例如 A3),该限制是以下速率中先达到的那一个:

    • 每个物理 NIC 1,800,000 pps(每秒数据包数)
    • 每个物理 NIC 30 Gbps
  • 对于其他因素、定义和场景,请参阅流向 VPC 网络外部的目标位置的入站流量

出站带宽

Google Cloud 使用每个实例的最大出站流量速率来限制出站(出站流量)带宽。这些速率取决于发送数据包的计算实例的机器类型,以及是使用 VPC 网络内的路由还是 VPC 网络外的路由来访问数据包的目标位置。出站带宽包括实例的所有 NIC 发出的数据包以及传输到与实例连接的所有 Hyperdisk 和 Persistent Disk 卷的数据。

每个实例的最大出站流量带宽

每个实例的最大出站流量带宽通常为 2 Gbps,但存在一些差异和例外情况,具体取决于机器系列。下表仅显示标准网络层级 VPC 网络中路由的流量的出站带宽上限范围,而不是每个虚拟机的 Tier_1 网络性能

机器系列 标准版的每个实例的最大出站流量下限 标准版的每个实例的最大出站流量上限
C4 和 C4A 10 Gbps 100 Gbps
C3 23 Gbps 100 Gbps
C3D 20 Gbps 100 Gbps
C2 和 C2D 10 Gbps 32 Gbps
E2 1 Gbps 16 Gbps
H3 不适用 200 Gbps
M3 和 M1 32 Gbps 32 Gbps
M2 32 Gbps 在 Intel Cascade Lake CPU 平台上为 32 Gbps
在其他 CPU 平台上为 16 Gbps
N4 10 Gbps 50 Gbps
N2 和 N2D 10 Gbps 32 Gbps
N1(不包括配备 1 个 vCPU 的虚拟机) 10 Gbps 在 Intel Skylake 平台上为 32 Gbps
在早于 Intel Skylake 的 CPU 平台上为 16 Gbps
配备 1 个 vCPU、f1-micro 和 g1-small 的 N1 机器类型 2 Gbps 2 Gbps
T2D 10 Gbps 32 Gbps
X4 不适用 100 Gbps
Z3 23 Gbps 100 Gbps

您可以在特定机器系列页面上找到每种器机类型对应的每个实例的最大出站流量带宽:

不保证能达到每个实例的最大出站流量带宽。根据如下所列因素(不详尽),实际的出站流量带宽可能降低:

  • 在支持 VirtIO 和 gVNIC 的计算实例中使用 VirtIO 而非 gVNIC
  • 数据包大小
  • 协议开销
  • 流数量
  • 计算实例客机操作系统的以太网驱动程序设置,例如校验和分流与 TCP 细分分流 (TSO)
  • 网络拥塞度
  • 在永久性磁盘 I/O 与其他网络出站流量竞争的情况下,网络带宽上限的 60% 将分配给永久性磁盘写入,剩余 40% 将分配给其他网络出站流量。如需了解详情,请参阅影响磁盘性能的因素

如需获得尽可能高的每个实例的最大出站流量带宽,请执行以下操作:

  • 使用更大的机器类型来启用每个虚拟机的 Tier_1 网络性能
  • 使用网络拓扑支持的最大 VPC 网络最大传输单元 (MTU)。较大的 MTU 可以减少数据包标头开销并增加载荷数据吞吐量。
  • 使用最新的 gVNIC 驱动程序版本。
  • 使用第三代或更高版本的机器系列,这些机器系列使用 Titanium 将网络处理分流到主机 CPU。

流向 VPC 网络中可路由的目标位置的出站流量

从发送方实例的角度来看,对于可通过 VPC 网络中的路由访问的目标 IP 地址,Google Cloud 会使用以下规则限制出站流量

  • 每个虚拟机的最大出站流量带宽:每个实例的最大出站流量带宽部分中所述的每个实例的最大出站流量带宽。
  • 每个项目的区域间出站流量带宽:如果发送方实例和内部目标位置或其下一个跃点位于不同的区域,则 Google Cloud 会施加区域间出站流量带宽上限。大多数客户不太可能达到此限制。如果您对此限制有疑问,请提交支持请求
  • Cloud VPN 和 Cloud Interconnect 限制:将实例的流量发送到可通过下一个跃点 Cloud VPN 隧道或 Cloud Interconnect VLAN 连接路由的内部 IP 地址目标位置时,出站流量带宽受到以下因素的限制:

VPC 网络中可路由的目标位置包含以下所有目标位置,从发送方实例的角度来看,每个目标位置都可以通过其下一个跃点并非默认互联网网关的路由来进行访问

  • 子网的主要 IPv4 和子网的次要 IPv4 地址范围中的区域级内部 IPv4 地址,包括以下目标资源使用的专用 IPv4 地址范围和以非公开方式使用的公共 IPv4 地址范围:
    • 接收方实例网络接口 (vNIC) 的主要内部 IPv4 地址。(当发送方实例连接到另一个实例的 vNIC 外部 IPv4 地址时,数据包使用下一个跃点默认互联网网关进行路由,因此流向 VPC 网络外部的目标位置的出站流量适用。)
    • 接收方实例 vNIC 的别名 IP 范围内的内部 IPv4 地址。
    • 内部转发规则(用于协议转发或内部直通式网络负载均衡器)的内部 IPv4 地址。
  • 以下目标资源的全球内部 IPv4 地址:
  • 以下目标资源使用的内部 IPv6 子网地址范围
    • 分配给双栈接收方实例 vNIC 的 /96 IPv6 地址范围内的 IPv6 地址。
    • 内部转发规则(用于协议转发或内部直通式网络负载均衡器)的 /96 IPv6 地址范围内的 IPv6 地址。
  • 使用 VPC 网络中的子网路由或对等互连子网路由,或者通过 VPC 网络中不使用默认互联网网关的下一个跃点的自定义路由来路由数据包时,这些目标资源使用的外部 IPv6 子网地址范围
    • 分配给双栈接收方实例 vNIC 的 /96 IPv6 地址范围内的 IPv6 地址。
    • 外部转发规则(用于协议转发或外部直通式网络负载均衡器)的 /96 IPv6 地址范围内的 IPv6 地址。
  • 可通过以下 VPC 网络路由访问的其他目标位置:

以下列表对从发送方实例传入内部目标位置的流量进行了排名(按可能的带宽从高到低的顺序):

流向 VPC 网络外部的目标位置的出站流量

从发送方实例的角度来看,对于 VPC 网络外部的目标 IP 地址,Google Cloud 会将出站流量限制为下列其中一种速率(以先达到者为准)

  • 每个实例的出站流量带宽:对于从计算实例到 VPC 网络外部的目标位置的所有连接,其最大带宽为每个实例的最大出站流量带宽的较小值和以下速率之一:

    • 25 Gbps(如果已启用 Tier_1 网络)
    • 7 Gbps(如果未启用 Tier_1 网络)
    • 1 Gbps(针对 H3 实例)
    • 对于支持多个物理 NIC 的机器系列(例如 A3),每个物理 NIC 7 Gbps。

    例如,即使 c3-standard-44 实例的每个虚拟机的最大出站流量带宽为 32 Gbps,从 c3-standard-44 虚拟机到外部目标位置的每个虚拟机的出站流量带宽也为 25 Gbps 或 7 Gbps,具体取决于是否启用了 Tier_1 网络。

  • 每个流的最大出站流量速率:对于每个唯一 5 元组连接,从计算实例到 VPC 网络外部的目标位置的最大带宽为 3 Gbps,但 H3 除外,其最大带宽为 1 Gbps。

  • 每个项目的互联网出站流量带宽:对于从项目的每个区域中的计算实例到 VPC 网络外部的目标位置的所有连接,其最大带宽由项目的互联网出站流量带宽配额来决定

VPC 网络外部的目标位置包括以下所有目标位置,每个目标位置都可以通过其下一个跃点为默认互联网网关的发送方实例 VPC 网络中的路由来进行访问

  • 外部代理网络负载均衡器和外部应用负载均衡器的全球外部 IPv4 和 IPv6 地址
  • Google Cloud 资源的区域级外部 IPv4 地址,包括虚拟机 vNIC 外部 IPv4 地址,以及外部 IPv4 地址(用于外部协议转发、外部直通式网络负载均衡器以及将响应数据包发送到 Cloud NAT 网关)。
  • 具有外部 IPv6 地址范围(由双栈实例外部 IPv6 地址、外部协议转发和外部直通式网络负载均衡器使用)的双栈子网中的区域级外部 IPv6 地址。子网必须位于单独的非对等 VPC 网络中。必须能够使用发送方实例 VPC 网络中下一个跃点为默认互联网网关的路由访问目标 IPv6 地址范围。如果具有外部 IPv6 地址范围的双栈子网位于同一 VPC 网络或对等互连 VPC 网络中,请参阅流向 VPC 网络中可路由的目标位置的出站流量
  • 在发送方实例的 VPC 网络中可通过静态路由访问的其他外部目标位置,前提是该路由的下一个跃点是默认互联网网关

如需详细了解哪些 Google Cloud 资源使用哪些类型的外部 IP 地址,请参阅外部 IP 地址

入站流量带宽

Google Cloud 会根据传入数据包路由到接收方计算实例的方式处理入站(入站流量)带宽。

流向 VPC 网络中可路由的目标位置的入站流量

接收方实例可以在其机器类型、操作系统和其他网络条件允许的情况下处理任意数量的传入数据包。如果传入数据包是使用 VPC 网络内部的路由传送的,则 Google Cloud 不会对传送到实例的传入数据包施加任何有意的带宽限制

  • 接收方实例的 VPC 网络中的子网路由
  • 对等互连 VPC 网络中的对等互连子网路由
  • 满足下述条件的另一个网络中的路由:下一个跃点是 Cloud VPN 隧道、Cloud Interconnect (VLAN) 连接,或者路由器设备实例(其位于接收方实例的 VPC 网络中)

对于在 VPC 网络中路由的数据包,其目标位置包括:

  • 接收方实例网络接口 (NIC) 的主要内部 IPv4 地址。主要内部 IPv4 地址是子网的主要 IPv4 地址范围中的区域级内部 IPv4 地址。
  • 接收方实例 NIC 的别名 IP 范围中的内部 IPv4 地址。别名 IP 范围可以来自子网的主要 IPv4 地址范围或其中一个次要 IPv4 地址范围。
  • 分配给双栈接收方实例 NIC 的 /96 IPv6 地址范围内的 IPv6 地址。Compute 实例 IPv6 范围可以来自以下子网 IPv6 范围:
  • 接收方实例的内部协议转发或后端为接收方实例的内部直通式网络负载均衡器使用的转发规则的内部 IPv4 地址。内部转发规则 IPv4 地址来自子网的主要 IPv4 地址范围。
  • 接收方实例的内部协议转发或后端为接收方实例的内部直通式网络负载均衡器所用转发规则的 /96 IPv6 范围内的内部 IPv6 地址。内部转发规则 IPv6 地址来自子网的内部 IPv6 地址范围。
  • 接收方实例或外部直通式网络负载均衡器的外部协议转发所用的转发规则的 /96 IPv6 范围内的外部 IPv6 地址。如果使用本部分前面列出的某个路由在 VPC 网络内将传入数据包路由到接收方实例,则接收方实例是负载均衡器的后端。外部转发规则 IPv6 地址来自子网的外部 IPv6 地址范围。
  • 将接收方实例用作下一个跃点实例(next-hop-instancenext-hop-address)的自定义静态路由的目标范围内的 IP 地址。
  • 使用内部直通式网络负载均衡器 (next-hop-ilb) 的下一个跃点的自定义静态路由目标范围内的 IP 地址(如果接收方实例是该负载均衡器的后端)。

流向 VPC 网络外部的目标位置的入站流量

Google Cloud 对使用 VPC 网络外部的路由传送到接收方实例的传入数据包施加以下带宽限制。涉及负载均衡时,带宽限制会单独应用于每个接收方实例。

对于不支持多个物理 NIC 的机器系列,适用的入站带宽限制共同应用于所有虚拟网络接口 (vNIC)。该限制是以下速率中先达到的那一个:

  • 每秒 180 万个数据包
  • 30 Gbps

对于支持多个物理 NIC 的机器系列(例如 A3),适用的入站带宽限制会单独应用于每个物理 NIC。该限制是以下速率中先达到的那一个:

  • 每个物理 NIC 每秒 180 万个数据包
  • 每个物理 NIC 30 Gbps

对于使用 VPC 网络外部的路由进行路由的数据包,其目标位置包括:

  • 在接收方实例的某个网络接口 (NIC) 上通过一对一 NAT 访问配置分配的外部 IPv4 地址。
  • 为双栈接收方实例的 vNIC 分配的 /96 IPv6 地址范围内的外部 IPv6 地址(如果使用接收方实例的 VPC 网络外部的路由来路由传入数据包)
  • 接收方实例的外部协议转发或后端为接收方实例的外部直通式网络负载均衡器使用的转发规则的外部 IPv4 地址。
  • 接收方实例的外部协议转发或外部直通式网络负载均衡器所用转发规则的 /96 IPv6 范围内的外部 IPv6 地址。如果使用 VPC 网络外部的路由来路由传入数据包,则接收实例必须是负载均衡器的后端。
  • 由 Cloud NAT 处理的已建立入站响应。

巨型帧

如需接收和发送巨型帧,请配置计算实例使用的 VPC 网络;将最大传输单元 (MTU) 设置为更大的值,最高可达 8896。

较高的 MTU 值会增加数据包大小并降低数据包标头开销,从而增加载荷数据吞吐量。

您可以在虚拟机实例上将巨型帧与 gVNIC 驱动程序 1.3 版或更高版本搭配使用,也可以在裸机实例上将巨型帧与 IDPF 驱动程序搭配使用。并非所有 Google Cloud 公共映像都包含这些驱动程序。如需详细了解操作系统对巨型帧的支持,请参阅操作系统详细信息页面上的网络功能标签页。

如果您使用的操作系统映像不完全支持巨型帧,则可以手动安装 gVNIC 驱动程序 v1.3.0 或更高版本。Google 建议您安装具有 Latest 标记的 gVNIC 驱动程序版本,以便从更多功能和 bug 修复中获益。您可以从 GitHub 下载 gVNIC 驱动程序。

如需在客户机操作系统中手动更新 gVNIC 驱动程序版本,请参阅在不支持的操作系统上使用

接收和传输队列

系统会为计算实例的每个 NIC 或 vNIC 分配一定数量的接收和传输队列,以处理来自网络的数据包。

  • 接收队列 (RX):接收数据包的队列。当 NIC 从网络收到数据包时,NIC 会从队列中选择传入数据包的描述符,对其进行处理,并通过中断从关联到 vCPU 核心的数据包队列将数据包移交给客户机操作系统。如果 RX 队列已满,且没有可用于放置数据包的缓冲区,则系统会丢弃该数据包。 如果应用过度使用也关联到所选数据包队列的 vCPU 核心,通常会发生这种情况。
  • 传输 (TX) 队列:传输数据包的队列。当客户机操作系统发送数据包时,系统会分配一个描述符并将其放入 TX 队列。然后,NIC 会处理该描述符并传输数据包。

默认队列分配

除非您明确为 NIC 分配队列数量,否则您可以按照以下方式设计一个算法,供 Google Cloud 用于为每个 NIC 分配固定数量的 RX 和 TX 队列:

裸金属实例
对于裸机实例,只有一个 NIC,因此队列数上限为 16。
使用 gVNIC 网络接口的虚拟机实例

对于 C4 实例,为了提高性能,以下配置使用固定数量的队列:

  • 对于 vCPU 数量为 2 的 Linux 实例,队列数为 1。
  • 对于 vCPU 数量为 4 的 Linux 实例,队列数为 2。

对于其他机器系列,队列数量取决于机器系列是否使用 Titanium

  • 对于使用 Titanium 的第三代(不包括 M3)及更新型实例:

    将 vCPU 数量除以 vNIC 数量 (num_vcpus/num_vnics),并舍弃任何余数。

  • 对于不使用 Titanium 的第一代和第二代虚拟机:

    将 vCPU 数量除以 vNIC 数量,然后将结果除以 2 (num_vcpus/num_vnics/2)。舍弃任何余数。

如需完成默认队列计数计算,请执行以下操作:

  1. 如果计算结果小于 1,请改为为每个 vNIC 分配一个队列。

  2. 确定计算结果是否大于每个 vNIC 的队列数上限(即 16)。如果计算结果大于 16,忽略计算结果,并为每个 vNIC 分配 16 个队列。

使用 VirtIO 网络接口或自定义驱动程序的虚拟机实例

将 vCPU 数量除以 vNIC 的数量,并舍弃任何余数 - [number of vCPUs/number of vNICs]

  1. 如果计算结果小于 1,请改为为每个 vNIC 分配一个队列。

  2. 确定计算结果是否大于每个 vNIC 的队列数上限(即 32)。如果计算结果大于 32,忽略计算结果,并为每个 vNIC 分配 32 个队列。

示例

以下示例展示了如何计算虚拟机实例的默认队列数量:

  • 如果虚拟机实例使用 VirtIO 且具有 16 个 vCPU 和 4 个 vNIC,则计算结果为 [16/4] = 4。Google Cloud 会为每个 vNIC 分配四个队列。

  • 如果虚拟机实例使用 gVNIC 并且有 128 个 vCPU 和 2 个 vNIC,则计算得出的数量为 [128/2/2] = 32。Google Cloud 会为每个 vNIC 分配相应的每个 vNIC 的最大队列数。Google Cloud 会为每个 vNIC 分配 16 个队列。

在 Linux 系统上,您可以使用 ethtool 为 vNIC 配置少于 Google Cloud 为每个 vNIC 分配的队列数的队列。

为虚拟机实例分配自定义队列

您也可以不使用默认队列分配,而是在使用 Compute Engine API 创建新计算实例时为每个 vNIC 分配自定义队列数(RX 和 TX 的总和)。

您指定的自定义队列数量必须符合以下规则:

  • 您可以为每个 vNIC 分配的队列数下限为 1。

  • 您可以为虚拟机实例的每个 vNIC 分配的队列数上限是 vCPU 数量的下限,或每个 vNIC 的队列数上限(具体取决于驱动程序类型):

    • 如果使用 virtIO 或自定义驱动程序,队列数上限为 32
    • 如果使用 gVNIC,队列数上限为 16,但以下情况除外,在这些情况下,队列数上限为 32:
      • A2 或 G2 实例
      • TPU 实例
      • 启用了 Tier_1 网络的 C2、C2D、N2 或 N2D 实例
    • 对于以下机密虚拟机配置,最大队列数量为 8

      • C2D 和 N2D 机器类型上的 AMD SEV
      • N2D 机器类型上的 AMD SEV-SNP
  • 如果您为计算实例的所有 NIC 分配自定义队列数,则队列数分配的总和必须小于或等于分配给实例的 vCPU 数量。

您可以为 vNIC 超额订阅自定义队列数。换句话说,分配给虚拟机实例的所有 NIC 的队列数之和可以大于实例的 vCPU 数量。如需超额订阅自定义队列数,虚拟机实例必须满足以下条件:

  • 使用 gVNIC 作为实例配置的所有 NIC 的 vNIC 类型。
  • 使用支持 Tier_1 网络的机器类型。
  • 已启用 Tier_1 网络。
  • 为实例配置的所有 NIC 指定了自定义队列数。

如果使用队列超额订阅,虚拟机实例的队列数上限为 NIC 数量的 16 倍。因此,如果您为具有 30 个 vCPU 的实例配置了 6 个 NIC,则最多可为该实例配置 96 个自定义队列(即 16 * 6)。

示例

  • 如果一个虚拟机实例有 8 个 vCPU 和 3 个 vNIC,则实例的队列数上限是 vCPU 的数量,即 8 个。您可以为 nic0 分配 1 个队列,为 nic1 分配 4 个队列,为 nic2 分配 3 个队列。在此示例中,您不能在保持其他两个 vNIC 队列分配不变的情况下为 nic2 分配 4 个队列,因为已分配队列的总数不能超过 vCPU 的数量。

  • 如果您有 96 个 vCPU 和 2 个 vNIC 的 N2 虚拟机,则在使用 virtIO 驱动程序时,最多可为每个 vNIC 分配 32 个队列;使用 gVNIC 驱动程序时,最多可为每个 vNIC 分配 16 个队列。如果您为 N2 虚拟机启用 Tier_1 网络,则可以为每个 vNIC 分配最多 32 个队列。在此示例中,已分配队列的总数始终小于或等于 vCPU 的数量。

您也可以仅为部分 NIC 分配自定义队列数量,并让 Google Cloud 为剩余的 NIC 分配队列。每个 vNIC 可以分配的队列数仍受之前提到的规则的约束。您可以设计配置的可行性以及 Google Cloud 按照此过程为剩余的 vNIC 分配的队列数(如果配置可行):

  1. 计算使用自定义队列分配的 vNIC 的队列总和。例如,对于具有 20 个 vCPU 和 6 个 vNIC 的示例虚拟机,假设您为 nic0 分配了 5 个队列、为 nic1 分配了 6 个队列、为 nic2 分配了 4 个队列,并让 Google Cloud 为 nic3nic4nic5 分配队列。在此示例中,自定义分配队列的总数为 5+6+4 = 15

  2. 从 vCPU 的数量中减去自定义分配队列总数。如果差值小于 Google Cloud 必须为其分配队列的剩余 vNIC 的数量,则 Google Cloud 会返回错误,因为每个 vNIC 都必须至少有一个队列。

    继续以具有 20 个 vCPU 的示例虚拟机和 15 个自定义分配队列为例,Google Cloud 还可以为剩余的 vNIC(nic3nic4nic5)分配 20-15 = 5 个队列。

  3. 将上一步中的结果除以剩余 vNIC 的数量并舍弃余数 - ⌊(number of vCPUs - sum of assigned queues)/(number of remaining vNICs)⌋。由于上一步中说明的限制条件,此计算始终会生成至少等于 1 的整数(而不是分数)。Google Cloud 为每个剩余 vNIC 分配一个与计算出的数量匹配的队列数,只要该数量不超过每个 vNIC 的队列数上限即可。每个 vNIC 的队列数上限取决于驱动程序类型:

  • 使用 virtIO 或自定义驱动程序时,如果计算出的每个剩余 vNIC 的队列数大于 32,则 Google Cloud 会为每个剩余 vNIC 分配 32 个队列。
  • 使用 gVNIC 时,如果计算出的每个剩余 vNIC 的队列数大于 1632 的上限(具体取决于虚拟机配置),则 Google Cloud 会为每个剩余 vNIC 分配 16 个队列。

配置自定义队列数

如需创建为一个或多个 NIC 或 vNIC 使用自定义队列数的计算实例,请完成以下步骤。

在以下代码示例中,创建虚拟机时,网络接口类型设置为 GVNIC,并启用了每个虚拟机的 Tier_1 网络性能。您可以使用以下代码示例指定适用于受支持的机器类型的队列数量上限和队列超额订阅。

gcloud

  1. 如果您还没有所需的 VPC 网络(您计划配置的每个 vNIC 接口将连接到其中的一个子网),请先创建这些网络。
  2. 使用 gcloud compute instances create 命令创建计算实例。针对您要为实例配置的每个 vNIC 重复使用 --network-interface 标志,并添加 queue-count 选项。
    gcloud compute instances create INSTANCE_NAME \
        --zone=ZONE \
        --machine-type=MACHINE_TYPE \
        --network-performance-configs=total-egress-bandwidth-tier=TIER_1  \
        --network-interface=network=NETWORK_NAME_1,subnet=SUBNET_1,nic-type=GVNIC,queue-count=QUEUE_SIZE_1 \
        --network-interface=network=NETWORK_NAME_2,subnet=SUBNET_2,nic-type=GVNIC,queue-count=QUEUE_SIZE_2

替换以下内容:

  • INSTANCE_NAME:新计算实例的名称
  • ZONE:要在其中创建实例的可用区
  • MACHINE_TYPE:实例的机器类型。如需超额订阅队列数量,您指定的机器类型必须支持 gVNIC 和 Tier_1 网络。
  • NETWORK_NAME:之前创建的网络的名称
  • SUBNET_*:之前创建的其中一个子网的名称
  • QUEUE_SIZE:vNIC 的队列数,需遵循自定义队列分配中讨论的规则。

Terraform

  1. 如果您还没有所需的 VPC 网络(您计划配置的每个 vNIC 接口将连接到其中的一个子网),请先创建这些网络。
  2. 使用 google_compute_instance 资源创建 vNIC 具有特定队列数的计算实例。 针对您要为计算实例配置的每个 vNIC 重复使用 --network-interface 参数,并添加 queue-count 参数。

    # Queue oversubscription instance
    resource "google_compute_instance" "VM_NAME" {
    project      = "PROJECT_ID"
    boot_disk {
      auto_delete = true
      device_name = "DEVICE_NAME"
      initialize_params {
         image="IMAGE_NAME"
         size = DISK_SIZE
         type = "DISK_TYPE"
      }
    }
    machine_type = "MACHINE_TYPE"
    name         = "VM_NAME"
    zone = "ZONE"
    
    network_performance_config {
        total_egress_bandwidth_tier = "TIER_1"
    }
    
    network_interface {
        nic_type = "GVNIC"
        queue_count = QUEUE_COUNT_1
        subnetwork_project = "PROJECT_ID"
        subnetwork = "SUBNET_1"
     }
    
    network_interface {
        nic_type = "GVNIC"
        queue_count = QUEUE_COUNT_2
        subnetwork_project = "PROJECT_ID"
        subnetwork = "SUBNET_2"
    }
    
    network_interface {
        nic_type = "GVNIC"
        queue_count = QUEUE_COUNT_3
        subnetwork_project = "PROJECT_ID"
        subnetwork = "SUBNET_3""
    }
    
    network_interface {
        nic_type = "GVNIC"
        queue_count = QUEUE_COUNT_4
        subnetwork_project = "PROJECT_ID"
        subnetwork = "SUBNET_4""
    }
    
    }
    
    

替换以下内容:

  • VM_NAME:新计算实例的名称
  • PROJECT_ID:要在其中创建实例的项目的 ID。除非您使用共享 VPC 网络,否则您指定的项目必须是创建了所有子网和网络的同一项目。
  • DEVICE_NAME:要与客户机操作系统中的启动磁盘关联的名称
  • IMAGE_NAME:映像的名称,例如 "projects/debian-cloud/global/images/debian-11-bullseye-v20231010"
  • DISK_SIZE:启动磁盘大小,以 GiB 为单位
  • DISK_TYPE:要用于启动磁盘的磁盘类型,例如 pd-standard
  • MACHINE_TYPE:实例的机器类型。如需超额订阅队列数量,您指定的机器类型必须支持 gVNIC 和 Tier_1 网络。
  • ZONE:要在其中创建实例的可用区
  • QUEUE_COUNT:vNIC 的队列数,需遵循自定义队列分配中讨论的规则。
  • SUBNET_*:网络接口所连接的子网的名称

REST

  1. 如果您还没有所需的 VPC 网络(您计划配置的每个 vNIC 接口将连接到其中的一个子网),请先创建这些网络。
  2. 使用 instances.insert 方法创建 NIC 具有特定队列数的计算实例。重复使用 networkInterfaces 属性以配置多个网络接口。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    {
    "name": "VM_NAME",
    "machineType": "machineTypes/MACHINE_TYPE",
    "networkPerformanceConfig": {
        "totalEgressBandwidthTier": TIER_1
    },
    "networkInterfaces": [
        {
          "nicType": gVNIC,
          "subnetwork":"regions/region/subnetworks/SUBNET_1",
          "queueCount": "QUEUE_COUNT_1"
        } ],
    "networkInterfaces": [
        {
          "nicType": gVNIC,
          "subnetwork":"regions/region/subnetworks/SUBNET_2",
          "queueCount": "QUEUE_COUNT_2"
        } ],
    }
    

    替换以下内容:

    • PROJECT_ID:要在其中创建计算实例的项目的 ID
    • ZONE:要在其中创建计算实例的可用区
    • VM_NAME:新计算实例的名称
    • MACHINE_TYPE:新计算实例的预定义自定义机器类型。如需超额订阅队列数,机器类型必须支持 gVNIC 和 Tier_1 网络。
    • SUBNET_*:网络接口所连接的子网的名称
    • QUEUE_COUNT:vNIC 的队列数,需遵循自定义队列分配中讨论的规则。

队列分配和更改机器类型

计算实例是使用默认队列分配创建的,您也可以在使用 Compute Engine API 创建新计算实例时为每个虚拟网络接口卡 (vNIC) 分配自定义队列计数。默认或自定义 vNIC 队列分配仅在创建计算实例时设置。如果实例具有使用默认队列计数的 vNIC,您可以更改其机器类型。如果要更改为的机器类型具有不同数量的 vCPU,系统会根据新机器类型重新计算实例的默认队列计数。

如果虚拟机具有使用非默认的自定义队列计数的 vNIC,您可以使用 Google Cloud CLI 或 Compute Engine API 来更新实例属性。如果生成的虚拟机支持每个 vNIC 的队列计数与原始实例相同,则转换会成功。对于使用 VirtIO-Net 接口并且每个 vNIC 的自定义队列计数超过 16 的虚拟机,您无法将机器类型更改为第三代或更高版本的机器类型,因为这些机器类型仅使用 gVNIC。不过,您可以改为按照将工作负载迁移到新的计算实例中的说明将虚拟机迁移到第三代或更高级别的机器类型。

后续步骤