web-dev-qa-db-ja.com

トルネードvs wsgi(gunicorn付き)

私は this を読んでトルネードについて:

一方、すでにWSGIアプリがあり、非常に高速なtornado.httpserver.HTTPServerで実行したい場合は、tornado.wsgi.WSGIContainerでラップします。しかし、注意する必要があります。元のアプリケーションは非同期サーバー用に準備されておらず、大量のIO /計算を行うため、応答の生成中に他の要求をブロックします(さらに要求は受け入れられ、バッファーに入れられますが、後で処理するためにキューに入れられます)。

そしてギンコーンは言う:

'a Python WSGI HTTP Server for UNIX。これは、RubyのUnicornプロジェクトから移植されたpre-forkワーカーモデルです。

  1. では、Gunicornはリクエストを処理するワーカープロセスを生成しますか?
  2. ワーカーごとに1つの同意リクエスト?
  3. トルネードはepollまたはkqueueを使用して1つのプロセス(マスター/ワーカープロセスなし)で作業を行いますか?
  4. したがって、ハンドラのget/post関数でrequests.getのようなブロッキング呼び出しを使用すると、すべてのリクエスト処理がブロックされるか、現在処理されているリクエストのみがブロックされますか?
26
schemacs

トルネード上でWSGIアプリケーションを実行している場合、WSGIリクエストが特定のプロセスでアプリケーションによって処理されている限り、トルネードとグニコーンの間に大きな違いはありません。 。リクエストを処理するスレッドが1つしかないためgunicornの場合、およびTornadoの場合は、同時イベントを処理するためにメインイベントループが実行されないためです。

竜巻の場合、実際には隠れた危険もあります。

Gunicornの場合、要求スレッドは1つしかないため、ワーカープロセスは一度に1つのWeb要求しか受け入れません。サーバーにヒットする同時要求がある場合、それらはすべて同じリスナーソケットを共有するため、代わりに他の利用可能なワーカープロセスによって処理されます。

ただし、トルネードでは、WSGIアプリケーションの下のレイヤーが非同期であることから、1つのプロセスで複数の要求を同時に受け入れることができます。リクエストヘッダーとコンテンツが読み取られると、最初にインターリーブされます。これは、トルネードがWSGIアプリケーションを呼び出す前にメモリに読み取ります。リクエストのコンテンツ全体が読み取られると、コントロールがWSGIアプリケーションに渡され、その1つのリクエストが処理されます。その間、リクエストヘッダーとコンテンツがまだ読み取られていない同じプロセスによって処理されている同時リクエストは、WSGIアプリケーションが最初のリクエストを処理する間、ブロックされます。

ここで、トルネードプロセスが1つしかない場合は、要求がシリアル化されるため、これは大した問題ではありませんが、同じリスナーソケットを共有する複数のトルネードワーカープロセスを有効にするために、gunicornのトルネードワーカーモードを使用している場合、これはかなり悪い。これは、非同期層に起因する個々のプロセスの貪欲な性質は、それを処理した可能性のある別のワーカープロセスが存在する可能性がある場合に、プロセス内で要求がブロックされる可能性があることを意味します。

要約すると、単一のTornado Webサーバープロセスでは、一度に1つの要求しか処理できないという問題があります。 gunicornでは、複数のワーカープロセスを使用して、リクエストを同時に処理することができます。ただし、Tornadoでマルチプロセスセットアップを使用すると、要求がブロックされる危険があります。

したがって、トルネードは、非常に小さなカスタムWSGIアプリケーションで非常に優れているため、応答が非常に速くなります。したがって、同時要求を処理する適切な機能があるため、Gunicornの方が優れています。しかし、gunicornはシングルスレッドであり、複数のワーカープロセスを必要とするため、より多くのメモリを使用します。

したがって、どちらにもトレードオフがあり、場合によっては、マルチスレッドと複数のワーカープロセスによる同時実行性を提供するWSGIサーバーを使用したほうがよい場合があります。これにより、同時リクエストを処理できますが、多くのワーカープロセスを必要とすることによるメモリ使用量の増加はありません。同時に、CPU負荷の高いアプリケーションでGILの影響を過度に受けないように、複数のプロセスを使用してプロセスごとのスレッド数のバランスをとる必要があります。

マルチスレッド機能を備えたWSGIサーバーの選択肢は、mod_wsgi、uWSGI、ウェイトレスです。ウェイトレスの場合は、単一のワーカープロセスに制限されます。

全体として、どれが最高のWSGIサーバーであるかは、実際にはWebアプリケーションの詳細に大きく依存します。すべてにおいて最高のWSGIサーバーはありません。

41