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 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:
- Todos los tipos de máquinas C4A
- Todos los tipos de máquinas H3
- Todos los tipos de máquinas Tau T2A
- Todos los tipos de máquinas Tau T2D
- Tipos de máquinas que tienen menos de 2 CPU virtuales, por ejemplo,
n1-standard-1
- Tipos de máquinas de núcleo compartido, como
e2-small
.
Para las instancias C3 y X4 de Bare Metal, la cantidad de subprocesos a los que tienes acceso es equivalente a la cantidad de subprocesos 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:
- Todos los permisos necesarios para crear una VM nueva
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:
En la consola de Google Cloud, ve a la página Crea una instancia.
En el campo Nombre, ingresa un nombre para la VM.
Elige una región y una zona para la VM.
Elige una Familia de máquinas y un Tipo de máquina compatible.
Haz clic en Configuración avanzada para expandir la sección.
En Proporción de CPU virtuales a núcleo, elige la cantidad de subprocesos por núcleo.
Termina de configurar otras opciones de configuración para la VM y haz clic en Crear.
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
o1
.
Ejecuta el siguiente comando:
Linux, macOS o Cloud Shell
gcloud compute instances createVM_NAME \ --zone=ZONE \ --machine-type=MACHINE_TYPE \ --threads-per-core=THREADS_PER_CORE
Windows (PowerShell)
gcloud compute instances createVM_NAME ` --zone=ZONE ` --machine-type=MACHINE_TYPE ` --threads-per-core=THREADS_PER_CORE
Windows (cmd.exe)
gcloud compute instances createVM_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
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
o1
.
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:
curl (Linux, macOS o Cloud Shell)
Guarda el cuerpo de la solicitud en un archivo llamado request.json
y ejecuta el siguiente comando:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://compute.googleapis.com/compute/v1/projects/PROJECT_ID /zones/ZONE /instances"
PowerShell (Windows)
Guarda el cuerpo de la solicitud en un archivo llamado request.json
y ejecuta el siguiente comando:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://compute.googleapis.com/compute/v1/projects/PROJECT_ID /zones/ZONE /instances" | Select-Object -Expand Content
Explorador de APIs (navegador)
Copia el cuerpo de la solicitud y abre la página de referencia del método. El panel del Explorador de API se abre en la parte derecha de la página. Puedes interactuar con esta herramienta para enviar solicitudes. Pega el cuerpo de la solicitud en esta herramienta, completa cualquier otro campo obligatorio y haz clic en Ejecutar.
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
Para cambiar la cantidad de subprocesos por núcleo en una VM existente, usa el siguiente procedimiento de la consola de Google Cloud:
En la consola de Google Cloud, ve a la página Instancias de VM.
Haz clic en el nombre de la VM.
Si el Estado de la VM es En ejecución, haz clic en Detener.
Haz clic en Editar.
Haz clic en Configuración avanzada para expandir la sección.
En la lista desplegable CPU virtuales para proporción de núcleos, elige la cantidad de subprocesos por núcleo.
Haz clic en Guardar.
Para cambiar la cantidad de subprocesos por núcleo en una VM existente, haz lo siguiente:
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 propiedadesYAML_FILE_PATH
: La ruta de acceso y el nombre de un archivo .yaml en el que se guardarán los datos de configuración exportadosZONE
: La zona que contiene la VM
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 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 actualizadaZONE
: la zona que contiene la VM que se actualizará
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 proyectoZONE
: La zona que contiene la VMVM_NAME
: El nombre de la VM desde la que se exportarán las propiedadesTHREADS_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.
Para ver la cantidad de subprocesos por núcleo en VM basadas en Linux, usa el siguiente procedimiento:
Ejecuta el comando
lscpu
.lscpu
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 es1
como se muestra en la líneaThread(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 ...
Para ver la cantidad de subprocesos por núcleo en las VMs basadas en Windows, usa el siguiente procedimiento:
Inicia PowerShell.
Ejecuta el siguiente comando.
Get-WmiObject -Class Win32_processor | Select-Object NumberOfCores, @{Name="Thread(s) per core";Expression={$_.NumberOfLogicalProcessors/$_.NumberOfCores}}
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 es1
como se muestra en la columnaThread(s) per core
.NumberOfCores Thread(s) per core ------------- ------------------ 8 1
¿Qué sigue?
- Obtén más información sobre los sistemas operativos que puedes ejecutar en las VM de Compute Engine.