Establecer el número de subprocesos por núcleo


El multiproceso simultáneo (SMT), conocido en los procesadores Intel como tecnología Hyper-Threading (HTT), permite que un núcleo de CPU se ejecute como dos subprocesos múltiples de hardware. En Compute Engine, cada CPU virtual (vCPU) se implementa como un único subproceso de hardware y dos vCPU comparten cada núcleo de CPU físico de forma predeterminada.

Compute Engine te permite establecer manualmente el valor de la cantidad de subprocesos por núcleo. Por ejemplo, las cargas de trabajo con las siguientes preocupaciones podrían beneficiarse al deshabilitar SMT (estableciendo el número de subprocesos por núcleo en 1):

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

  • Seguridad: si una máquina virtual ejecuta código que no es de confianza, reducir la cantidad de subprocesos por núcleo puede ayudar a mitigar las vulnerabilidades de la CPU, como el muestreo de datos de microarquitectura .

  • Licencias: algunos acuerdos de licencia tienen requisitos relacionados con la cantidad de vCPU que consume. Reducir la cantidad de subprocesos por núcleo de 2 a 1 podría reducir los costos de licencia. Para obtener más información, consulte su acuerdo de licencia.

Para muchas tareas informáticas generales o tareas que requieren mucha E/S, SMT puede aumentar significativamente el rendimiento de la aplicación. Para trabajos vinculados a la computación en los que ambos núcleos virtuales están vinculados a la computación, SMT puede obstaculizar el rendimiento general de la aplicación y agregar variaciones impredecibles a los trabajos. En este caso, desactivar SMT permite un rendimiento más predecible y puede reducir los tiempos de trabajo.

Limitaciones

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

  • Para las instancias bare metal C3 y X4, la cantidad de hiperprocesos a los que tiene acceso es equivalente a la cantidad de hiperprocesos 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 utilización de la CPU solo puede escalar hasta un máximo del 50 %. Cuando la cantidad de subprocesos por núcleo se establece en 2, la métrica de utilización de la CPU puede escalar hasta el 100 %.

Precios

Se le factura la cantidad de vCPU definidas por el tipo de máquina de una máquina virtual, no 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 vCPU, es decir, 2 vCPU para cada uno de los 4 núcleos físicos de la CPU. Si, con el tipo de máquina n2-standard-8 , decide ejecutar solo 1 subproceso por núcleo (efectivamente, 4 vCPU), aún se le facturarán 8 vCPU. Para obtener más información sobre cómo se le facturan las VM, consulte Precios de instancias de VM .

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

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

Permisos necesarios para esta tarea

Para realizar esta tarea, debe tener los siguientes permisos :

Consola

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

  1. En la consola de Google Cloud, vaya a la página Crear una instancia .

    Ir a Crear una instancia

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

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

  4. Elija una familia de máquinas y un tipo de máquina compatible.

  5. Haga clic en Configuraciones avanzadas para expandir la sección.

  6. En relación vCPU a núcleo , elija la cantidad de subprocesos por núcleo.

  7. Termine de configurar otras configuraciones para la VM y haga clic en Crear .

nube de gcloud

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

Antes de utilizar cualquiera de los datos de comando siguientes, realice los siguientes reemplazos:

  • VM_NAME : el nombre de la nueva VM.
  • ZONE : la zona para la nueva VM.
  • MACHINE_TYPE : el tipo de máquina para la nueva VM. Debe ser un tipo de máquina con 2 o más vCPU.
  • THREADS_PER_CORE : el número de subprocesos por núcleo físico. Establezca en 2 o 1 .

Ejecute 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ía recibir una respuesta similar a la siguiente:

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

DESCANSAR

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

Antes de utilizar cualquiera de los datos de la solicitud, realice los siguientes reemplazos:

  • PROJECT_ID : el ID del proyecto.
  • ZONE : la zona para la nueva VM.
  • MACHINE_TYPE : el tipo de máquina para la nueva VM. Debe ser un tipo de máquina con 2 o más vCPU.
  • VM_NAME : el nombre de la nueva VM.
  • THREADS_PER_CORE : el número de subprocesos por núcleo físico. Establezca en 2 o 1 .

Método HTTP y URL:

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

Solicitar cuerpo JSON:

{
  "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 su solicitud, expanda una de estas opciones:

Debería recibir una respuesta JSON similar a la siguiente:

{
  "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"
}

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

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

Permisos necesarios para esta tarea

Para realizar esta tarea, debe tener los siguientes permisos :

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

Consola

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

  1. En la consola de Google Cloud, vaya a la página de instancias de VM .

    Ir a instancias de VM

  2. Haga clic en el nombre de la máquina virtual.

  3. Si el estado de la máquina virtual es En ejecución , haga clic en Detener .

  4. Haga clic en Editar .

  5. Haga clic en Configuraciones avanzadas para expandir la sección.

  6. En la lista desplegable de vCPU a relación de núcleos , elija la cantidad de subprocesos por núcleo.

  7. Haga clic en Guardar .

nube de gcloud

Para cambiar la cantidad de subprocesos por núcleo en una máquina virtual existente, haga lo siguiente:

  1. Exporte las propiedades de la máquina virtual mediante el siguiente comando gcloud compute instances export :

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

    Reemplace lo siguiente:

    • VM_NAME : el nombre de la VM desde la cual exportar propiedades

    • YAML_FILE_PATH : la ruta y el nombre de archivo de un archivo .yaml en el que guardar 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 , actualice el valor de threadsPerCore . Si el valor no está en el archivo, agregue lo siguiente:

    advancedMachineFeatures:
      threadsPerCore: THREADS_PER_CORE
    
  3. Actualice la máquina virtual 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
    

    Reemplace lo siguiente:

    • VM_NAME : el nombre de la VM a actualizar

    • FILE_PATH : la ruta al archivo de configuración de VM actualizado

    • ZONE : la zona que contiene la VM a actualizar

DESCANSAR

Para cambiar la cantidad de subprocesos por núcleo en una máquina virtual existente, use 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"
  },
  ...
}

Reemplace lo siguiente:

  • PROJECT_ID : el ID del proyecto

  • ZONE : la zona que contiene la VM

  • VM_NAME : el nombre de la VM desde la cual exportar propiedades

  • THREADS_PER_CORE : el número de subprocesos por núcleo

Ver el número de subprocesos por núcleo

Para ver la cantidad de subprocesos por núcleo, utilice el procedimiento que corresponda al sistema operativo que se ejecuta en la VM.

linux

Para ver la cantidad de subprocesos por núcleo en máquinas virtuales basadas en Linux, utilice el siguiente procedimiento:

  1. Conéctese a la máquina virtual Linux .

  2. Ejecute el comando lscpu .

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

    En el siguiente ejemplo de salida de una máquina n2-standard-16 , el valor del número 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
    ...
    

ventanas

Para ver la cantidad de subprocesos por núcleo en máquinas virtuales basadas en Windows, utilice el siguiente procedimiento:

  1. Conéctese a la máquina virtual de Windows .

  2. Inicie Powershell.

  3. Ejecute el siguiente comando.

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

    En el siguiente ejemplo de salida de una máquina n2-standard-16 , el valor del número 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?