Customize the number of visible CPU cores


Customizing the number of visible CPU cores can provide granular control over licensing costs, while maintaining the performance of networking and persistent disks. This customization reduces the number of vCPUs that are available to the virtual machine (VM) instance; it doesn't change the machine type or price.

Compute Engine implements each virtual CPU (vCPU) as a single hardware multithread that runs on a physical CPU core. To reduce the number of vCPUs that are available to a VM, Compute Engine lets you customize the number of visible CPU cores.

Visible cores are the CPU cores in the underlying hardware that your VMs consume. By default, the number of CPU cores that are visible to a VM is the number of vCPUs on the machine type divided by the number of threads per core:

  • Visible CPU cores = vCPUs on the machine type / threads per core

For example, the c2-standard-60 machine type specifies 60 vCPUs. Assuming the default of 2 threads per core, the number of visible CPU cores is 30. Reducing the number of visible CPU cores by 1 reduces the number of available vCPUs by the number of threads per core. In this case, reducing the number of visible cores from 30 to 20 reduces the number of functional vCPUs from 60 to 40.

Consider customizing the number of visible CPU cores if both of the following apply:

Before customizing the number of vCPUs that are available to a VM, first consider using a custom machine type.

vCPUs and the number of threads per core

The total vCPUs on a machine type is the number of visible CPU cores multiplied by the number of threads per core. By default, the number of threads per core is 2, but you can manually set the number of threads per core to 1.

The following table shows how visible CPU cores, number of threads per core, and total available vCPUs are related using the c2-standard-60 machine type as an example.

Machine type Visible CPU cores Threads per core Available vCPUs
c2-standard-60 30 (default) 2 (default) 60
c2-standard-60 30 (default) 1 30
c2-standard-60 20 2 (default) 40
c2-standard-60 20 1 20

Performance considerations

Persistent disk

  • The performance limits of persistent disks depend on the machine type and aren't affected by the number of visible CPU cores. For more information, see Block storage performance.

Networking egress

  • The bandwidth limits of networking egress match the machine type and aren't affected by the number of visible CPU cores. However, networking performance does vary depending on the number of vCPUs that are accessible to the VM. For example, a n2-standard-16 machine type with one visible CPU core might not be able to fully utilize a 32 Gbps connection.

Pricing

Operating system licensing costs

  • You can lower licensing costs for some operating systems by reducing the number of visible CPU cores. Applicable operating systems are those that charge you for each vCPU that is available to the VM, for example, Windows Server and SQL Server. For more information about the licensing options for these operating systems on Compute Engine, see Microsoft licenses.

VM costs

  • VM costs are not affected when you customize the number of visible CPU cores because Compute Engine charges for VMs as if they are using the number of CPU cores on the machine type. For more information about how Compute Engine bills for VMs, see VM instance pricing.

Limitations

  • You cannot customize the number of visible CPU cores while a VM is in the RUNNING state. For more information about VM states, see VM instance lifecycle.

Supported machine types and valid values for each

Many machine types support customization of the number of visible CPU cores. The value for the visible CPU core count must be a whole number. The maximum value is the number of vCPUs—or GPUs for accelerator-optimized machine types— on the machine type divided by the number of threads per core for the VM.

The following table shows the machine types that support this customization, along with the corresponding valid values for visible CPU cores for machine types in those families.

Machine type family Predefined vCPU count* Valid values for visible CPU cores
General purpose
E2 ≤ 32 Any
N2 ≤ 32 Any
N2 > 32 Multiples of 2
N2D ≤ 24 Any
N2D > 24 Multiples of 2
N1 ≤ 64 Any
N1 > 64 Multiples of 2
N1 (TPU optimized) 48 Any
N1 (TPU optimized) 96 Multiples of 2
Memory-optimized
M2 208 Multiples of 4
M2 416 Multiples of 8
M1 40 Any
M1 80, 96 Multiples of 2
M1 160 Multiples of 4
Compute-optimized
C2 4, 8, 16, 30 Any
C2 60 Multiples of 2
Accelerator-optimized
A2 1, 2, 4 Any
A2 8, 16 Multiples of 2
* For accelerator-optimized machine types, this is the predefined GPU count.

Customize the number of visible CPU cores during VM creation

To customize the number of visible CPU cores while creating a single VM, use the gcloud CLI or the Compute Engine API.

