Establece la cantidad de subprocesos por núcleo


Los subprocesos múltiples simultáneos (SMT), que se conocen en los procesadores Intel como tecnología de hipersubprocesos (HTT), permiten que un núcleo de CPU se ejecute como dos subprocesos múltiples de hardware. En Compute Engine, cada CPU virtual se implementa como un solo subproceso múltiple de hardware único, y dos CPU virtuales comparten cada núcleo de la CPU física de forma predeterminada.

Compute Engine te permite configurar de forma manual el valor para la cantidad de subprocesos por núcleo. Por ejemplo, las cargas de trabajo con los siguientes problemas podrían beneficiarse por inhabilitar los SMT (la configuración de la cantidad de subprocesos por núcleo en 1):

  • Rendimiento: Reducir la cantidad de subprocesos que se ejecutan en cada núcleo de CPU físico puede ayudar a mejorar el rendimiento de las cargas de trabajo que son muy paralelas o que realizan cálculos de punto flotante.

  • Seguridad: Si una VM ejecuta código no confiable, reducir la cantidad de subprocesos por núcleo puede ayudar a mitigar las vulnerabilidades de CPU, como el muestreo de datos de microarquitectura.

  • Licencias: Algunos contratos de licencia tienen requisitos relacionados con la cantidad de CPU virtuales que consumes. Reducir la cantidad de subprocesos por núcleo de 2 a 1 puede reducir los costos de licencia. Para obtener más información, consulta tu contrato de licencia.

En el caso de que haya muchas tareas generales de procesamiento o tareas que requieren mucha E/S, se puede aumentar la capacidad de procesamiento de la aplicación de manera significativa mediante los SMT. En el caso de que existan trabajos vinculados al procesamiento en los que ambos núcleos virtuales estén vinculados al procesamiento, los SMT pueden afectar el rendimiento general de la aplicación y agregar una varianza impredecible a los trabajos. En este caso, desactivar los SMT permite un rendimiento más predecible y puede disminuir los tiempos de trabajo.

Limitaciones

  • No puedes establecer la cantidad de subprocesos por núcleo en las VM para los siguientes tipos de máquinas:

  • Para las instancias de equipos físicos C3 y X4, la cantidad de hipersubprocesos a los que tienes acceso es equivalente a la cantidad de hipersubprocesos en la máquina.

  • En la consola de Google Cloud, cuando la cantidad de subprocesos por núcleo se establece en 1, la métrica de uso de CPU solo puede escalar verticalmente hasta un 50%. Cuando la cantidad de subprocesos por núcleo se establece en 2, la métrica de uso de CPU puede escalar hasta el 100%.

Precios

Se te factura por la cantidad de CPU virtuales definida por el tipo de máquina de una VM, no por la cantidad de subprocesos que se ejecutan en cada núcleo. Por ejemplo, el tipo de máquina n2-standard-8 puede ejecutar hasta 8 CPU virtuales, que son 2 CPU virtuales para cada uno de los 4 núcleos de CPU físicos. Si, con el tipo de máquina n2-standard-8, decides ejecutar solo 1 subproceso por núcleo, es decir, 4 CPU virtuales, se te cobrarán 8 CPU virtuales. Para obtener más información sobre cómo se te facturan las VMs, consulta Precios de instancias de VM.

Cambia la cantidad de subprocesos por núcleo durante la creación de la VM

Para cambiar la cantidad de subprocesos por núcleo durante la creación de la VM, usa la consola de Google Cloud, la CLI de gcloud o la API de Compute Engine.

Permisos necesarios para esta tarea

Para realizar esta tarea, debes tener los siguientes permisos:

Console

Para cambiar la cantidad de subprocesos por núcleo durante la creación de la VM, usa el siguiente procedimiento de la consola de Google Cloud:

  1. En la consola de Google Cloud, ve a la página Crea una instancia.

    Ir a Crear una instancia

  2. En el campo Nombre, ingresa un nombre para la VM.

  3. Elige una región y una zona para la VM.

  4. Elige una Familia de máquinas y un Tipo de máquina compatible.

  5. Haz clic en Configuración avanzada para expandir la sección.

  6. En Proporción de CPU virtuales a núcleo, elige la cantidad de subprocesos por núcleo.

  7. Termina de configurar otras opciones de configuración para la VM y haz clic en Crear.

