2012-03-22 5 views
5

何とかuwsgiのキープアライブ制限をパスすることはできますか?そうでない場合は、永続的な接続の実装の最良の方法は何ですか。私はNGiNX + uWSGI(Python)を使用しています。クライアントからサーバーからの非同期更新を取得します。uWSGIキープアライブ

答えて

1

あなたは2つの異なることについて話しています。あなたのクライアントからあなたのアプリケーションへの永続的な接続を望むなら、非同期モード(ugreen、gevent ...経由で)を使いたいかもしれません。これにより、数千の同時接続を維持できます。キープアライブは複数のリクエストを同じ接続にルーティングする方法ですが、これはあなたの目的にはあまり役に立ちません。代わりにnginxとuWSGI間の永続的な接続を参照している場合、そのような動作に達する方法は(現在)nginxにありません。

http://projects.unbit.it/uwsgi/ticket/66

それはfastrouterについてですが、あまりにもhttprouterに適用されます:あなたはこのチケットをフォローしたいことがあります。しかし、それはまだ重い開発の下にあります。

1

いいえ、あなたはSCGIに基づいてuwsgiを実行し、リクエストごとにソケットを閉じますので、できません。代わりにFastCGIを使用してください。

1

UWSGIは、http経由でリクエストを受信すると、 - keep-keepaliveオプションを使用してキープアライブをサポートします。 straceの経由

/tmp$ uwsgi --http=:8000 --http-keepalive -w app &> /dev/null 

そして、我々が見ることができるconnect呼び出し::と

/tmp$ cat app.py 
def application(env, start_response): 
    content = b"Hello World" 
    start_response('200 OK', [ 
     ('Content-Type','text/html'), 
     ('Content-Length', str(len(content))), 
    ]) 
    return [content] 

実行

~$ strace -econnect wrk -d 10 -t 1 -c 1 http://127.0.0.1:8000 
connect(3, {sa_family=AF_INET, sin_port=htons(8000), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 
Running 10s test @ http://127.0.0.1:8000 
    1 threads and 1 connections 
    Thread Stats Avg  Stdev  Max +/- Stdev 
    Latency 92.32us 56.14us 2.81ms 97.20% 
    Req/Sec 11.10k 389.34 11.84k 68.32% 
    111505 requests in 10.10s, 7.98MB read 
Requests/sec: 11040.50 
Transfer/sec: 808.63KB 
+++ exited with 0 +++ 

参照してください? 1つの接続のみ。

+0

'-c 1'オプションは同時にどのくらいのアクティブなコネクションをアクティブにするかを設定しますが、キープアライブモードでは必要ありません:https://github.com/wg/wrk/blob/91655b5520b524fc0b802ad12220c9dcd546757e/src/http_parser.c#L2123 。 UWSGIはすべての応答に 'Connection:close'を追加します。しかし、この 'uwsgi'ツールは、コンテンツのサイズがわかっている場合、回避策によってキープアライブで動作します:http://uwsgi-docs.readthedocs.io/en/latest/HTTP.html?highlight=keep-alive#http-keep -alive。とにかく、あなたのアプリケーションはたくさんの別々のリクエストを受け取ります。 – DenisKolodin

+0

@DenisKolodin >キープアライブモードでは動作している必要はありません。 'wrk'はhttp/1.1を使用するので、キープアライブはデフォルトモードです。 straceと 'ab'の同じテストでは、リクエストごとに' connect'が表示されます。 >しかし、このuwsgiツールは、コンテンツのサイズがわかっている場合、回避策によってキープアライブで動作する可能性があります。 回避策ではありません。これは文書化された動作です)ほとんどのwsgiフレームワークは正しいContent-Lengthを設定します。 – bav