ゾーンバケットの gcloud CLI のパフォーマンスを調整する

Google Cloud CLI を使用して Rapid Bucket のゾーンバケットからオブジェクトを読み取ると、CLI は使用可能なシステム リソースに基づいてデフォルトの同時実行とスライス構成を自動的に適用します。

このドキュメントでは、これらのデフォルト構成について説明し、同時実行、プロセス スケーリング、NIC 分離などのオプトイン機能を構成して、特定のワークロードの gcloud CLI のパフォーマンスを調整する方法について説明します。

パフォーマンス設定を調整する前に、ゾーンバケットを作成する必要があります。Hyperdisk やローカル SSD などのアタッチされたストレージ ボリュームにオブジェクトをダウンロードする場合は、環境でボリュームをフォーマットしてマウントします。gcloud CLI を使用する代わりに、ゾーンバケットをファイル システムとしてマウントする場合は、Rapid Bucket の Cloud Storage FUSE のパフォーマンスをご覧ください。一般的なスライス コンセプトについては、スライスされたオブジェクトのダウンロードをご覧ください。

デフォルトの同時実行とスライス構成

このセクションで説明するデフォルト構成は、gcloud CLI バージョン 583.0.0 以降を使用して Rapid Bucket のゾーンバケットからオブジェクトを読み取る場合にのみ適用されます。標準の Cloud Storage バケットの場合、gcloud CLI は独自のデフォルトの同時実行設定を適用します。

ゾーン バケットの場合、gcloud CLI は、使用可能な仮想 CPU(vCPU)コアの数と、単一のオブジェクトをダウンロードするか複数のオブジェクトをダウンロードするかに基づいて、デフォルトの同時実行パラメータとスライス パラメータを自動的に設定します。これらのデフォルトでは、次のプロパティが構成されます。

以降のセクションでは、単一オブジェクトと複数オブジェクトのダウンロードのデフォルト値を示します。

単一オブジェクトのダウンロード

単一のオブジェクトをダウンロードすると、gcloud CLI は次のデフォルト値を適用します。

利用可能な vCPU 数 プロセス数 スレッド数 スライシングのしきい値 最大コンポーネント数 コンポーネントのサイズ
≥ 8 8 2 50 MiB 16 5 MiB
< 8 4 2 50 MiB 8 5 MiB

マルチ オブジェクトのダウンロード

複数のオブジェクトを同時にダウンロードする場合、gcloud CLI は次のデフォルト値を適用します。

利用可能な vCPU 数 プロセス数 スレッド数 スライシングのしきい値 最大コンポーネント数 コンポーネントのサイズ
≥ 48 min(96, available_cores * 0.75) 1 10 MiB 5 5 MiB
4 to 47 16 4 10 MiB 10 5 MiB
< 4 2 10 50 MiB 10 5 MiB

同時実行とスライシングのプロパティを構成する

カスタム チューニング設定を構成して適用するには、次の操作を行います。

  1. Google Cloud CLI をバージョン 583.0.0 以降にインストールまたは更新します。

  2. 開発環境で、gcloud config configurations create コマンドを実行して、構成プロファイルを作成して有効にします。

    gcloud config configurations create CONFIGURATION_NAME

    CONFIGURATION_NAME は、構成プロファイルの名前(rapid-perf など)に置き換えます。

  3. gcloud config set コマンドを実行して、同時実行とスライシングのプロパティを構成します。

    gcloud config set storage/thread_count THREAD_COUNT
    gcloud config set storage/process_count PROCESS_COUNT
    gcloud config set storage/sliced_object_download_threshold THRESHOLD_SIZE
    gcloud config set storage/sliced_object_download_component_size COMPONENT_SIZE
    gcloud config set storage/sliced_object_download_max_components MAX_COMPONENTS

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

    • THREAD_COUNT: ワーカー プロセスあたりのスレッド数(1 など)。
    • PROCESS_COUNT: ワーカー プロセスの数(64 など)。
    • THRESHOLD_SIZE: スライスをトリガーする最小オブジェクト サイズのしきい値(マルチギガバイト ワークロードの場合は 128 MiB、小さいオブジェクトの場合は 32 MiB など)。
    • COMPONENT_SIZE: 各ダウンロード スライスのターゲット サイズ(マルチギガバイトのワークロードの場合は 128 MiB、小さいオブジェクトの場合は 32 MiB など)。
    • MAX_COMPONENTS: オブジェクトあたりのスライス コンポーネントの最大数(16 など)。

    これらのプロパティの詳細については、チューニングの推奨事項をご覧ください。

  4. オブジェクトをローカル ストレージ パスにダウンロードするには、gcloud storage cp コマンドを実行します。

    gcloud storage cp -r gs://BUCKET_NAME/SOURCE_PATH LOCAL_DESTINATION_PATH

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

    • BUCKET_NAME: ゾーンバケットの名前。
    • SOURCE_PATH: バケット内のソース ディレクトリまたはオブジェクト パス。
    • LOCAL_DESTINATION_PATH: ローカル ディレクトリ パス(./data/ など)またはローカル ストレージ ボリュームのマウント ポイント(/mnt/hyperdisk/data/ など)。

