A multithreading simultânea (SMT), conhecida nos processadores Intel como tecnologia Hyper-Threading (HTT), permite que um núcleo da CPU seja executado como dois multithreads de hardware. No Compute Engine, cada CPU virtual (vCPU) é implementada como um multithread de hardware único e duas vCPUs partilham cada núcleo da CPU física por predefinição.
O Compute Engine permite-lhe definir manualmente o valor do número de threads por núcleo. Por exemplo, as cargas de trabalho com as seguintes preocupações podem beneficiar da desativação da SMT (definindo o número de threads por núcleo como 1):
Desempenho: reduzir o número de threads executados em cada núcleo da CPU física pode ajudar a melhorar o desempenho das cargas de trabalho altamente paralelas ou que realizam cálculos de vírgula flutuante.
Segurança: se uma MV executar código não fidedigno, a redução do número de threads por núcleo pode ajudar a mitigar vulnerabilidades da CPU, como a amostragem de dados microarquitetónicos.
Licenciamento: alguns contratos de licenciamento têm requisitos relacionados com o número de CPUs virtuais que consome. Reduzir o número de threads por núcleo de 2 para 1 pode reduzir os custos de licenciamento. Para mais informações, consulte o seu contrato de licenciamento.
Para muitas tarefas de computação geral ou tarefas que requerem muitas E/S, a SMT pode aumentar significativamente o débito da aplicação. Para tarefas com restrições de computação em que ambos os núcleos virtuais têm restrições de computação, a SMT pode prejudicar o desempenho geral da aplicação e adicionar uma variação imprevisível às tarefas. Neste caso, desativar a SMT permite um desempenho mais previsível e pode diminuir os tempos de execução.
Limitações
Não pode definir o número de threads por núcleo em VMs para os seguintes tipos de máquinas:
- Todos os tipos de máquinas C4A
- Todos os tipos de máquinas H4D
- Todos os tipos de máquinas H3
- Todos os tipos de máquinas Tau T2A
- Todos os tipos de máquinas Tau T2D
- Tipos de máquinas com menos de 2 vCPUs, por exemplo,
n1-standard-1
- Tipos de máquinas com núcleo partilhado, como
e2-small
.
Para instâncias bare metal, o número de hyperthreads aos quais tem acesso é equivalente ao número de hyperthreads na máquina.
Na Google Cloud consola, quando o número de threads por núcleo está definido como 1, a métrica de utilização da CPU só pode ser dimensionada até um máximo de 50%. Quando o número de threads por núcleo está definido como 2, a métrica de utilização da CPU pode aumentar até 100%.
Preços
A faturação é feita com base no número de vCPUs definidas pelo tipo de máquina de uma VM e não no número de threads executados em cada núcleo. Por exemplo, o n2-standard-8
tipo de máquina pode executar até 8 vCPUs, que correspondem a 2 vCPUs para cada um dos 4 núcleos
físicos da CPU. Se, com o tipo de máquina n2-standard-8
, decidir executar apenas 1 thread por núcleo, ou seja, 4 vCPUs, continua a receber faturação por 8 vCPUs. Para mais informações sobre a faturação de VMs, consulte os preços das instâncias de VM.
Altere o número de threads por núcleo durante a criação da VM
Para alterar o número de threads por núcleo durante a criação da VM, use a Google Cloud consola, a CLI gcloud ou a API Compute Engine.
Autorizações necessárias para esta tarefa
Para realizar esta tarefa, tem de ter as seguintes autorizações:
- Todas as autorizações necessárias para criar uma nova VM
Consola
Para alterar o número de threads por núcleo durante a criação da VM, use o seguinte Google Cloud procedimento da consola:
Na Google Cloud consola, aceda à página Criar uma instância.
No campo Nome, introduza um nome para a VM.
Escolha uma região e uma zona para a VM.
Escolha uma família de máquinas e um tipo de máquina suportado.
Clique em Configurações avançadas para expandir a secção.
Em vCPUs to core ratio, escolha o número de threads por núcleo.
Conclua a configuração de outras definições para a MV e clique em Criar.
gcloud
Para alterar o número de threads por núcleo durante a criação da VM, use o comando gcloud compute instances create
.
Antes de usar qualquer um dos dados de comandos abaixo, faça as seguintes substituições:
- VM_NAME: o nome da nova VM.
- ZONE: a zona da nova VM.
- MACHINE_TYPE: o tipo de máquina para a nova VM. Tem de ser um tipo de máquina com 2 ou mais vCPUs.
- THREADS_PER_CORE: o número de threads por núcleo físico. Defina como
2
ou1
.
Execute o seguinte comando:
Linux, macOS ou 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
Deve receber uma resposta semelhante à seguinte:
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 alterar o número de threads por núcleo durante a criação da VM, use o método instances.insert
com o campo threadsPerCore
.
Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:
- PROJECT_ID: o ID do projeto.
- ZONE: a zona da nova VM.
- MACHINE_TYPE: o tipo de máquina para a nova VM. Tem de ser um tipo de máquina com 2 ou mais vCPUs.
- VM_NAME: o nome da nova VM.
- THREADS_PER_CORE: o número de threads por núcleo físico. Defina como
2
ou1
.
Método HTTP e URL:
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
Corpo JSON do pedido:
{ "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 o seu pedido, expanda uma destas opções:
Deve receber uma resposta JSON semelhante à seguinte:
{ "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" }
Altere o número de threads por núcleo numa VM
Para alterar o número de threads por núcleo numa VM, use a Google Cloud consola, a CLI gcloud ou a API Compute Engine.
Autorizações necessárias para esta tarefa
Para realizar esta tarefa, tem de ter as seguintes autorizações:
-
compute.instances.get
no projeto -
compute.instances.update
no projeto
Consola
Para alterar o número de threads por núcleo numa VM existente, use o seguinte Google Cloud procedimento da consola:
Na Google Cloud consola, aceda à página Instâncias de VM.
Clique no Nome da VM.
Clique em
Parar para parar a VM. Se não existir a opção Parar, clique em Mais ações > Parar.Clique em Edit.
Clique em Configurações avançadas para expandir a secção.
Na lista pendente vCPUs to core ratio, escolha o número de threads por núcleo.
Clique em Guardar.
gcloud
Para alterar o número de threads por núcleo numa VM existente, faça o seguinte:
Exporte as propriedades da VM através do seguinte
gcloud compute instances export
comando:gcloud compute instances export VM_NAME \ --destination=YAML_FILE_PATH \ --zone=ZONE
Substitua o seguinte:
VM_NAME
: o nome da VM a partir da qual exportar propriedadesYAML_FILE_PATH
: o caminho e o nome do ficheiro de um ficheiro YAML no qual guardar os dados de configuração exportadosZONE
: a zona que contém a VM
No ficheiro de configuração da VM que foi guardado em FILE_PATH, atualize o valor de
threadsPerCore
. Se o valor não estiver no ficheiro, adicione o seguinte:advancedMachineFeatures: threadsPerCore: THREADS_PER_CORE
Atualize a VM com a nova contagem de threads por núcleo através do seguinte 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
Substitua o seguinte:
VM_NAME
: o nome da VM a atualizarFILE_PATH
: o caminho para o ficheiro de configuração da VM atualizadoZONE
: a zona que contém a VM a atualizar
REST
Para alterar o número de threads por núcleo numa VM existente, use o instances.update
método seguinte:
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" }, ... }
Substitua o seguinte:
PROJECT_ID
: o ID do projetoZONE
: a zona que contém a VMVM_NAME
: o nome da VM a partir da qual exportar propriedadesTHREADS_PER_CORE
: o número de discussões por núcleo
Veja o número de threads por núcleo
Para ver o número de threads por núcleo, use o procedimento que corresponde ao SO em execução na VM.
Linux
Para ver o número de threads por núcleo em VMs baseadas em Linux, use o seguinte procedimento:
Execute o comando
lscpu
.lscpu
Reveja a saída para ver o número de threads por núcleo.
Na seguinte saída de amostra de uma máquina
n2-standard-16
, o valor do número de threads por núcleo é1
, conforme mostrado na linhaThread(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 o número de threads por núcleo em VMs baseadas no Windows, use o seguinte procedimento:
Inicie o Powershell.
Execute o seguinte comando.
Get-WmiObject -Class Win32_processor | Select-Object NumberOfCores, @{Name="Thread(s) per core";Expression={$_.NumberOfLogicalProcessors/$_.NumberOfCores}}
Reveja a saída para ver o número de threads por núcleo.
Na seguinte saída de amostra de uma máquina
n2-standard-16
, o valor do número de threads por núcleo é1
, conforme mostrado na colunaThread(s) per core
.NumberOfCores Thread(s) per core ------------- ------------------ 8 1
O que se segue?
- Saiba mais sobre os sistemas operativos que pode executar em VMs do Compute Engine.