自定义可见 CPU 核心数


自定义可见 CPU 核心的数量可以精细控制许可费用,同时保持网络和永久性磁盘的性能。此自定义设置可减少虚拟机 (VM) 实例可用的 vCPU 数量。它不会更改机器类型或价格。

Compute Engine 将每个虚拟 CPU (vCPU) 实现为在物理 CPU 核心上运行的单个硬件多线程。如需减少虚拟机可用的 vCPU 数量,可以通过 Compute Engine 自定义可见 CPU 核心的数量。

可见核心是虚拟机使用的基础硬件中的 CPU 核心。默认情况下,虚拟机可见的 CPU 核心数为机器类型中的 vCPU 数量除以每个核心的线程数:

  • 可见 CPU 核心 = 机器类型中的 vCPU / 每个核心的线程数

例如,c2-standard-60 机器类型指定了 60 个 vCPU。假设每个核心默认为 2 个线程,则可见 CPU 核心的数量为 30。如果将可见核心数从 30 个减少到 20 个,则正常运行的 vCPU 的数量会从 60 个减少到 40 个。

如果同时满足以下两个条件,请考虑自定义可见 CPU 核心的数量:

在自定义虚拟机可用的 vCPU 数量之前,请先考虑使用自定义机器类型

所需的角色

如需获得自定义可见 CPU 核心数所需的权限,请让您的管理员为您授予项目的 Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

此预定义角色可提供自定义可见 CPU 核心数所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

自定义可见 CPU 核心数需要以下权限:

  • 在创建虚拟机期间自定义可见 CPU 核心数:
    • 针对项目的 compute.instances.create 权限
    • 使用自定义映像创建虚拟机:针对映像的 compute.images.useReadOnly 权限
    • 使用快照创建虚拟机:针对快照的 compute.snapshots.useReadOnly 权限
    • 使用实例模板创建虚拟机:针对实例模板的 compute.instanceTemplates.useReadOnly 权限
    • 为虚拟机分配旧版网络:针对项目的 compute.networks.use 权限
    • 为虚拟机指定静态 IP 地址:针对项目的 compute.addresses.use 权限
    • 使用旧版网络时为虚拟机分配外部 IP 地址:针对项目的 compute.networks.useExternalIp 权限
    • 为虚拟机指定子网:针对项目或所选子网的 compute.subnetworks.use 权限
    • 在使用 VPC 网络时为虚拟机分配外部 IP 地址:针对项目或所选子网的 compute.subnetworks.useExternalIp 权限
    • 为虚拟机设置虚拟机实例元数据:针对项目的 compute.instances.setMetadata 权限
    • 为虚拟机设置标记:针对虚拟机的 compute.instances.setTags 权限
    • 为虚拟机设置标签:针对虚拟机的 compute.instances.setLabels 权限
    • 为虚拟机设置要使用的服务账号:针对虚拟机的 compute.instances.setServiceAccount 权限
    • 为虚拟机创建新磁盘:针对项目的 compute.disks.create 权限
    • 以只读或读写模式挂接现有磁盘:针对磁盘的 compute.disks.use 权限
    • 以只读模式挂接现有磁盘:针对磁盘的 compute.disks.useReadOnly 权限
  • 使用实例模板自定义一组虚拟机上的可见 CPU 核心数:您需要拥有在创建虚拟机期间使用的所有权限以及针对项目的 compute.instanceTemplates.create 权限

您也可以使用自定义角色或其他预定义角色来获取这些权限。

vCPU 数量和每个核心的线程数

机器类型上的 vCPU 总数等于可见 CPU 核心数量乘以每个核心的线程数。对于大多数机器系列而言,每个核心的线程数为 2,但您可以手动设置每个核心的线程数为 1。

下表使用 c2-standard-60 机器类型作为示例,展示了可见的 CPU 核心数、每个核心的线程数以及可用的 vCPU 总数。

机器类型 可见的 CPU 核心数 每个核心的线程数 可用 vCPU 数量
c2-standard-60 30(默认) 2(默认) 60
c2-standard-60 30(默认) 1 30
c2-standard-60 20 2(默认) 40
c2-standard-60 20 1 20

性能考虑因素

减少可见核心数可能会影响虚拟机的性能。

永久性磁盘

  • 永久性磁盘的性能限制取决于机器类型,不受可见 CPU 核心数量的影响。如需了解详情,请参阅块存储性能

网络出站流量

  • 网络出站流量的带宽限制与机器类型匹配,不受可见 CPU 核心数量的影响。不过,网络性能会因虚拟机可访问的 vCPU 数量而异。例如,具有一个可见 CPU 核心的 n2-standard-16 机器类型可能无法充分利用 32 Gbps 的连接。

价格

减少可见核心数可能会影响虚拟机的费用。

操作系统许可费用

  • 您可以通过减少可见 CPU 核心的数量来降低某些操作系统的许可费用。适用的操作系统是针对虚拟机可用的每个 vCPU 向您收费的操作系统,例如 Windows Server 和 SQL Server。如需详细了解这些操作系统在 Compute Engine 上的许可选项,请参阅 Microsoft 许可

