Cloud Run サービスでは、リビジョンのスケーリングが自動的に行われます。すべての受信リクエストを処理できるように、必要なインスタンスの数が調整されます。
リクエストを処理するインスタンスが増えると、CPU とメモリの使用量も増加し、コストも高くなります。
より細かく制御するために、Cloud Run では、インスタンスあたりの最大同時リクエスト数を設定し、1 つのインスタンスで同時に処理可能な最大リクエスト数を指定できます。
インスタンスあたりの最大同時リクエスト数
インスタンスあたりの最大同時リクエスト数を構成できます。デフォルトでは、各 Cloud Run インスタンスは同時に最大 80 件のリクエストを受信できますが、これを 1,000 件まで増やすことができます。
デフォルト値を使用する必要がありますが、必要に応じて最大同時実行数を減らすこともできます。たとえば、コードで並行リクエストを処理できない場合は、同時実行を 1
に設定します。
指定された同時実行の値は最大値であり、インスタンスの CPU の使用率がすでに高い場合、Cloud Run は特定のインスタンスにそれほど多くのリクエストを送信しません。
次の図は、インスタンスの設定あたりの最大同時リクエスト数が、同時実行の受信リクエストの処理に必要なインスタンスの数にどのように影響するかを示しています。
最大同時実行数を 1 つのリクエストに制限する場合
実行中のインスタンスに同時に 1 つのリクエストしか送信されないように、同時実行を制限することもできます。次のような場合には、この設定を検討する必要があります。
- 1 つのリクエストで利用可能な CPU またはメモリのほとんどを使用する場合。
- たとえば、コンテナが 2 つのリクエストを共有できないグローバルな状態に依存している場合。コンテナ イメージは複数のリクエストを同時に処理するように設計されていません。
受信リクエストが急増したときに多くのインスタンスを起動する必要があるため、同時実行を 1
に設定するとスケーリングのパフォーマンスが低下する可能性があります。
事例紹介
次の指標は、インスタンスあたりの同時リクエストの最大数が 1 に設定されている Cloud Run サービスに対して、400 のクライアントが 1 秒あたり 3 件のリクエストを行うユースケースを示しています。上の緑の線は時間の経過に伴うリクエスト数を示し、下の青い線はリクエストの処理を開始したインスタンスの数を示しています。
次の指標は、インスタンスあたりの最大同時実行リクエスト数が 80 に設定された Cloud Run サービスに対して、400 のクライアントが 1 秒あたり 3 件のリクエストを行うユースケースを示しています。上の緑の線は時間の経過に伴うリクエスト数を示し、下の青い線はリクエストの処理を開始したインスタンスの数を示しています。同じリクエスト量を処理するために必要なインスタンスが、はるかに少ないことに注意してください。
ソースコードのデプロイの同時実行
同時実行が有効になっている場合、Cloud Run では、同じインスタンスで処理される同時リクエストを分離することはできません。そのような場合は、コードを同時に安全に実行できるようにする必要があります。別の同時実行値を設定して、これを変更できます。少ない数(8 など)から同時実行を始めて、その数を増やしていくことをおすすめします。同時実行数が多すぎると、リソースの制約(メモリや CPU など)のために意図しない動作につながる可能性があります。
言語ランタイムも同時実行に影響する可能性があります。言語固有の影響の一部は次のとおりです。
Node.js は本質的にシングルスレッドです。同時実行を利用するには、Node.js では慣用的な JavaScript の非同期コードスタイルを使用します。詳しくは、Node.js の公式ドキュメントで非同期フロー制御についてご覧ください。
Python 3.8 以降では、インスタンスあたりの高い同時実行性をサポートするには、同時実行を処理するのに十分なスレッドが必要です。スレッド値が同時実行値(
THREADS=8
など)と等しくなるように、ランタイム環境変数を設定することをおすすめします。
次のステップ
Cloud Run サービスのインスタンスあたりの最大同時リクエスト数を管理するには、インスタンスあたりの最大同時リクエスト数の設定をご覧ください。
インスタンス設定あたりの最大同時リクエスト数を最適化するには、同時実行を調整するための開発のヒントをご覧ください。