ネットワーク帯域幅

Google Cloud では、ネットワーク インターフェース(NIC)や IP アドレスではなく、仮想マシン(VM)インスタンスごとの帯域幅を考慮します。VM のマシンタイプにより、許容される最大下り(外向き)レートが定義されていますが、最大下り(外向き)レートに達するのは特定の状況に限られます。

このページでは、デプロイ計画に役立つ想定値について説明します。帯域幅は、次の 2 つの基準で分類されます。

  • トラフィックの方向: このページの説明も同様ですが、トラフィックの方向は常に Google Cloud VM を基準に考えます。
    • Google Cloud VM から送信されるパケットは下り(外向き)トラフィックになります。
    • Google Cloud VM に送信されたパケットは上り(内向き)トラフィックになります。
  • 宛先 IP アドレスの種類: Google Cloud では IP アドレスを内部または外部のいずれかに分類します。

    • VPC ネットワーク内の IP アドレスは内部 IP アドレスになります。たとえば、各 VM の NIC には VPC ネットワーク内のプライマリ内部 IP アドレスが割り当てられています。内部 IP アドレスは、有効なプライベート IP アドレスまたはプライベートで再利用されるパブリック IP アドレスです。
    • インターネットからアクセス可能な IP アドレスは外部 IP アドレスになります。Google Cloud では、VM の NIC などに外部 IP アドレスが割り当てられています。外部 IP アドレスは常にパブリック IP アドレスになります。Google Cloud の外部にあるインターネット上のパブリック IP アドレスも外部 IP アドレスです。

    正確な定義については、VPC ドキュメントの IP アドレスをご覧ください。たとえば、VPC ネットワーク内でプライベートとしてパブリック IP アドレスを再利用すると、このアドレスは内部 IP アドレスになり、対応する外部 IP アドレスに到達できなくなります。

このページの説明は、Compute Engine VM と、Compute Engine VM に依存するプロダクトを対象としています。たとえば、Google Kubernetes Engine ノードは Compute Engine VM です。

ネットワーク インターフェース(NIC)や NIC ごとの IP アドレスを追加しても、VM の上り(内向き)または下り(外向き)の帯域幅は増加しません。たとえば、2 つの NIC を持つ n1-standard-8 VM では、NIC ごとの下り(外向き)帯域幅ではなく、下り(外向き)帯域幅の合計が 16 Gbps に制限されています。

帯域幅の概要表

次の表に、帯域幅の想定値の概要を示します。

パケットの宛先アドレス
トラフィックの方向 宛先が内部 IP アドレス 宛先が外部 IP アドレス
Google Cloud VM からの
下り(外向き)
  • 許容される下り(外向き)の最大量は、送信側の VM のマシンタイプによって決まります。
  • 許容される最大下り(外向き)レートを実現するには、同じ VPC ネットワークまたは VPC ネットワーク ピアリングで接続している VPC ネットワークで、送信側の VM と同じゾーンにある別の Google Cloud VM の内部 IP アドレスにトラフィックを送信します。
1 つの VM からの下り(外向き)の最大値は、次の上限を超えることはできません。
  • 外部 IP アドレスに対する下り(外向き)フロー全体で 7 Gbps
  • 外部 IP アドレスに対する下り(外向き)フローごとに 3 Gbps
Google Cloud VM への
上り(内向き)
  • マシンタイプ、オペレーティング システム、ネットワーク条件によって制限されます。
  • Google Cloud では、内部 IP アドレスへの上り(内向き)に制限は適用されません。
Google Cloud では、VM の外部 IP アドレスに送信される上り(内向き)トラフィックを制限することで、VM を保護しています。トラフィック量は次のいずれかのレート(最初に到達したほう)で制限されます。
  • 1,800,000 pps(パケット/秒)
  • 20 Gbps

下り(外向き)帯域幅

Google Cloud では、VM およびプロジェクトごとに送信(下り)帯域幅を制限しています。送信帯域幅には、VM のすべての NIC から送信されたトラフィックと、VM に接続している永続ディスクに転送されるすべてのデータが含まれます。

下り(外向き)帯域幅の上限は VM のマシンタイプによって異なります。各マシン ファミリーのマシンタイプの表に、これらの数値が記載されています。たとえば、n2-standard-8 VM には 8 個の vCPU があるので、下り(外向き)帯域幅の上限は 16 Gbps になります。

特定のマシンタイプの下り(外向き)帯域幅は、それぞれのマシン ファミリーのページで確認できます。