虚拟机费用、配额和容量

  • 当您自定义可见 CPU 核心数时,虚拟机费用、配额和容量保持不变,因为 Compute Engine 会收取配额费用、跟踪配额并在虚拟机的机器类型上分配空间,如同虚拟机使用机器类型的 CPU 核心数一样。如需详细了解 Compute Engine 如何对虚拟机进行计费,请参阅虚拟机实例价格

限制

  • 当虚拟机处于 RUNNING 状态时,您无法自定义可见 CPU 核心数。如需详细了解虚拟机状态,请参阅虚拟机实例生命周期

  • 在 Google Cloud 控制台中,当可见核心数减少时,CPU 利用率指标无法扩容到 100%。CPU 利用率指标仅限于可见 CPU 核心数除以最大 CPU 核心数。

支持的机器类型和每个机器类型的有效值

许多机器类型都支持自定义可见 CPU 核心的数量。可见 CPU 核心数的值必须为整数。最大值为机器类型中的 vCPU 数量(或加速器优化机器类型的 GPU 数量)除以虚拟机的每个核心线程数

下表显示了支持此自定义的机器类型,以及这些系列中机器类型的可见 CPU 核心的相应有效值。

机器类型系列 预定义 vCPU 数量* 可见 CPU 核心的有效值
通用
C3D ≤ 180 不限
C3D 360 2 的倍数
C3 4、8、22、44 1 的倍数
C3 88 2 的倍数
C3 176 4 的倍数
E2 ≤ 32 不限
N2 ≤ 32 不限
N2 > 32 2 的倍数
N2D ≤ 24 不限
N2D > 24 2 的倍数
N4 ≤ 80 不限
N1 ≤ 64 不限
N1 > 64 2 的倍数
N1(针对 TPU 进行了优化) 48 不限
N1(针对 TPU 进行了优化) 96 2 的倍数
存储优化
Z3 88 2 的倍数
Z3 176 4 的倍数
计算优化
H3 88 4 的倍数
C2 4、8、16、30 不限
C2 60 2 的倍数
内存优化
M3 128 2 的倍数
M3 32、64 不限
M2 208 4 的倍数
M2 416 8 的倍数
M1 40 不限
M1 80、96 2 的倍数
M1 160 4 的倍数
加速器优化
A3 208 2 的倍数
A2 ≤ 48 不限
A2 96 2 的倍数
G2 ≤ 48 不限
G2 96 2 的倍数
* 大多数机器类型的名称都包含 vCPU 数量。但是,对于 A3 和 A2 加速器优化机器类型,机器类型的名称包含预定义的 GPU 数量。如需查看 A3 和 A2 加速器优化机器类型的 vCPU 数量,请参阅加速器优化机器家族文档。

自定义虚拟机创建过程中可见 CPU 核心的数量

如需在创建单个虚拟机时自定义可见 CPU 核心数,请使用 Google Cloud 控制台、gcloud CLI 或 Compute Engine API。

以下示例显示如何创建具有较少可见 CPU 核心数量的 SQL Server 虚拟机。

控制台

如需在创建虚拟机时自定义可见 CPU 核心数,请执行以下操作:

  • 机器配置 > 高级配置 > 可见核心数中,选择可见核心的数量。

gcloud

要创建具有较少可见 CPU 核心数量的 SQL Server 虚拟机,请使用以下 gcloud compute instances create 命令

gcloud compute instances create VM_NAME \
    --image-project=windows-sql-cloud \
    --image-family=sql-ent-2019-win-2019 \
    --machine-type=MACHINE_TYPE \
    --visible-core-count=VISIBLE_CORE_COUNT \
    --zone=ZONE

替换以下内容:

  • VM_NAME:虚拟机的名称。

  • MACHINE_TYPE:支持的机器类型,例如 c2-standard-60

  • VISIBLE_CORE_COUNT:可见 CPU 核心数。例如,使用 c2-standard-60 机器类型时,如果设置为 20 并且每个核心的线程数为 2,则 60 个 CPU 中的 40 个可见。

  • ZONE:要在其中创建虚拟机的可用区。

REST

要创建具有较少可见 CPU 核心数量的 SQL Server 虚拟机,请使用以下 instances.insert 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "VM_NAME",
  ...
  "advanced_machine_features": {
    ...
    "visibleCoreCount": "VISIBLE_CORE_COUNT"
  },
  ...
}

替换以下内容:

  • PROJECT_ID:项目的 ID。

  • ZONE:要在其中创建虚拟机的可用区。

  • VM_NAME:虚拟机的名称。

  • VISIBLE_CORE_COUNT:可见 CPU 核心数。例如,使用 c2-standard-60 机器类型时,如果设置为 20 并且每个核心的线程数为 2,则 60 个 CPU 中的 40 个可见。

使用实例模板自定义一组虚拟机上可见 CPU 核心的数量

