网络带宽


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

本页面概述了网络带宽限制,这些限制对于规划部署非常有用。它使用两个维度对带宽进行分类:

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

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

影响网络带宽的配置

如需获得尽可能高的入站流量和出站流量带宽,请为计算实例配置每个虚拟机的 Tier_1 网络性能

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

Dynamic Network Interface(预览版)使用其父 vNIC 的带宽。父 vNIC 内没有流量隔离。来自 Dynamic NIC 的网络流量可能会导致与同一父级 vNIC 关联的其他 Dynamic NIC 无带宽可用。为了避免这种冲突,您可以使用 Linux 流量控制 (TC) 来制定特定于应用的流量调整政策。这些政策有助于实现公平性或某些类型的优先级。如需进行优先级排序,您可以将流量(例如 Dynamic NIC 的流量)映射到流量类别,然后将该流量类别映射到服务质量。如需查看此方法的示例,请参阅使用 Red Hat 调整流量

运行 Windows 操作系统的 Compute Engine 实例不支持 Dynamic NIC。

带宽摘要

下表展示了基于数据包是从计算实例发送(出站流量)还是由计算实例接收(入站流量)这两种情况的最大可能带宽以及数据包路由方法。

出站流量带宽限制

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

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

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

入站流量带宽限制

在 VPC
网络中路由
  • 通常,入站流量速率类似于机器类型的出站流量速率。
  • 如需获得尽可能高的入站流量带宽,请启用 Tier_1 网络
  • 计算实例的大小、服务器 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 网络
C4C4AC4D 100 Gbps 200 Gbps
C3C3D 100 Gbps 200 Gbps
C2C2D 32 Gbps 100 Gbps
E2 16 Gbps 不适用
E2 共享核心 2 Gbps 不适用
H3 200 Gbps 不适用
M4 100 Gbps 200 Gbps
M3 32 Gbps 100 Gbps
M2 在 Intel Cascade Lake 或更高版本的 CPU 上为 32 Gbps
在其他 CPU 平台上为 16 Gbps
不适用
M1 32 Gbps 不适用
N4 50 Gbps 不适用
N2N2D 32 Gbps 100 Gbps
N1(不包括配备 1 个 vCPU 的虚拟机) 在 Intel Skylake 及更高版本的 CPU 上为 32 Gbps
在更早的 CPU 平台上为 16 Gbps
不适用
配备 1 个 vCPU 的 N1 机器类型 2 Gbps 不适用
N1 共享核心(f1-micro 和 g1-small) 1 Gbps 不适用
T2AT2D 32 Gbps 不适用
X4 100 Gbps 不适用
Z3 100 Gbps 200 Gbps

如需了解加速器优化机器系列的网络带宽信息,请参阅网络和 GPU 机器

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

  • 在支持 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 会根据发送方实例的区域和项目以及内部目标位置或下一个跃点的区域施加配额。如需详细了解此配额,请参阅 VPC 配额和限制文档中的来自计算实例的区域间网络出站流量带宽 (Mbps)
  • 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 子网地址范围
    • 分配给双栈或仅 IPv6(预览版)接收方实例 vNIC 的 /96 IPv6 地址范围内的 IPv6 地址。
    • 内部转发规则(用于协议转发或内部直通式网络负载均衡器)的 /96 IPv6 地址范围内的 IPv6 地址。
  • 使用 VPC 网络中的子网路由或对等互连子网路由,或者通过 VPC 网络中不使用默认互联网网关的下一个跃点的自定义路由来路由数据包时,这些目标资源使用的外部 IPv6 子网地址范围
    • 分配给双栈或仅 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 地址使用)的双栈或仅 IPv6 子网(预览版)中的区域级外部 IPv6 地址。子网必须位于单独的非对等互连 VPC 网络中。必须可以使用位于发送方实例的 VPC 网络中并且其下一个跃点是默认互联网网关的路由访问目标 IPv6 地址范围。如果具有外部 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 地址范围。
  • 分配给双栈或仅 IPv6(预览版)接收方实例 NIC 的 /96 IPv6 地址范围内的 IPv6 地址。计算实例 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 地址。
  • 为双栈或仅 IPv6(预览版)接收方实例的 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 驱动程序版本,请参阅在不支持的操作系统上使用

巨型帧和 GPU 机器

对于 GPU 机器类型,请使用建议的巨型帧 MTU 设置。如需了解详情,请参阅建议的巨型帧 MTU 设置

接收和传输队列

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

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

默认队列分配

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

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

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

  • 对于具有 2 个 vCPU 的 Linux 实例,队列数量为 1。
  • 对于具有 4 个 vCPU 的 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 分配的队列数量的队列。

使用 Dynamic Network Interface 时的队列数量

如果您将 Dynamic Network Interface 与网络接口搭配使用,队列数量不会发生变化。Dynamic NIC 没有自己的接收和传输队列;它使用与父 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 的数量。

  • 如果您的 N2 虚拟机有 96 个 vCPU 和 2 个 vNIC,则在使用 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。不过,您可以改为按照将工作负载迁移到新的计算实例中的说明将虚拟机迁移到第三代或更高版本的机器类型。

后续步骤