許容される下り(外向き)帯域幅の最大量を常に使用できるとは限りません。マシンタイプに加えて、下り(外向き)帯域幅は次のような要因によって影響を受けます。

  • パケットサイズ
  • プロトコルのオーバーヘッド
  • フロー数
  • VM のゲスト OS でのイーサネット ドライバの設定。たとえば、チェックサム オフロード、TCP セグメンテーション オフロード(TSO)など。
  • ネットワークの輻輳
  • パケットの宛先。Google Cloud は、送信パケットの宛先アドレスが内部 IP アドレスか外部 IP アドレスかによって、VM からの下り(外向き)トラフィックの処理が異なります。
  • 永続ディスクが他の下り(外向き)ネットワーク トラフィックと競合する状況では、最大ネットワーク帯域幅の 60% が永続ディスクの書き込みに割り当てられ、残りの 40% が他の下り(外向き)ネットワーク トラフィックに割り当てられます。詳細については、Persistent Disk に関するドキュメントのパフォーマンスに影響するその他の要因をご覧ください。

内部 IP アドレスへの下り(外向き)

送信側の VM からみると、Google Cloud は、送信側の VM のマシンタイプに応じて内部 IP アドレスへの下り(外向き)トラフィックの最大量を制限します。内部 IP アドレスは、VPC ネットワーク、VPC ネットワーク ピアリングで接続している別の VPC ネットワーク、Cloud VPN または Cloud Interconnect 経由で VPC に接続しているネットワークの IP アドレスです。

内部 IP アドレスの送信元と宛先で VM 間のトラフィックを分類し、許容される帯域幅が最も多いものから並べると次のようになります。

  • 同じゾーン内の VM 間
  • 同じリージョンの異なるゾーンの VM 間
  • リージョンとゾーンが異なる VM 間

VM から Cloud VPN トンネルで接続している別の VPC ネットワークの内部 IP アドレスにトラフィックを送信すると、下り(外向き)帯域幅は、Cloud VPN トンネルの最大データレートで制限されます。

複数のトンネルと ECMP ルーティングの帯域幅を最大限活用するには、複数の TCP 接続(一意の 5 タプル)を使用する必要があります。5 タプルは、プロトコル、送信元 IP アドレス、送信元ポート、宛先 IP アドレス、宛先ポートで構成されます。

外部 IP アドレスへの下り(外向き)

送信側の VM からみると、Google Cloud は外部 IP アドレスの宛先に送信されるトラフィックを次のいずれかのレート(最初に到達したほう)で制限します。外部 IP アドレスは、一般公開され、ルーティング可能なアドレスです。Google Cloud リソースの外部 IP アドレスか、インターネット上のアドレスのいずれかになります。

  • パケットフローと接続全体で 7 Gbps
  • フローごとに 3 Gbps(一意の 5 タプルハッシュ)

Google Cloud VM には外部 IP アドレスを関連付けることができます。

  • VM のネットワーク インターフェースに外部 IP アドレスを割り当てることができます。
  • プロトコル転送に使用される外部転送ルールには外部 IP アドレスが必要です。
  • ネットワーク TCP / UDP ロードバランサの転送ルールには外部 IP アドレスを指定する必要があります。
  • 外部 IP アドレスは Cloud NAT ゲートウェイに関連付けられています。

たとえば、n2-standard-16 インスタンスの下り(外向き)帯域幅の上限は 32 Gbps ですが、インターネットへの下り(外向き)帯域幅の合計は 7 Gbps になります。

プロジェクトごとの下り(外向き)の割り当てと上限

Google Cloud はプロジェクトに以下も適用します。

  • 各リージョンのすべての VM から Google Cloud 外部にある外部 IP アドレスへのインターネット下り(外向き)帯域幅の上限: この上限は各リージョンのインターネット下り(外向き)帯域幅の割り当てで定義されます。

  • 特定のリージョンにあるすべての VM から、他のすべての Google Cloud リージョンへの下り(外向き)帯域幅の上限: 内部 IP アドレスと外部 IP アドレスの両方に送信されるトラフィックに適用されます。この上限は内部テレメトリーを使用して計算されますが、ほとんどのプロジェクトでリージョン間の帯域幅が制限されることはありません。必要なリージョン間の帯域幅を確保する方法については、営業チームにお問い合わせください。

上り(内向き)帯域幅

Google Cloud は、パケットの宛先が内部 IP アドレスか外部 IP アドレスかによって、VM への受信トラフィックを異なる方法で処理します。

内部 IP アドレスへの上り(内向き)

