Python アプリケーションの並列性の最適化
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2024年04月16日(火)
Table of Contents
受信 HTTP リクエストを並列に処理する Web アプリケーションのほうが、一度に 1 つのリクエストしか処理しない Web アプリケーションよりも効率的に dyno リソースを使用します。本番環境のサービスの開発と実行には、並列リクエスト処理をサポートする Web サーバーを使用することをお勧めします。
Django と Flask の各 Web フレームワークは便利なビルトイン Web サーバーを備えていますが、これらのブロッキングサーバーは一度に 1 つのリクエストしか処理しません。Heroku でこれらのサーバーを使用してデプロイを行うと、dyno リソースの利用効率とアプリケーションの応答性が低下します。
代わりに、WSGI または ASGI アプリケーション向けの高性能 Python HTTP サーバーである Gunicorn または Uvicorn のいずれかを使用することをお勧めします。これらを使用すると、1 つの dyno 内で複数の Python プロセスを実行することにより、任意の Python アプリケーションを並列に実行できます。
Heroku で Gunicorn を Python 用にセットアップする方法については、「Gunicorn を使用した Python アプリケーションのデプロイ」を参照してください。
デフォルト設定と動作
アプリケーションで複数の buildpack を使用している場合、アプリケーションの第一言語の buildpack である Python buildpack が他の言語の buildpack より後に実行されるようにしてください。そうしない場合、Python buildpack の後に実行される buildpack によって設定された値がアプリケーションの WEB_CONCURRENCY
にデフォルト設定される可能性があります。
アプリケーションを起動すると、Heroku Python buildpack は現在の dyno タイプの CPU とメモリの仕様を自動的に検出します。また、次のとおり、WEB_CONCURRENCY
環境変数を適切なデフォルト値に設定します。
Common Runtime
dyno タイプ | デフォルトの WEB_CONCURRENCY |
---|---|
Eco、Basic、Standard-1X | 2 |
Standard-2X | 4 |
Performance-M | 5 |
Performance-L | 17 |
Performance-L-RAM | 9 |
Performance-XL | 17 |
Performance-2XL | 33 |
Private Spaces と Shield Private Spaces
dyno タイプ | デフォルトの WEB_CONCURRENCY |
---|---|
Private-S / Shield-S | 4 |
Private-M / Shield-M | 5 |
Private-L / Shield-L | 17 |
Private-L-RAM / Shield-L-RAM | 9 |
Private-XL / Shield-XL | 17 |
Private-2XL / Shield-2XL | 33 |
Gunicorn と Uvicorn は、どちらも WEB_CONCURRENCY
環境変数で設定された値を自動的に使用して、並列性レベル、つまり上位プロセスが起動する下位プロセスの数を制御します。
アプリが別の Web サーバーを使用する場合は、ワーカーの数として WEB_CONCURRENCY
で設定された値を使用するように構成する必要があります。たとえば、サーバーが --workers
CLI 引数をサポートしている場合は、Procfile
の web
プロセスの下にリストされているサーバーコマンドに --workers $WEB_CONCURRENCY
を追加します。
デフォルトの WEB_CONCURRENCY
値は、各 dyno の起動時に Python buildpack によって dyno 環境に直接設定されるため、アプリの環境設定には表示されません。これにより、アプリの dyno のサイズを変更したり、複数のサイズの dyno を同時に使用したりする場合に、値が自動的に調整されるようになります。
並列性レベルのチューニング
各アプリにはメモリ、CPU、I/O に関する固有の要件があるため、1 つのサイズですべてを満たすスケーリングソリューションはありません。Heroku Python buildpack には、各 dyno タイプに適切なデフォルトの同時実行値が用意されていますが、一部のアプリでは並列性レベルを調整することでメリットが得られます。アプリケーションの調整に関するガイダンスについては、「アプリケーションの負荷テスト」を参照してください。
アプリケーションを実行する下位プロセスの数を手動で設定する場合は、環境設定を設定することによって WEB_CONCURRENCY
環境変数を調整できます。
たとえば、下位プロセスの数を 8 に静的に設定するには、次を使用します。
$ heroku config:set WEB_CONCURRENCY=8
WEB_CONCURRENCY
に固定値を設定する場合は、別の dyno タイプにスケーリングするときに調整して、新しい dyno タイプで使用可能な RAM と CPU の使用を最適化することを忘れないでください。
Django 固有の推奨事項については、「Django での並列性とデータベース接続」を参照してください。