Defina o número de discussões por núcleo


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

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:

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:

  1. Na Google Cloud consola, aceda à página Criar uma instância.

    Aceda a Criar uma instância

  2. No campo Nome, introduza um nome para a VM.

  3. Escolha uma região e uma zona para a VM.

  4. Escolha uma família de máquinas e um tipo de máquina suportado.

  5. Clique em Configurações avançadas para expandir a secção.

  6. Em vCPUs to core ratio, escolha o número de threads por núcleo.

  7. 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 ou 1.

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 ou 1.

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:

  1. Na Google Cloud consola, aceda à página Instâncias de VM.

    Aceder às instâncias de VM

  2. Clique no Nome da VM.

  3. Clique em Parar para parar a VM. Se não existir a opção Parar, clique em Mais ações > Parar.

  4. Clique em Edit.

  5. Clique em Configurações avançadas para expandir a secção.

  6. Na lista pendente vCPUs to core ratio, escolha o número de threads por núcleo.

  7. Clique em Guardar.

gcloud

Para alterar o número de threads por núcleo numa VM existente, faça o seguinte:

  1. Exporte as propriedades da VM através do seguinte gcloud compute instances exportcomando:

    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 propriedades

    • YAML_FILE_PATH: o caminho e o nome do ficheiro de um ficheiro YAML no qual guardar os dados de configuração exportados

    • ZONE: a zona que contém a VM

  2. 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
    
  3. 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 atualizar

    • FILE_PATH: o caminho para o ficheiro de configuração da VM atualizado

    • ZONE: 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.updatemé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 projeto

  • ZONE: a zona que contém a VM

  • VM_NAME: o nome da VM a partir da qual exportar propriedades

  • THREADS_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:

  1. Estabeleça ligação à VM do Linux.

  2. Execute o comando lscpu.

    lscpu
    
  3. 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 linha 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 o número de threads por núcleo em VMs baseadas no Windows, use o seguinte procedimento:

  1. Estabeleça ligação à VM do Windows.

  2. Inicie o Powershell.

  3. Execute o seguinte comando.

    Get-WmiObject -Class Win32_processor | Select-Object NumberOfCores, @{Name="Thread(s) per core";Expression={$_.NumberOfLogicalProcessors/$_.NumberOfCores}}
    
  4. 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 coluna Thread(s) per core.

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

O que se segue?