目次
Gunicorn ワーカー タイプ
スレッド コンテキスト スイッチのタイムアウトを変更すると、サービスの遅延とスループットに影響しますか? ################## ############確かに。ただし、大部分のワークロードにとって、これはゲームチェンジャーではありません。 " >スレッド コンテキスト スイッチのタイムアウトを変更すると、サービスの遅延とスループットに影響しますか? ################## ############確かに。ただし、大部分のワークロードにとって、これはゲームチェンジャーではありません。
ホームページ バックエンド開発 Python チュートリアル Gunicorn と Python GIL を 1 つの記事で理解する

Gunicorn と Python GIL を 1 つの記事で理解する

Apr 12, 2023 am 10:40 AM
python gunicorn

Gunicorn と Python GIL を 1 つの記事で理解する

Python GIL とは何か、その仕組み、Gunicorn への影響。

本番環境ではどの Gunicorn ワーカー タイプを選択すればよいですか?

Python には、1 つのスレッドの実行 (つまり、バイトコードの解釈) のみを許可するグローバル ロック (GIL) があります。私の意見では、Python サービスを最適化したい場合は、Python が同時実行性をどのように処理するかを理解することが不可欠です。

Python と gunicorn では同時実行を処理するためのさまざまな方法が提供されますが、すべてのユースケースをカバーする特効薬はないため、オプション、トレードオフ、および各オプションの利点を理解することをお勧めします。

Gunicorn ワーカー タイプ

Gunicorn は、「ワーカー タイプ」の概念の下でこれらのさまざまなオプションを公開します。各タイプは、特定の一連のユースケースに適しています。

    #sync
  • ——プロセスを並行して実行される N 個のプロセスにフォークしてリクエストを処理します。
  • gthread
  • ——N 個のスレッドを生成して、リクエストを同時に処理します。
  • eventlet/gevent - 同時リクエストを処理するために緑色のスレッドを生成します。
Gunicorn 同期ワーカー

これは、リクエストを並行して処理する N プロセスをフォークすることだけが同時実行オプションである最も単純なタイプのジョブです。

これらはうまく機能しますが、多くのオーバーヘッド (メモリや CPU コンテキストの切り替えなど) が発生し、リクエスト時間のほとんどが I/O 待機にかかる場合、セックスのスケーリングが必要になります。悪い。

Gunicorn gthread worker

gthread Worker は、プロセスごとに N 個のスレッドを作成できるようにすることで、これを改善しています。これにより、コードのより多くのインスタンスを同時に実行できるため、I/O パフォーマンスが向上します。これは、GIL の影響を受ける 4 つのうちの唯一の 1 つです。

Gunicorn イベントレットおよび gevent ワーカー

eventlet/gevent ワーカーは、軽量のユーザー スレッド (別名グリーン スレッド、グリーンレットなど) を実行することで、gthread モデルをさらに改善しようとします。

#これにより、システム スレッドと比較して非常に少ないコストで数千のグリーンレットを作成できるようになります。 もう 1 つの違いは、プリエンプティブな作業モデルではなく共同作業モデルに従っており、ブロックされるまで作業が中断されないことです。まず、リクエストを処理するときの gthread ワーカー スレッドの動作と、それが GIL によってどのような影響を受けるかを分析します。

各リクエストが 1 つのプロセスによって直接処理される同期とは異なり、gthread では、複数のプロセスにコストを発生させることなく、各プロセスに N 個のスレッドがあり、より適切に拡張できます。同じプロセス内で複数のスレッドを実行しているため、GIL によってそれらのスレッドが並行して実行されなくなります。

GIL はプロセスまたは特別なスレッドではありません。これは単なるブール変数であり、そのアクセスはミューテックスによって保護されており、各プロセス内で 1 つのスレッドのみが実行されることが保証されます。それがどのように機能するかは上の写真で見ることができます。この例では、2 つのシステム スレッドが同時に実行されており、各スレッドが 1 つのリクエストを処理していることがわかります。プロセスは次のようになります。

    スレッド A は GIL を保持し、リクエストの処理を開始します。
  • しばらくすると、スレッド B がリクエストを処理しようとしますが、GIL を保持できません。
  • B タイムアウトに達する前に GIL が解放されない場合は、タイムアウトを設定して強制的に GIL を解放します。
  • #A GIL はタイムアウトに達するまで解放されません。
  • B は、gil_drop_request フラグを設定して、A に GIL を直ちに解放するよう強制します。
  • A は、GIL を解放し、別のスレッドが GIL を取得するまで待機します。これは、他のスレッドが GIL を取得できないまま A が GIL の解放と取得を続ける状況を回避します。
  • B 走り始めます。
  • B I/O をブロックしながら GIL を解放します。
  • #A が実行を開始します。
  • B 再度実行しようとしましたが、中断されました。
  • A はタイムアウトに達する前に完了します。
  • B 実行が完了しました。
  • 同じシナリオですが、gevent を使用します