Google Cloud では、関連付けられた内部 IP アドレスへの受信トラフィックに制限を設けていません。VM は、マシンタイプ、オペレーティング システム、その他のネットワーク条件やリソースで許容されている範囲内で内部トラフィックを受信できます。関連付けられた内部 IP アドレスは次のいずれかです。

  • VM のネットワーク インターフェースに割り当てられたプライマリ内部 IP アドレス
  • VM のネットワーク インターフェースに割り当てられたエイリアス IP 範囲内のエイリアス IP アドレス
  • 内部プロトコル転送に使用される内部転送ルールの IP アドレス
  • 内部 TCP / UDP ロードバランサの転送ルールの IP アドレス

外部 IP アドレスへの上り(内向き)

Google Cloud は、VM に関連付けられている外部 IP アドレスに送信されるトラフィックを次のいずれかのレート(最初に到達したほう)で制限します。

  • 1 秒あたり 1,800,000 パケット
  • 20 Gbps

この制限において、関連付けられた外部 IP アドレスは次のいずれかです。

  • VM のネットワーク インターフェースに割り当てられた外部 IP アドレス
  • 外部プロトコル転送に使用される外部転送ルールの IP アドレス
  • ネットワーク TCP / UDP ロードバランサの転送ルールの IP アドレス
  • Cloud NAT によって処理される確立済みの受信レスポンス

関連付けられた外部 IP アドレスの最後の 2 つの定義の場合、外部 IP アドレスは複数の VM で共有され、Google Cloud は各バックエンド VM の受信トラフィックを個別に制限します。

受信キューと送信キュー

各 VM NIC には、ネットワークからパケットを処理するいくつかの受信キューと送信キューが割り当てられます。

  • 受信キュー(RX): パケットを受信するキュー。NIC は、ネットワークからパケットを受信すると、受信パケットの記述子をキューから選択し、処理を行い、interrupt により vCPU コアに接続しているパケットキューを介してゲスト OS にパケットを渡します。RX キューがいっぱいで、パケットの配置に利用できるバッファがない場合、パケットは破棄されます。これは通常、選択したパケットキューに接続されている vCPU コアをアプリケーションが過剰に使用している場合に発生することがあります。
  • 送信キュー(TX): パケットを送信するためのキュー。ゲスト OS がパケットを送信すると、記述子が割り当てられて TX キューに配置されます。NIC は記述子を処理し、パケットを送信します。

デフォルト キューの割り当て

明示的に NIC のキュー数を割り当てていない限り、NIC ごとに固定数の RX キューと TX キューを割り当てる Google Cloud のアルゴリズムをモデル化できます。

  1. vCPU の数を NIC の数で割り、残りの値(⌊number of vCPUs/number of NICs⌋)を破棄します。この計算結果は小数ではなく、必ず整数になります。

  2. 計算された数値がゼロの場合は、その数値は無視され、各 NIC に 1 つのキューが割り当られます。

  3. 計算された数が各 NIC の最大キュー数より大きいことを確認します。NIC の最大キュー数はドライバの種類によって異なります。

    • virtIO またはカスタム ドライバを使用する場合、NIC あたりの最大キュー数は 32 になります。計算された数値が 32 より大きい場合: 計算結果の数値は無視され、それぞれの NIC に 32 個のキューが割り当てられます。
    • gvNIC を使用する場合、NIC あたりのキューの最大数は 16 です。計算された数値が 16 より大きい場合: 計算された数値が無視され、それぞれに NIC 16 バイトが割り当てられます。

次のような例が挙げられます。

  • VM に 8 つの vCPU と 3 つの NIC がある場合、計算式は ⌊8/3⌋ = 2 になります。ドライバに関係なく、Google Cloud はそれぞれの NIC に 2 つのキューを割り当てます。

  • VM に 96 個の vCPU と 2 つの NIC が搭載されている場合、計算式は ⌊96/2⌋ = 48 になります。48 は NIC ごとのキューの最大数を超えているため、Google Cloud では、NIC あたりの最大数に到達するまで、NIC ごとに最大数を割り当てます。これは、ドライバによって異なります。VM で virtIO ドライバを使用する場合、Google Cloud は NIC ごとに 32 キューを割り当てます。VM が gvNIC ドライバを使用している場合、Google Cloud は NIC ごとに 16 キューを割り当てます。

Linux システムでは、ethtool を使用して、Google Cloud によって NIC ごとに割り当てられるキューの数より少ない NIC を構成できます。

カスタムキューの割り当て

デフォルトのキュー割り当ての代わりに、Compute Engine API を使用して新しい VM を作成するときに、各 NIC にカスタムキュー数(RX と TX の合計)を割り当てることができます。

