コアあたりのスレッド数を設定する


Intel プロセッサでハイパー スレッディング テクノロジー(HTT)として知られる同時マルチスレッディング(SMT)では、1 つの CPU コアを 2 つのハードウェア マルチスレッドとして実行できます。Compute Engine では、各仮想 CPU(vCPU)は単一のハードウェア マルチスレッドとして実装され、デフォルトで 2 つの vCPU が各物理 CPU コアを共有します。

Compute Engine では、コアあたりのスレッド数を手動で設定できます。たとえば、次のような問題があるワークロードでは、SMT を無効化(コアあたりのスレッド数を 1 に設定)するとメリットが得られる可能性があります。

  • パフォーマンス: 各物理 CPU コアで実行するスレッドの数を減らすことで、高度に並列化されたワークロードや浮動小数点計算を実行するワークロードのパフォーマンスを高めることができます。

  • セキュリティ: VM で信頼できないコードを実行する場合、コアあたりのスレッド数を減らすことで、マイクロアーキテクチャ データ サンプリングなどの CPU の脆弱性が緩和される可能性があります。

  • ライセンス: 一部のライセンス契約には、使用する vCPU の数に関連する要件があります。コアあたりのスレッド数を 2 から 1 に減らすと、ライセンス コストを削減できる可能性があります。詳細については、ライセンス契約をご覧ください。

多くの一般的なコンピューティング タスクや、大量の I/O を必要とするタスクでは、SMT によってアプリケーションのスループットを大幅に向上させることができます。両方の仮想コアがコンピューティング能力による制約を受ける計算依存型ジョブの場合、SMT はアプリケーションの全体的なパフォーマンスを妨げ、ジョブに予測不能なばらつきが発生する場合があります。この場合、SMT をオフにすると、パフォーマンスがより予測可能になり、ジョブの時間を短縮できます。

制限事項

  • 次のマシンタイプの VM では、コアあたりのスレッド数を設定できません。

  • C3 と X4 のベアメタル インスタンスの場合、アクセスできるハイパースレッドの数は、マシン上のハイパースレッドの数と同じです。

  • Google Cloud コンソールでは、コアあたりのスレッド数が 1 に設定されている場合、CPU 使用率の指標は最大 50% までしかスケールアップできません。コアあたりのスレッド数が 2 に設定されている場合、CPU 使用率の指標は最大 100% までスケールアップできます。

料金

各コアで実行されるスレッド数ではなく、VM のマシンタイプによって定義される vCPU の数に対して課金されます。たとえば、n2-standard-8 マシンタイプは最大 8 つの vCPU(4 つの物理 CPU コアごとに 2 つの vCPU)を実行できます。n2-standard-8 マシンタイプを使用して、コアごとに 1 つのスレッド(実質的には 4 個の vCPU)のみを実行することにする場合も、8 個の vCPU に対して課金されます。VM の課金方法の詳細については、VM インスタンスの料金をご覧ください。

VM 作成時にコアあたりのスレッド数を変更する

VM の作成時にコアごとのスレッド数を変更するには、Google Cloud コンソール、gcloud CLI、または Compute Engine API を使用します。

このタスクに必要な権限

このタスクを行うには、次の権限が必要です。

コンソール

VM の作成時にコアあたりのスレッド数を変更するには、次の Google Cloud コンソールの手順を使用します。

  1. Google Cloud コンソールで、[インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [名前] フィールドに、VM の名前を入力します。

  3. VM の [リージョン] と [ゾーン] を選択します。

  4. [マシン ファミリー] とサポートされている [マシンタイプ] を選択します。

  5. [高度な構成] をクリックしてセクションを展開します。

  6. [vCPU とコアの比率] で、コアあたりのスレッド数を選択します。

  7. VM の他の設定の構成を済ませて、[作成] をクリックします。

gcloud

VM の作成時にコアあたりのスレッド数を変更するには、gcloud compute instances create コマンドを使用します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • VM_NAME: 新しい VM の名前。
  • ZONE: 新しい VM のゾーン。
  • MACHINE_TYPE: 新しい VM のマシンタイプ。 2 つ以上の vCPU を持つマシンタイプである必要があります。
  • THREADS_PER_CORE: 物理コアあたりのスレッド数。2 または 1 のいずれかに設定します。

次のコマンドを実行します。

Linux、macOS、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

次のようなレスポンスが返されます。

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

VM の作成時にコアあたりのスレッド数を変更するには、threadsPerCore フィールドで instances.insert メソッドを使用します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクト ID。
  • ZONE: 新しい VM のゾーン。
  • MACHINE_TYPE: 新しい VM のマシンタイプ。 2 つ以上の vCPU を持つマシンタイプである必要があります。
  • VM_NAME: 新しい VM の名前。
  • THREADS_PER_CORE: 物理コアあたりのスレッド数。2 または 1 のいずれかに設定します。

HTTP メソッドと URL:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

リクエストの本文(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"
    }
  ]
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

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

