web-dev-qa-db-ja.com

Apachempmワーカー+ wsgi Python / Djangoワーカーがスタック

私たちのApache + Djangoサーバーには、ワーカーがスタックするという問題があります。これはmpmワーカーモデルであり、しばらくすると、数十のワーカースレッドにサービスを提供する各プロセスで、すべてのワーカーが凍結されます。

# Apache2ctl status
Apache Server Status for localhost

Server Version: Apache/2.2.14 (Ubuntu) mod_ssl/2.2.14 OpenSSL/0.9.8k mod_wsgi/
    2.8 Python/2.6.5
Server Built: Mar 8 2013 16:46:38

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Current Time: Friday, 05-Apr-2013 15:56:17 CEST
Restart Time: Thursday, 04-Apr-2013 11:23:23 CEST
Parent Server Generation: 11
Server uptime: 1 day 4 hours 32 minutes 53 seconds
Total accesses: 244313 - Total Traffic: 4.7 GB
CPU Usage: u181.45 s33.97 cu.62 cs0 - .21% CPU load
2.38 requests/sec - 47.9 kB/second - 20.2 kB/request
108 requests currently being processed, 42 idle workers

_K__K______KK_____W_________W________K_K__________..............
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW..............
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW..............
................................................................
................................................................
................................................................

Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process

Apache2ctl fullstatusを実行すると、すべてのワーカーが「動作中」の状態になっているのは、正確に2つのPIDであることがわかります。現在、PID 822および5284です。また、これらのプロセスは機能要求を処理していません。さらに、それらはシグナル9(kill -9)でのみ殺すことができます

オプションWSGIDaemonProcess cpu-time-limit=120/120は、2つの理由で役に立ちません。WSGIバージョン3.0以降のみがそれを備えており、さらに、プロセスはCPUを消費していないため、CPU時間が短くなっています。

サーバーで多少の速度低下が発生します。それほど遅くはありませんが、速くなる可能性があり(リクエストによってハングすることもあります)、この問題は関連していると思われます。いずれにせよ、こうなるはずはありません。

これは、Apache2.2.14とlibapache2-mod-wsgi2.8-2ubuntu1を備えたUbuntu10.04LTSサーバーです。サイトは次のように提供されます。

WSGIScriptAlias / /srv/http/bla/passenger_wsgi.py

これはワーカー構成です:

<IfModule mpm_worker_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadLimit          64
    ThreadsPerChild      50
    MaxClients           200
    ServerLimit          6
    MaxRequestsPerChild  1000
</IfModule>

これが何であるか、そしてそれをどのように解決するかについて何か考えはありますか?または、少なくともこれらのプロセスに自動強制終了を設定する方法は? Ulimitは、CPUをあまり消費しないため、難しいです。

3
Halfgaar

修正しました 少し前に、埋め込みモードではなくデーモンモードを使用するようにサイトを変換し、その前にnginxプロキシを配置して、すべての静的ファイルの提供を処理しました。

0
Halfgaar

MPM設定は、開始のさまざまな理由で少し壊れています。 PyConからの私の講演を次の場所でご覧になることをお勧めします。

サーバーのハングに関しては、サブインタープリターからの使用が安全ではないサードパーティの拡張モジュールが使用されている可能性があります。アプリケーションを強制的にメインインタープリターで実行する必要があります。見る:

プロセスがハングしている場所を特定するには、次の説明に従ってスタックトレースを取得する方法も参照してください。

予想どおりデッドロックであり、メインインタープリターを使用してみたくない場合は、gdbを使用してスタックした場所のスタックトレースを取得する必要があります。

Pythonスタックトレースアプローチは、コードが外部サービスへの呼び出しをブロックしていることが問題である場合に機能します。lsofまたはofilesを使用して開いているファイル記述子を調べることで、そのアイデアを得ることができます。 。

2