チューニングに関する推奨事項

次の推奨事項を使用して、ワークロードの同時実行、スライス、システム リソースを調整します。

プロセス数

使用可能な CPU コアに基づいて並列ワーカー プロセスをスケーリングするには、storage/process_count プロパティを設定します。プロセス数を使用可能な CPU コアの最大 80% に制限します。

storage/process_count = min(target_cores, 0.8 * available_cores)

ここで

  • target_cores: 転送に割り当てる CPU コアまたはワーカー プロセスの数(64 など)。
  • available_cores: マシンで使用可能な仮想 CPU(vCPU)の合計数(たとえば、Linux で nproc を実行して取得します)。

たとえば、80 個以上の vCPU を備えたマシンで 64 個のワーカー プロセスをターゲットにする場合は、storage/process_count64 に設定します。vCPU が 80 個未満のマシンでは、storage/process_count を使用可能な vCPU の 80% に設定します(たとえば、64 個の vCPU を備えた VM では 51)。

スレッド数

storage/thread_count プロパティを設定して、ワーカー プロセスあたりのスレッド数を制御します。vCPU が 48 個以上のマシンでは、storage/thread_count1 に設定します。

各ワーカー プロセスを 48 個以上の vCPU を搭載したマシンの単一スレッドに制限すると、Python グローバル インタープリタ ロック(GIL)と gRPC スレッドの競合が軽減されます。

スライシングのしきい値

storage/sliced_object_download_threshold プロパティを設定して、スライスされたダウンロードをトリガーするために必要な最小オブジェクト サイズを指定します。

storage/sliced_object_download_thresholdstorage/sliced_object_download_component_size 以上の値に設定することをおすすめします。

オブジェクトあたりのスライス数

storage/sliced_object_download_component_size プロパティと storage/sliced_object_download_max_components プロパティを設定して、オブジェクトごとに生成される並列スライスの数を制御します。gcloud CLI は、次の式を使用してオブジェクトあたりのスライスを計算します。

Slices per object = min(object_size / component_size, max_components)

オブジェクトが component_size 値でスライスすると max_components 値を超えるほど大きい場合、gcloud CLI は component_size 値を無視し、オブジェクトを max_components スライスに均等に分割します。たとえば、component_size=128 MiBmax_components=16 を使用して 100 GiB のオブジェクトをダウンロードすると、それぞれ 6.25 GiB の 16 個のスライスが生成されます。

gcloud CLI は、合計ワーカー容量(storage/process_count × storage/thread_count)に基づいて、各スライスを個別に並行してダウンロードします。

ワーカーの飽和

転送全体でワーカーの使用率を高く維持するには、プロセス数、スレッド数、コンポーネント サイズ、最大コンポーネント数を調整する必要があります。これらの調整により、一般的な転送で、ワーカーの合計容量以上の合計スライスが生成されます。

Total slices across all objects >= storage/process_count * storage/thread_count

たとえば、64 個のワーカー プロセス(process_count=64thread_count=1)を使用して 4 つのオブジェクトをダウンロードすることを考えてみましょう。

  • 4 つの 2 GiB オブジェクト: component_size=128 MiB を設定すると、オブジェクトごとに 16 個のスライスが生成されます(4 × 16 = 64 個のスライス)。これにより、64 個のワーカー プロセスがすべて完全に活用されます。
  • 4 つの 512 MiB オブジェクト: component_size=32 MiB を設定すると、オブジェクトごとに 16 個のスライス(4 × 16 = 64 個のスライス)が生成され、64 個のワーカー プロセスがすべて完全に使用されます。一方、512 MiB オブジェクトで component_size=128 MiB を使用すると、オブジェクトあたり 4 スライス(合計 16 スライス)のみが生成され、48 個のワーカー プロセスがアイドル状態になります。

NIC の分離

16 個を超える CPU コアを持つ Linux マシンでは、storage/use_nic_isolation プロパティTrue に設定することで、ネットワーク インターフェース カード(NIC)の分離を有効にできます。

gcloud config set storage/use_nic_isolation True

このプロパティを有効にすると、gcloud CLI は CPU アフィニティ(os.sched_setaffinity())を設定します。この構成では、CPU コアの 10% がネットワーク ハードウェア割り込みリクエスト(IRQ)用に分離され、残りのコアがデータ処理用に予約されます。

次のステップ