Gunicorn と Python GIL を 1 つの記事で理解するプロセスを使用せずに同時実行性を高めるもう 1 つのオプションは、グリーンレットを使用することです。このワーカーは、同時実行性を高めるために、「システム スレッド」の代わりに「ユーザー スレッド」を生成します。

これは、それらが GIL の影響を受けないことを意味しますが、CPU によって並列にスケジュールできないため、依然として並列処理を増やすことができないことも意味します。

  • Greenlet A は、I/O イベントが発生するか実行が完了するまで実行を開始します。
  • グリーンレット B は、グリーンレット A がイベント ループを解放するまで待機します。
  • #Aは終わりました。
  • Bスタート。
  • B はイベント ループを解放して I/O を待機します。
  • Bが完了しました。

このケースでは、グリーンレット タイプのワーカーを雇うことが理想的ではないことは明らかです。結局、2 番目のリクエストは最初のリクエストが完了するまで待機し、その後再び I/O を待機することになります。

これらのシナリオでは、コンテキストの切り替えに時間を無駄にせず、複数のシステム スレッドを実行するオーバーヘッドを回避できるため、greenlet コラボレーション モデルが真価を発揮します。

この記事の最後にあるベンチマーク テストでこれを確認します。 ここで次の疑問が生じます:

    スレッド コンテキスト スイッチのタイムアウトを変更すると、サービスの遅延とスループットに影響しますか?
  • I/O と CPU の作業を混在させる場合に、gevent/eventlet と gthread のどちらを選択するかを選択する方法。
  • gthread ワーカーを使用してスレッド数を選択する方法。
  • GIL を回避するには、同期ワーカーを使用してフォークされたプロセスの数を増やすだけでよいでしょうか?
これらの質問に答えるには、監視して必要なメトリクスを収集し、それらの同じメトリクスに対して調整されたベンチマークを実行する必要があります。実際の使用パターンとの相関関係がゼロの合成ベンチマークを実行しても意味がありません。以下のグラフは、さまざまなシナリオのレイテンシーとスループットのメトリクスを示しており、すべてがどのように連携して機能するかを示しています。

GIL 切り替え間隔のベンチマーク

ここでは、GIL スレッド切り替え間隔/タイムアウトの変更がリクエストのレイテンシーにどのような影響を与えるかを確認できます。予想通り、スイッチング間隔が短くなるにつれて IO レイテンシーは改善されます。これは、CPU バウンドのスレッドがより頻繁に GIL を解放し、他のスレッドが作業を完了できるようにするために発生します。 Gunicorn と Python GIL を 1 つの記事で理解する

しかし、これは万能薬ではありません。切り替え間隔を短縮すると、CPU バウンドのスレッドが完了するまでにかかる時間が長くなります。また、スレッドの定期的な切り替えによるオーバーヘッドの増加により、全体的なレイテンシが増加し、タイムアウトが減少していることもわかります。自分で試してみたい場合は、次のコードを使用して切り替え間隔を変更できます。

Gunicorn と Python GIL を 1 つの記事で理解する

CPU バウンド リクエストを使用した gthread と gevent レイテンシのベンチマーク

Gunicorn と Python GIL を 1 つの記事で理解する

全体として、ベンチマークは、GIL バインドされたスレッドとグリーンレットがどのように機能するかに関する以前の分析からの直感を反映していることがわかります。

Gthread では、切り替え間隔によって長時間実行されているスレッドが強制的に解放されるため、IO バウンド リクエストの平均レイテンシーが向上します。

gevent CPU バウンドのリクエストは、他のリクエストの処理が中断されないため、gthread よりも待ち時間が長くなります。

CPU バウンド リクエストを使用した gthread と gevent のスループットのベンチマーク

Gunicorn と Python GIL を 1 つの記事で理解する

ここでの結果には、gevent と gthread の以前の比較も反映されています。スループット。これらのベンチマークは、実行される作業の種類に大きく依存しており、必ずしもユースケースに直接反映されるとは限りません。

これらのベンチマークの主な目的は、リクエストに対応する各 CPU コアを最大限に活用するために何をテストし、測定すべきかについてのガイダンスを提供することです。

すべての Gunicorn ワーカーでは実行するプロセスの数を指定できるため、変更されるのは各プロセスが同時接続を処理する方法です。したがって、テストを公平にするために、必ず同じ数のワーカーを使用してください。ここで、ベンチマークから収集したデータを使用して、前の質問に答えてみましょう。

スレッド コンテキスト スイッチのタイムアウトを変更すると、サービスの遅延とスループットに影響しますか? ################## ############確かに。ただし、大部分のワークロードにとって、これはゲームチェンジャーではありません。

I/O と CPU の作業を混在させる場合、gevent/eventlet と gthread のどちらを選択すればよいでしょうか?ご覧のとおり、ghtread は、CPU をより集中的に使用する作業がある場合に、より優れた同時実行性を実現する傾向があります。 gthread ワーカーのスレッド数を選択するにはどうすればよいですか?