gcloud

Para cambiar la cantidad de subprocesos por núcleo durante la creación de la VM, usa el siguiente comando gcloud compute instances create.

Antes de usar cualquiera de los datos de comando a continuación, realiza los siguientes reemplazos:

  • VM_NAME: Es el nombre de la VM nueva.
  • ZONE: Es la zona para la VM nueva.
  • MACHINE_TYPE: Es el tipo de máquina para la nueva VM. Debe ser un tipo de máquina con 2 CPU virtuales o más.
  • THREADS_PER_CORE: Es la cantidad de subprocesos visibles por núcleo físico. Se establece en 2 o 1.

Ejecuta el siguiente comando:

Linux, macOS o Cloud Shell

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --threads-per-core=THREADS_PER_CORE

Windows (PowerShell)

gcloud compute instances create VM_NAME `
    --zone=ZONE `
    --machine-type=MACHINE_TYPE `
    --threads-per-core=THREADS_PER_CORE

Windows (cmd.exe)

gcloud compute instances create VM_NAME ^
    --zone=ZONE ^
    --machine-type=MACHINE_TYPE ^
    --threads-per-core=THREADS_PER_CORE

Deberías recibir una respuesta similar a la que figura a continuación:

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME].
NAME: VM_NAME
ZONE: ZONE
MACHINE_TYPE: MACHINE_TYPE
PREEMPTIBLE:
INTERNAL_IP: EXTERNAL_IP
EXTERNAL_IP: INTERNAL_IP
STATUS: RUNNING

REST

Para cambiar la cantidad de subproceso por núcleo durante la creación de la VM, usa el método instances.insert con el campo threadsPerCore.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • PROJECT_ID: El ID del proyecto.
  • ZONE: Es la zona para la VM nueva.
  • MACHINE_TYPE: Es el tipo de máquina para la nueva VM. Debe ser un tipo de máquina con 2 CPU virtuales o más.
  • VM_NAME: Es el nombre de la VM nueva.
  • THREADS_PER_CORE: Es la cantidad de subprocesos visibles por núcleo físico. Se establece en 2 o 1.

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

{
  "machineType": "projects/PROJECT_ID/zones/ZONE/machineTypes/MACHINE_TYPE",
  "name": "VM_NAME",
  "advancedMachineFeatures": {
    "threadsPerCore": THREADS_PER_CORE
  },
  "disks": [
    {
      "type": "PERSISTENT",
      "boot": true,
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/family/debian-11"
      }
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/default"
    }
  ]
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "kind": "compute#operation",
  "id": "7334609091572405391",
  "name": "operation-1663806045894-5e939085735d8-7499db32-c12fcc03",
  "zone": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE",
  "operationType": "insert",
  "targetLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME",
  "targetId": "1226375378512516273",
  "status": "RUNNING",
  "user": "EMAIL_ADDRESS",
  "progress": 0,
  "insertTime": "2022-09-21T17:20:48.751-07:00",
  "startTime": "2022-09-21T17:20:48.751-07:00",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations/operation-1663806045894-5e939085735d8-7499db32-c12fcc03"
}

Cambia la cantidad de subprocesos por núcleo en una VM

Para cambiar la cantidad de subprocesos por núcleo en una VM, usa la consola de Google Cloud, la CLI de gcloud o la API de Compute Engine.

Permisos necesarios para esta tarea

Para realizar esta tarea, debes tener los siguientes permisos:

  • compute.instances.get en el proyecto
  • compute.instances.update en el proyecto

Console

Para cambiar la cantidad de subprocesos por núcleo en una VM existente, usa el siguiente procedimiento de la consola de Google Cloud:

  1. En la consola de Google Cloud, ve a la página Instancias de VM.

    Ir a Instancias de VM

  2. Haz clic en el nombre de la VM.

  3. Si el Estado de la VM es En ejecución, haz clic en Detener.

  4. Haz clic en Editar.

  5. Haz clic en Configuración avanzada para expandir la sección.

  6. En la lista desplegable CPU virtuales para proporción de núcleos, elige la cantidad de subprocesos por núcleo.

  7. Haz clic en Guardar.

gcloud

Para cambiar la cantidad de subprocesos por núcleo en una VM existente, haz lo siguiente:

  1. Exporta las propiedades de la VM mediante el siguiente comando gcloud compute instances export:

    gcloud compute instances export VM_NAME \
        --destination=YAML_FILE_PATH \
        --zone=ZONE
    

    Reemplaza lo siguiente:

    • VM_NAME: El nombre de la VM desde la que se exportarán las propiedades

    • YAML_FILE_PATH: La ruta de acceso y el nombre de un archivo .yaml en el que se guardarán los datos de configuración exportados

    • ZONE: La zona que contiene la VM

  2. En el archivo de configuración de VM que se guardó en FILE_PATH, actualiza el valor de threadsPerCore. Si el valor no está en el archivo, agrega lo siguiente:

    advancedMachineFeatures:
      threadsPerCore: THREADS_PER_CORE
    
  3. Actualiza la VM con el nuevo recuento de subprocesos por núcleo mediante el siguiente comando gcloud compute instances update-from-file:

    gcloud compute instances update-from-file VM_NAME \
        --source=FILE_PATH \
        --most-disruptive-allowed-action=RESTART \
        --zone=ZONE
    

    Reemplaza lo siguiente:

    • VM_NAME: El nombre de la VM que se actualizará

    • FILE_PATH: La ruta de acceso al archivo de configuración de VM actualizada

    • ZONE: la zona que contiene la VM que se actualizará

REST

Para cambiar la cantidad de subprocesos por núcleo en una VM existente, usa el siguiente método 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": {
    ...
    "threadsPerCore": "THREADS_PER_CORE"
  },
  ...
}

Reemplaza lo siguiente:

  • PROJECT_ID: El ID del proyecto

  • ZONE: La zona que contiene la VM

  • VM_NAME: El nombre de la VM desde la que se exportarán las propiedades

  • THREADS_PER_CORE: La cantidad de subprocesos por núcleo

Visualiza la cantidad de subprocesos por núcleo

Para ver la cantidad de subprocesos por núcleo, usa el procedimiento que corresponde al SO que se ejecuta en la VM.

Linux

Para ver la cantidad de subprocesos por núcleo en VM basadas en Linux, usa el siguiente procedimiento:

  1. Conéctate a la VM de Linux.

  2. Ejecuta el comando lscpu.

    lscpu
    
  3. Revisa el resultado para ver la cantidad de subprocesos por núcleo.

    En el siguiente resultado de muestra de una máquina n2-standard-16, el valor de la cantidad de subprocesos por núcleo es 1 como se muestra en la línea Thread(s) per core.

    ...
    CPU(s):                          8
    On-line CPU(s) list:             0-7
    Thread(s) per core:              1
    Core(s) per socket:              8
    Socket(s):                       1
    NUMA node(s):                    1
    Vendor ID:                       GenuineIntel
    CPU family:                      6
    Model:                           85
    Model name:                      Intel(R) Xeon(R) CPU @ 2.80GHz
    ...
    

Windows

Para ver la cantidad de subprocesos por núcleo en las VMs basadas en Windows, usa el siguiente procedimiento:

  1. Conéctate a la VM de Windows.

  2. Inicia PowerShell.

  3. Ejecuta el siguiente comando.

    Get-WmiObject -Class Win32_processor | Select-Object NumberOfCores, @{Name="Thread(s) per core";Expression={$_.NumberOfLogicalProcessors/$_.NumberOfCores}}
    
  4. Revisa el resultado para ver la cantidad de subprocesos por núcleo.

    En el siguiente resultado de muestra de una máquina n2-standard-16, el valor de la cantidad de subprocesos por núcleo es 1 como se muestra en la columna Thread(s) per core.

    NumberOfCores Thread(s) per core
    ------------- ------------------
                8                  1
    

¿Qué sigue?