如需在使用实例模板创建虚拟机时自定义可见 CPU 核心数,请使用 Google Cloud 控制台、gcloud CLI 或 Compute Engine API。

以下示例展示了如何使用实例模板创建一组具有更少可见 CPU 核心数量的相同 SQL Server 虚拟机。

控制台

如需在创建实例模板时自定义可见 CPU 核心数,请执行以下操作:

  • 机器配置 > 高级配置 > 可见核心数中,选择可见核心的数量。

gcloud

  1. 使用以下 gcloud compute instance-templates create 命令为 SQL Server 虚拟机创建实例模板,每个实例模板都有更少的可见 CPU 核心数量:

    gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
       --image-project=windows-sql-cloud \
       --image-family=sql-ent-2019-win-2019 \
       --machine-type=MACHINE_TYPE \
       --visible-core-count=VISIBLE_CORE_COUNT \
       --zone=ZONE
    

    替换以下内容:

    • INSTANCE_TEMPLATE_NAME:实例模板的名称。

    • MACHINE_TYPE:支持的机器类型,例如 c2-standard-60

    • VISIBLE_CORE_COUNT:可见 CPU 核心的数量。例如,使用 c2-standard-60 机器类型时,如果设置为 20 并且每个核心的线程数为 2,则 60 个 CPU 中的 40 个可见。

    • ZONE:要在其中创建虚拟机的可用区。

  2. 使用以下 gcloud compute instances create 命令创建 SQL Server 虚拟机,每个虚拟机都具有更少的可见 CPU 核心数量:

    gcloud compute instances create INSTANCE_NAMES \
       --source-instance-template=INSTANCE_TEMPLATE_NAME
    

    替换以下内容:

    • INSTANCE_NAMES:要从实例模板创建的虚拟机的名称(以空格分隔)

    • INSTANCE_TEMPLATE_NAME:要从中创建虚拟机的实例模板的名称

REST

  1. 使用以下 instanceTemplates.insert 方法为 SQL Server 虚拟机创建实例模板,每个实例模板都有更少的可见 CPU 核心数量:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates
    
    {
     "name": "INSTANCE_TEMPLATE_NAME",
     ...
     "advanced_machine_features": {
       ...
       "visible_core_count": "VISIBLE_CORE_COUNT"
     },
     ...
    }
    

    替换以下内容:

    • PROJECT_ID:项目的 ID。

    • INSTANCE_TEMPLATE_NAME:实例模板的名称。

    • VISIBLE_CORE_COUNT:可见 CPU 核心的数量。例如,使用 c2-standard-60 机器类型时,如果设置为 20 并且每个核心的线程数为 2,则 60 个 CPU 中的 40 个可见。

  2. 使用以下 instances.insert 方法创建 SQL Server 虚拟机,每个虚拟机的具有更少的 CPU 核心数量:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances?sourceInstanceTemplate=INSTANCE_TEMPLATE_NAME
    
    {
     "name": "VM_NAME",
     ...
    }
    

    替换以下内容:

    • PROJECT_ID:项目的 ID

    • ZONE:要在其中创建虚拟机的可用区

    • INSTANCE_TEMPLATE_NAME:要从中创建虚拟机的实例模板的名称

    • VM_NAME:要从实例模板创建的虚拟机的名称

自定义可见 CPU 核心数

如需自定义现有虚拟机上的可见 CPU 核心数,请使用 Google Cloud 控制台、gcloud CLI 或 Compute Engine API。

如果使用实例模板自定义一组虚拟机上的可见 CPU 核心数量,则必须创建新的实例模板,然后基于该实例模板创建新的虚拟机。如需详细了解实例模板,请参阅实例模板

控制台

如需自定义现有虚拟机上的可见 CPU 核心数,请执行以下操作:

  1. 停止虚拟机。

  2. 机器配置 > 高级配置 > 可见核心数中,选择可见核心的数量。

  3. 重启虚拟机。

gcloud

如需更新现有虚拟机上可见 CPU 核心数量的值,请按照以下步骤操作。如需了解详情,请参阅更新实例属性

  1. 使用 gcloud compute instances export 命令将现有虚拟机属性导出到文件。

  2. 在包含导出属性的文件中,修改或添加以下内容的值:

    advancedMachineFeatures:
     visibleCoreCount: VISIBLE_CORE_COUNT
    
  3. 使用带有 --most-disruptive-allowed-action=RESTARTgcloud compute instances update-from-file 命令更新虚拟机属性。

REST

如需更新虚拟机的可见 CPU 核心数量,请使用以下 instances.update 方法

PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME?most_disruptive_allowed_action=RESTART

{
  ...
  "advanced_machine_features": {
    ...
    "visible_core_count": "VISIBLE_CORE_COUNT"
  },
  ...
}

替换以下内容:

  • PROJECT_ID:项目的 ID

  • ZONE:包含虚拟机的可用区

  • VM_NAME:要从中导出属性的虚拟机的名称

  • VISIBLE_CORE_COUNT:可见 CPU 核心的数量

后续步骤