指定するカスタムキューの数は、次のルールに従う必要があります。

  • NIC ごとに割り当て可能な最小キュー数は 1 です。

  • NIC ごとに割り当て可能な最大キュー数は、ドライバタイプによって異なります。

    • virtIO またはカスタム ドライバを使用する場合、最大キュー数は 32 です。
    • gvNIC を使用する場合、最大キュー数は 16 です。
  • カスタムキューの数を VM のすべての NIC に割り当てる場合、キューの数の割り当ての合計は、VM インスタンスに割り当てられた vCPU の数以下である必要があります。

次のような例が挙げられます。

  • VM に 8 つの vCPU と 3 つの NIC がある場合、1 つのキューを nic0、4 つのキューを nic1、3 つのキューを nic2 に割り当てることができます。この例では、その後に 4 つのキューを nic2 に割り当てても、他の 2 つの NIC キューの割り当ては維持されません。割り当てられたキューの合計が vCPU の数(8 つ)を超えることはないためです。

  • VM に 96 個の vCPU と 2 つの NIC があるときに、virtIO ドライバを使用すると、それぞれの NIC に最大 32 個のキューを割り当てることができます。また、gvNIC ドライバを使用する場合は、それぞれに最大 16 個のキューが割り当てられます。この例では、割り当てられているキューの合計は常に vCPU の数より少なくなります。

また、一部の NIC にのみカスタムキュー数を割り当てて、Google Cloud が残りの NIC にキューを割り当てることもできます。NIC ごとに割り当て可能なキューの数には、引き続き上記のルールが適用されます。構成の実現可能性をモデル化できます。構成が可能な場合は、このプロセスで Google Cloud が残りの NIC に割り当てるキューの数も設定できます。

  1. カスタムキューの割り当てを使用して、NIC のキューの合計を計算します。20 個の vCPU と 6 個の NIC を持つ VM の例では、nic0 に 5 つのキュー、nic1 に 6 つのキュー、nic2 に 4 つのキューを割り当て、Google Cloud で nic3nic4nic5 のキューを割り当てるとします。この例では、カスタム割り当てキューの合計は 5+6+4 = 15 になります。

  2. vCPU の数からカスタム割り当てキューの合計を引きます。この差が、Google Cloud がキューを割り当てる残りの NIC の数と一致していない場合、Google Cloud はエラーを返します。20 個の vCPU と合計 15 のカスタム割り当てキューという VM の例では、Google Cloud で残りの NIC (nic3nic4nic5)に割り当てる 20-15 = 5 キューが残っています。

  3. 前の手順との整合性を取るため、この差を前の手順で残った NIC の数で割り、余りの ⌊(number of vCPUs - sum of assigned queues)/(number of remaining NICs)⌋ を破棄します。この計算の結果は常に小数ではなく、整数になります。Google Cloud は、計算した数が NIC ごとの最大キュー数を超えない限り、計算した数に一致する数を残りの NIC に割り当てます。NIC の最大キュー数はドライバの種類によって異なります。

    • virtIO またはカスタム ドライバを使用して、残りの NIC ごとに計算されたキューの数が 32 より大きい場合、Google Cloud は残りの NIC のそれぞれに 32 キューを割り当てます。
    • gvNIC を使用して、残りの NIC ごとに計算されたキューの数が 16 より大きい場合、Google Cloud は残りの NIC のそれぞれに 16 キューを割り当てます。

API

NIC に特定のキュー数を持つ VM を作成します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
  "name": "VM_NAME",
  "machineType": "machineTypes/MACHINE_TYPE"
  "networkInterfaces": [
      {
        "network": string,
        "subnetwork": string,
        "networkIP": string,
        "name": string,
        "queueCount": "QUEUE_SIZE",
        ....
      ],
      } ],
 }

次のように置き換えます。

  • PROJECT_ID: VM を作成するプロジェクトの ID
  • ZONE: VM を作成するゾーン
  • MACHINE_TYPE: 新しい VM のマシンタイプ(事前定義またはカスタム
  • VM_NAME: 新しい VM の名前
  • QUEUE_SIZE: このセクションで説明するルールが適用される NIC のキュー数。

キューの割り当てとマシンタイプの変更

VM インスタンスを停止してマシンタイプを変更し、新しいマシンタイプの vCPU の数が変更前と異なる場合、Google Cloud の NIC ごとのキューの割り当ては変更されません。デフォルトまたはカスタム NIC キューの割り当ては、VM を作成する場合にのみ設定されます。ただし、vCPU の数が少なくなると、キューの数も少なくなるため、一部のキューは NIC から削除できます。

次のステップ