皆さん、最近私は奇妙な問題に遭遇し、本当に気が狂いました。
私は nginx + uwsgi + django を使用してサイトを本番環境にデプロイしています。サイトには毎日約 3 億のリクエストがあり、最大同時実行数は毎秒 4000 です。フロントに 4 つの nginx とバックエンドに 6 つの uwsgi があり、nignx は tcp 経由で uwsgi と通信します.
数か月間、パフォーマンスは良好です。しかし、ある日突然 uwsgi が動かなくなりました。以下のメッセージをスローします。
ハラキリ: --- uWSGI ワーカー 72 (pid: 23094) WAS 管理リクエスト /2/article/v2/stream/?detail=1&image=1&count=20&max_behot_time=1358697136&latitude=39.914651254102&longitude=116.45855261839&city=&device_platform=android&channel=hiapk2&version=hiapk0 news_article&openudid=474604a56e33a44f&uuid=353769056450763&os_api=16&device_type=GT-N7100&os_version=4.1.1 以降 2013 年 1 月 21 日月曜日 23:07:51 ---
上記のメッセージから、django アプリに長い要求があるため、uwsgi が自分自身を強制終了しているようです。しかし、アプリの表示時間とデバッグを確認すると、アプリが非常に高速であると確信しています(リクエストを処理するのに約100ミリ秒)。
驚いたことに、uwsgi が繰り返し自分自身を殺し、キューがいっぱいになるため、nginx が uwsgi に多くの接続タイムアウトをスローすることがわかりました。
uwsgi プロセスを追跡すると、uwsgi が write システム コールでブロックされ、それが自身を殺すまでブロックされていることがわかります。
writev(8, [{"HTTP/1.1", 8}, {" ", 1}, {"200 OK", 6}, {"\r\n", 2}, {"Vary", 4}, {": ", 2}, {"Cookie", 6}, {"\r\n", 2}, {"コンテンツ タイプ", 12}, {": ", 2}, {"text/html ; charset=utf-8", 24}, {"\r\n", 2}, {"\r\n", 2}], 13) = 73
write(8, "{\"has_more\": true, \"メッセージ\": \"s"..., 24005
私の理解では、uwsgi は決してブロックされない tcp でノンブロッキング モードを使用します。私は長い間グーグルで何度も試してみましたが、何の役にも立ちません。
最後に、デプロイ mod を変更します。前面に 4 つの nginx listen 80 ポートを使用し、6 つの nginx ポート 81 に http_proxy を使用します。nginx 81 ポートは vai unix ファイル sock と uwsgi と通信します。この試行の後、uwsgi はブロックされず、すべて大丈夫です。
uwsgi が write syscall でブロックされた理由を誰が教えてくれますか? または、 tcp 経由で nginx と通信するときに uwsgi がブロックされるのはどのような場合ですか?
どうもありがとう