O número de linhas de execução por núcleo


A multissegmentação simultânea (SMT, na sigla em inglês), conhecida por processadores Intel como Hyper-Threading Technology (HTT), permite que um núcleo de CPU seja executado como duas multilinhas de execução de hardware. No Compute Engine, cada CPU virtual (vCPU, na sigla em inglês) é implementada como uma única multilinha de execução de hardware, e duas vCPUs compartilham cada núcleo de CPU física por padrão.

O Compute Engine permite que você defina manualmente o valor do número de linhas de execução por núcleo. Por exemplo, as cargas de trabalho com as seguintes questões podem se beneficiar da desativação de SMT (configuração do número de linhas de execução por núcleo para 1):

  • Performance Reduzir o número de linhas de execução executadas em cada núcleo de CPU física pode ajudar a melhorar o desempenho de cargas de trabalho altamente paralelas ou que realizam cálculos de pontos flutuantes.

  • Segurança se uma VM executa um código não confiável, reduzir do número de linhas de execução por núcleo pode ajudar a reduzir as vulnerabilidades da CPU, como a amostragem de dados de microarquitetura (em inglês).

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

Para muitas tarefas de computação gerais ou tarefas que exigem muita E/S, o SMT pode aumentar significativamente a capacidade de processamento. Para jobs vinculados à computação em que ambos os núcleos virtuais são vinculados à computação, o SMT pode dificultar o desempenho geral do aplicativo e adicionar variância imprevisível aos jobs. Nesse caso, a desativação do SMT permite um desempenho mais previsível e pode diminuir os tempos de job.

Limitações

  • Não é possível definir o número de linhas de execução por núcleo em VMs para os seguintes tipos de máquina:

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

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

Preços

Você é cobrado pelo número de vCPUs definidas pelo tipo de máquina de uma VM, não pelo número de linhas de execução executadas em cada núcleo. Por exemplo, o tipo de máquina n2-standard-8 pode executar até oito vCPUs, o que é duas vCPUs para cada um dos quatro núcleos da CPU física. Se, com o tipo de máquina n2-standard-8, você decidir executar apenas uma linha de execução por núcleo (efetivamente quatro vCPUs), ainda assim, receberá cobranças pelas oito vCPUs. Para mais informações sobre como você é cobrado pelas VMs, consulte Preços de instâncias de VM.

Alterar o número de linhas de execução por núcleo durante a criação da VM

Para alterar o número de linhas de execução 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 exigidas para a tarefa

Para executar esta tarefa, é preciso ter a permissão a seguir:

Console

Para alterar o número de linhas de execução 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.

    Acesse "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 para proporção de núcleo, escolha o número de linhas de execução por núcleo.

  7. Conclua a definição de outras configurações da VM e clique em Criar.

gcloud

Para alterar o número de linhas de execução por núcleo durante a criação da VM, use o seguinte comando gcloud compute instances create:

Antes de usar os dados do comando abaixo, faça estas substituições:

  • VM_NAME: o nome da nova VM.
  • ZONE: a zona da nova VM.
  • MACHINE_TYPE: tipo de máquina para a nova VM. Precisa ser um tipo de máquina com duas ou mais vCPUs.
  • THREADS_PER_CORE: o número de linhas de execução visíveis 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ê receberá uma resposta semelhante a esta:

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 linhas de execução por núcleo durante a criação da VM, use o método instances.insert com o campo threadsPerCore.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_ID: o ID do projeto;
  • ZONE: a zona da nova VM.
  • MACHINE_TYPE: tipo de máquina para a nova VM. Precisa 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 linhas de execução visíveis 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 da solicitação:

{
  "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 a solicitação, expanda uma destas opções:

Você 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 linhas de execução por núcleo em uma VM

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

Permissões exigidas para a tarefa

Para executar esta tarefa, é preciso ter a permissão a seguir:

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

Console

Para alterar o número de linhas de execução por núcleo em uma VM atual, use o seguinte procedimento do console do Google Cloud:

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

    Acessar instâncias de VM

  2. Clique no Nome da VM.

  3. Se o Status da VM for Em execução, clique em Interromper.

  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 linhas de execução por núcleo.

  7. Clique em Salvar.

gcloud

Para alterar o número de linhas de execução por núcleo em uma VM atual, 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:

    • VM_NAME: o nome da VM da qual as propriedades serão exportadas

    • YAML_FILE_PATH: o caminho e o nome de um arquivo .yaml em que os dados de configuração exportados serão salvos

    • 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 linhas de execução 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:

    • 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.

REST

Para alterar o número de linhas de execução por núcleo em uma VM atual, 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:

  • PROJECT_ID: o ID do projeto

  • ZONE: a zona que contém a VM.

  • VM_NAME: o nome da VM da qual as propriedades serão exportadas

  • THREADS_PER_CORE: o número de linhas de execução por núcleo

O número de linhas de execução por núcleo

Para visualizar o número de linhas de execução por núcleo, use o procedimento correspondente ao SO em execução na VM.

Linux

Para ver o número de linhas de execução por núcleo em VMs baseadas em Linux, use o seguinte procedimento:

  1. Conecte-se à VM do Linux.

  2. Execute o comando lscpu.

    lscpu
    
  3. Analise a saída para ver o número de linhas de execução por núcleo.

    Na amostra de saída a seguir de uma máquina n2-standard-16, o valor para o número de linhas de execução 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 linhas de execução por núcleo em VMs baseadas em Windows, use o seguinte procedimento:

  1. Conecte-se à VM do Windows.

  2. Inicie o PowerShell.

  3. Execute o comando a seguir.

    Get-WmiObject -Class Win32_processor | Select-Object NumberOfCores, @{Name="Thread(s) per core";Expression={$_.NumberOfLogicalProcessors/$_.NumberOfCores}}
    
  4. Analise a saída para ver o número de linhas de execução por núcleo.

    Na amostra de saída a seguir de uma máquina n2-standard-16, o valor para o número de linhas de execução por núcleo é 1, conforme mostrado na coluna Thread(s) per core.

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

A seguir