The following example shows how to create a SQL Server VM with a reduced number of visible CPU cores.

gcloud

To create a SQL Server VM with a reduced number of visible CPU cores, use the following gcloud beta compute instances create command:

gcloud beta 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

Replace the following:

  • VM_NAME: the name of the VM.

  • MACHINE_TYPE: a supported machine type, for example, c2-standard-60.

  • VISIBLE_CORE_COUNT: the number of visible CPU cores. For example, when using the c2-standard-60 machine type, if set to 20, and the number of threads per core is 2, 40 of the 60 CPUs are visible.

  • ZONE: the zone to create the VM in.

API

To create a SQL Server VM with a reduced number of visible CPU cores, use the following instances.insert method:

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

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

Replace the following:

  • PROJECT_ID: the ID of the project.

  • ZONE: the zone in which to create the VM.

  • VM_NAME: the name of the VM.

  • VISIBLE_CORE_COUNT: the number of visible CPU cores. For example, when using the c2-standard-60 machine type, if set to 20, and the number of threads per core is 2, 40 of the 60 CPUs are visible.

Customize the number of visible CPU cores on a group of VMs by using an instance template

To customize the number of visible CPU cores while creating a VM by using an instance template, use the gcloud CLI or the Compute Engine API.

The following example shows how to create a group of identical SQL Server VMs with a reduced number of visible CPU cores by using an instance template.

gcloud

  1. Create an instance template for SQL Server VMs, each with a reduced number of visible CPU cores, by using the following gcloud beta compute instance-templates create command:

    gcloud beta 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
    

    Replace the following:

    • INSTANCE_TEMPLATE_NAME: the name of the instance template.

    • MACHINE_TYPE: a supported machine type, for example, c2-standard-60.

    • VISIBLE_CORE_COUNT: the number of visible CPU cores. For example, when using the c2-standard-60 machine type, if set to 20, and the number of threads per core is 2, 40 of the 60 CPUs are visible.

    • ZONE: the zone to create the VMs in.

  2. Create the SQL Server VMs, each with a reduced number of visible CPU cores, by using the following gcloud beta compute instances create command:

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

    Replace the following:

    • INSTANCE_NAMES: the names of the VMs, separated by spaces, to create from the instance template

    • INSTANCE_TEMPLATE_NAME: the name of the instance template from which to create the VMs

API

  1. Create an instance template for SQL Server VMs, each with a reduced number of visible CPU cores, by using the following instanceTemplates.insert method:

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

    Replace the following:

    • PROJECT_ID: the ID of the project.

    • INSTANCE_TEMPLATE_NAME: the name of the instance template.

    • VISIBLE_CORE_COUNT: the number of visible CPU cores. For example, when using the c2-standard-60 machine type, if set to 20, and the number of threads per core is 2, 40 of the 60 CPUs are visible.

  2. Create the SQL Server VMs, each with a reduced number of visible CPU cores, by using the following instances.insert method:

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

    Replace the following:

    • PROJECT_ID: the ID of the project

    • ZONE: the zone to create the VM in

    • INSTANCE_TEMPLATE_NAME: the name of the instance template from which to create the VMs

    • VM_NAME: the name of the VM to create from the instance template

Customize the number of visible CPU cores

To customize the number of visible CPU cores on an existing VM, use the gcloud CLI or the Compute Engine API.

If you customized the number of visible CPU cores on a group of VMs by using an instance template, you must create a new instance template and then create new VMs from that instance template. For more information about instance templates, see Instance templates.

gcloud

To update the value for the number of visible CPU cores on an existing VM, use the following steps. For more information, see Update instance properties.

  1. Export the existing VM properties to a file by using the gcloud beta compute instances export command.

  2. In the file containing the exported properties, modify or add the value for the following:

    advancedMachineFeatures:
     visibleCoreCount: VISIBLE_CORE_COUNT
    
  3. Update the VM's properties by using the gcloud beta compute instances update-from-file command with --most-disruptive-allowed-action=RESTART.

API

To update the visible CPU core count of the VM, use the following instances.update method:

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

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

Replace the following:

  • PROJECT_ID: the ID of the project

  • ZONE: the zone that contains the VM

  • VM_NAME: the name of the VM from which to export properties

  • VISIBLE_CORE_COUNT: the number of visible CPU cores

What's next