Defina o número de threads por núcleo


O multithreading simultâneo (SMT), conhecido 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 único multithread de hardware, e duas vCPUs compartilham cada núcleo de CPU física por padrão.

O Compute Engine permite definir manualmente o valor do número de threads por núcleo. Por exemplo, cargas de trabalho com as seguintes preocupações podem se beneficiar com a desativação do SMT (definindo o número de threads por núcleo como 1):

  • Desempenho: reduzir o número de threads executados em cada núcleo físico da CPU pode ajudar a melhorar o desempenho de cargas de trabalho altamente paralelas ou que executam cálculos de ponto flutuante.

  • Segurança: se uma VM executar código não confiável, reduzir o número de threads por núcleo pode ajudar a mitigar vulnerabilidades de CPU, como amostragem de dados microarquitetônicos .

  • Licenciamento: alguns contratos de licenciamento têm requisitos relacionados ao número de vCPUs que você consome. Reduzir o número de threads por núcleo de 2 para 1 pode reduzir os custos de licenciamento. Para obter mais informações, consulte seu contrato de licenciamento.

Para muitas tarefas gerais de computação ou tarefas que exigem muita E/S, o SMT pode aumentar significativamente o rendimento do aplicativo. Para trabalhos vinculados à computação em que ambos os núcleos virtuais estão vinculados à computação, o SMT pode prejudicar o desempenho geral do aplicativo e adicionar variações imprevisíveis aos trabalhos. Neste caso, desligar o SMT permite um desempenho mais previsível e pode diminuir o tempo de trabalho.

Limitações

  • Você não pode definir o número de threads por núcleo em VMs para os seguintes tipos de máquinas:

  • Para instâncias bare metal C3 e X4, o número de hyperthreads aos quais você tem acesso é equivalente ao número de hyperthreads na máquina.

  • No console do Google Cloud, quando o número de threads por núcleo é definido como 1, a métrica de utilização da CPU só pode escalar até um máximo de 50%. Quando o número de threads por núcleo é definido como 2, a métrica de utilização da CPU pode escalar até 100%.

Preços

Você será cobrado pelo número de vCPUs definidas pelo tipo de máquina de uma VM, e não pelo número de threads executados em cada núcleo. Por exemplo, o tipo de máquina n2-standard-8 pode executar até 8 vCPUs, ou seja, 2 vCPUs para cada um dos 4 núcleos físicos da CPU. Se, com o tipo de máquina n2-standard-8 , você decidir executar apenas 1 thread por núcleo (efetivamente 4 vCPUs), você ainda será cobrado por 8 vCPUs. Para obter mais informações sobre como você é cobrado pelas VMs, consulte Preços de instâncias de VM .

Alterar 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 o console do Google Cloud, a CLI gcloud ou a API Compute Engine.

Permissões necessárias para esta tarefa

Para executar esta tarefa, você deve ter as seguintes permissões :

Console

Para alterar o número de threads por núcleo durante a criação da VM, use o seguinte procedimento do console do Google Cloud:

  1. No console do Google Cloud, acesse a página Criar uma instância .

    Vá para Criar uma instância

  2. No campo Nome , insira 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 compatível.

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

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

  7. Conclua a definição de outras configurações para a VM 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 comando 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 da nova VM. Deve ser um tipo de máquina com duas 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

Você deverá 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

DESCANSAR

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 da solicitação, 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 da nova VM. Deve ser um tipo de máquina com duas 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

Solicitar corpo 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 sua solicitação, expanda uma destas opções:

Você deverá receber uma resposta JSON semelhante a esta:

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

Alterar o número de threads por núcleo em uma VM

Para alterar o número de threads por núcleo em uma VM, use o console do Google Cloud, a CLI gcloud ou a API Compute Engine.

Permissões necessárias para esta tarefa

Para executar esta tarefa, você deve ter as seguintes permissões :

  • compute.instances.get no projeto
  • compute.instances.update no projeto

Console

Para alterar o número de threads por núcleo em uma VM existente, use o seguinte procedimento do console do Google Cloud:

  1. No console do Google Cloud, acesse a página de instâncias de VM .

    Acesse as instâncias de VM

  2. Clique no nome da VM.

  3. Se o status da VM for Running , clique em Stop .

  4. Clique em Editar .

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

  6. Na lista suspensa proporção de vCPUs para núcleo , escolha o número de threads por núcleo.

  7. Clique em Salvar .

gcloud

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

  1. Exporte as propriedades da VM usando o seguinte comando gcloud compute instances export :

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

    Substitua o seguinte:

    • VM_NAME : o nome da VM da qual exportar propriedades

    • YAML_FILE_PATH : o caminho e o nome do arquivo .yaml no qual salvar os dados de configuração exportados

    • ZONE : a zona que contém a VM

  2. No arquivo de configuração da VM que foi salvo em FILE_PATH , atualize o valor de threadsPerCore . Se o valor não estiver no arquivo, adicione o seguinte:

    advancedMachineFeatures:
      threadsPerCore: THREADS_PER_CORE
    
  3. Atualize a VM com a nova contagem de threads por núcleo usando o 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 ser atualizada

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

    • ZONE : a zona que contém a VM a ser atualizada

DESCANSAR

Para alterar o número de threads por núcleo em uma VM existente, use o seguinte 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"
  },
  ...
}

Substitua o seguinte:

  • PROJECT_ID : o ID do projeto

  • ZONE : a zona que contém a VM

  • VM_NAME : o nome da VM da qual exportar propriedades

  • THREADS_PER_CORE : o número de threads por núcleo

Veja o número de threads por núcleo

Para visualizar o número de threads por núcleo, use o procedimento que corresponde ao sistema operacional em execução na VM.

Linux

Para visualizar o número de threads por núcleo em VMs baseadas em Linux, use o seguinte procedimento:

  1. Conecte-se à VM Linux .

  2. Execute o comando lscpu .

    lscpu
    
  3. Revise a saída para visualizar o número de threads por núcleo.

    No exemplo de saída a seguir de uma máquina n2-standard-16 , o valor para o 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 visualizar o número de threads por núcleo em VMs baseadas no Windows, use o seguinte procedimento:

  1. Conecte-se à 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. Revise a saída para visualizar o número de threads por núcleo.

    No exemplo de saída a seguir de uma máquina n2-standard-16 , o valor para o 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 vem a seguir