Gunicorn と Python GIL を 1 つの記事で理解する
Python GIL とは何か、その仕組み、Gunicorn への影響。
本番環境ではどの Gunicorn ワーカー タイプを選択すればよいですか?
Python には、1 つのスレッドの実行 (つまり、バイトコードの解釈) のみを許可するグローバル ロック (GIL) があります。私の意見では、Python サービスを最適化したい場合は、Python が同時実行性をどのように処理するかを理解することが不可欠です。
Python と gunicorn では同時実行を処理するためのさまざまな方法が提供されますが、すべてのユースケースをカバーする特効薬はないため、オプション、トレードオフ、および各オプションの利点を理解することをお勧めします。
Gunicorn ワーカー タイプ
Gunicorn は、「ワーカー タイプ」の概念の下でこれらのさまざまなオプションを公開します。各タイプは、特定の一連のユースケースに適しています。
- #sync
- ——プロセスを並行して実行される N 個のプロセスにフォークしてリクエストを処理します。 gthread
- ——N 個のスレッドを生成して、リクエストを同時に処理します。 eventlet/gevent - 同時リクエストを処理するために緑色のスレッドを生成します。
これは、リクエストを並行して処理する N プロセスをフォークすることだけが同時実行オプションである最も単純なタイプのジョブです。
これらはうまく機能しますが、多くのオーバーヘッド (メモリや CPU コンテキストの切り替えなど) が発生し、リクエスト時間のほとんどが I/O 待機にかかる場合、セックスのスケーリングが必要になります。悪い。
Gunicorn gthread workergthread 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 を使用します
プロセスを使用せずに同時実行性を高めるもう 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 スレッド切り替え間隔/タイムアウトの変更がリクエストのレイテンシーにどのような影響を与えるかを確認できます。予想通り、スイッチング間隔が短くなるにつれて IO レイテンシーは改善されます。これは、CPU バウンドのスレッドがより頻繁に GIL を解放し、他のスレッドが作業を完了できるようにするために発生します。
CPU バウンド リクエストを使用した gthread と gevent レイテンシのベンチマーク
ここでの結果には、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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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