VM のコアあたりのスレッド数を変更する

VM 上のコアあたりのスレッド数を変更するには、Google Cloud コンソール、gcloud CLI、または Compute Engine API を使用します。

このタスクに必要な権限

このタスクを行うには、次の権限が必要です。

  • プロジェクトに対する compute.instances.get
  • プロジェクトに対する compute.instances.update

コンソール

既存の VM のコアあたりのスレッド数を変更するには、次の Google Cloud コンソールの手順を使用します。

  1. Google Cloud コンソールで [VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. VM の [名前] をクリックします。

  3. VM の [ステータス] が [実行中] の場合は、[停止] をクリックします。

  4. [編集] をクリックします。

  5. [高度な構成] をクリックしてセクションを展開します。

  6. [vCPU とコアの比率] プルダウン リストで、コアあたりのスレッド数を選択します。

  7. [保存] をクリックします。

gcloud

既存の VM のコアあたりのスレッド数を変更するには、次の手順を実施します。

  1. 次の gcloud compute instances export コマンドを使用して、VM のプロパティをエクスポートします。

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

    以下を置き換えます。

    • VM_NAME: プロパティをエクスポートする VM の名前

    • YAML_FILE_PATH: エクスポートした構成データを保存する .yaml ファイルのパスとファイル名

    • ZONE: VM が配置されているゾーン

  2. FILE_PATH に保存された VM 構成ファイルで、threadsPerCore の値を更新します。値がファイルに含まれていない場合は、次の行を追加します。

    advancedMachineFeatures:
      threadsPerCore: THREADS_PER_CORE
    
  3. 次の gcloud compute instances update-from-file コマンドを使用して、新しいコアあたりのスレッド数で VM を更新します。

    gcloud compute instances update-from-file VM_NAME \
        --source=FILE_PATH \
        --most-disruptive-allowed-action=RESTART \
        --zone=ZONE
    

    以下を置き換えます。

    • VM_NAME: 更新する VM の名前

    • FILE_PATH: 更新された VM 構成ファイルへのパス。

    • ZONE: 更新する VM が配置されたゾーン

REST

既存の VM のコアあたりのスレッド数を変更するには、次の 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"
  },
  ...
}

以下を置き換えます。

  • PROJECT_ID: プロジェクトの ID

  • ZONE: VM が配置されているゾーン

  • VM_NAME: プロパティをエクスポートする VM の名前

  • THREADS_PER_CORE: コアあたりのスレッド数

コアあたりのスレッド数を表示する

コアあたりのスレッド数を表示するには、VM で実行されている OS に対応する手順を使用します。

Linux

Linux ベースの VM のコアあたりのスレッド数を表示するには、次の手順を使用します。

  1. Linux VM に接続します。

  2. lscpu コマンドを実行します。

    lscpu
    
  3. 出力を調べて、コアあたりのスレッド数を確認します。

    次の n2-standard-16 マシンのサンプル出力では、Thread(s) per core 行に示されているように、コアあたりのスレッド数の値は 1 です。

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

Windows ベースの VM のコアあたりのスレッド数を表示するには、次の手順を使用します。

  1. Windows VM に接続します

  2. PowerShell を起動します。

  3. 次のコマンドを実行します。

    Get-WmiObject -Class Win32_processor | Select-Object NumberOfCores, @{Name="Thread(s) per core";Expression={$_.NumberOfLogicalProcessors/$_.NumberOfCores}}
    
  4. 出力を調べて、コアあたりのスレッド数を確認します。

    次の n2-standard-16 マシンのサンプル出力では、Thread(s) per core 列に示されているように、コアあたりのスレッド数の値は 1 です。

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

次のステップ