ベンチマークが運用環境のような動作をシミュレートできる限り、明らかにピークパフォーマンスが確認されますが、その後、スレッドが多すぎるためにパフォーマンスが低下し始めます。

GIL を回避するには、同期ワーカーを使用し、フォークされたプロセスの数を増やすだけでよいでしょうか?

I/O がほぼゼロでない限り、プロセスのみでスケーリングすることは最良の選択肢ではありません。

結論

コルーチン/グリーンレットは、スレッド間の割り込みやコンテキストの切り替えを回避するため、CPU 効率を向上させることができます。コルーチンは、スループットと引き換えにレイテンシを実現します。

IO エンドポイントと CPU バウンドのエンドポイントを混在させると、コルーチンによってさらに予測不能なレイテンシーが発生する可能性があります。CPU バウンドのエンドポイントは、他の受信リクエストの処理を中断されません。時間をかけて gunicorn を正しく設定すれば、GIL は問題になりません。

以上がGunicorn と Python GIL を 1 つの記事で理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Debian Apacheログを使用してWebサイトのパフォーマンスを向上させる方法 Debian Apacheログを使用してWebサイトのパフォーマンスを向上させる方法 Apr 12, 2025 pm 11:36 PM

この記事では、Debianシステムの下でApacheログを分析することにより、Webサイトのパフォーマンスを改善する方法について説明します。 1.ログ分析の基本Apacheログは、IPアドレス、タイムスタンプ、リクエストURL、HTTPメソッド、応答コードなど、すべてのHTTP要求の詳細情報を記録します。 Debian Systemsでは、これらのログは通常、/var/log/apache2/access.logおよび/var/log/apache2/error.logディレクトリにあります。ログ構造を理解することは、効果的な分析の最初のステップです。 2。ログ分析ツールさまざまなツールを使用してApacheログを分析できます。コマンドラインツール:GREP、AWK、SED、およびその他のコマンドラインツール。

Python:ゲーム、GUIなど Python:ゲーム、GUIなど Apr 13, 2025 am 12:14 AM

PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

DDOS攻撃検出におけるDebianスニファーの役割 DDOS攻撃検出におけるDebianスニファーの役割 Apr 12, 2025 pm 10:42 PM

この記事では、DDOS攻撃検出方法について説明します。 「DebiansNiffer」の直接的なアプリケーションのケースは見つかりませんでしたが、次の方法はDDOS攻撃検出に使用できます:効果的なDDOS攻撃検出技術:トラフィック分析に基づく検出:突然のトラフィックの成長、特定のポートの接続の急増などのネットワークトラフィックの異常なパターンの識別。たとえば、PysharkライブラリとColoramaライブラリと組み合わせたPythonスクリプトは、ネットワークトラフィックをリアルタイムで監視し、アラートを発行できます。統計分析に基づく検出:データなどのネットワークトラフィックの統計的特性を分析することにより

Debian Readdirが他のツールと統合する方法 Debian Readdirが他のツールと統合する方法 Apr 13, 2025 am 09:42 AM

DebianシステムのReadDir関数は、ディレクトリコンテンツの読み取りに使用されるシステムコールであり、Cプログラミングでよく使用されます。この記事では、ReadDirを他のツールと統合して機能を強化する方法について説明します。方法1:C言語プログラムを最初にパイプラインと組み合わせて、cプログラムを作成してreaddir関数を呼び出して結果をinclude#include#include inctargc、char*argv []){dir*dir; structdireant*entry; if(argc!= 2){(argc!= 2){

Nginx SSL証明書更新Debianチュートリアル Nginx SSL証明書更新Debianチュートリアル Apr 13, 2025 am 07:21 AM

この記事では、DebianシステムでNGINXSSL証明書を更新する方法について説明します。ステップ1:最初にCERTBOTをインストールして、システムがCERTBOTおよびPython3-Certbot-Nginxパッケージがインストールされていることを確認してください。インストールされていない場合は、次のコマンドを実行してください。sudoapt-getupdatesudoapt-getinstolcallcertbotthon3-certbot-nginxステップ2:certbotコマンドを取得して構成してlet'sencrypt証明書を取得し、let'sencryptコマンドを取得し、nginx:sudocertbot - nginxを構成します。

Pythonと時間:勉強時間を最大限に活用する Pythonと時間:勉強時間を最大限に活用する Apr 14, 2025 am 12:02 AM

限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

debian opensslでHTTPSサーバーを構成する方法 debian opensslでHTTPSサーバーを構成する方法 Apr 13, 2025 am 11:03 AM

DebianシステムでHTTPSサーバーの構成には、必要なソフトウェアのインストール、SSL証明書の生成、SSL証明書を使用するWebサーバー(ApacheやNginxなど)の構成など、いくつかのステップが含まれます。 Apachewebサーバーを使用していると仮定して、基本的なガイドです。 1.最初に必要なソフトウェアをインストールし、システムが最新であることを確認し、ApacheとOpenSSL:sudoaptupdatesudoaptupgraysudoaptinstaをインストールしてください

See all articles