1

時々重い負荷がかかるSOAPmod_wsgi(apache)アプリがあります。同じApacheが他のいくつかのwsgi-appsをサーバーします。残念ながら、MaxClientsは、wsgi-appごとではなく、サーバーレベルでのみ設定できます。

我々が得る:

server reached MaxClients setting, consider raising the MaxClients setting

このwsgiアプリがすべてのapacheワーカーを食べないようにする方法はありますか?

SOAPwsgiアプリに接続するSOAPクライアントにのみ503「ServiceUnavailable」を返したい。

Apache構成スニペット:

   WSGIDaemonProcess soap_app threads=1 processes=3
   WSGIScriptAlias /soap_app /home/soap_app/django_wsgi.py
   <Location "/soap_app/">
       WSGIProcessGroup soap_app
       WSGIApplicationGroup %{GLOBAL}
   </Location>

soapアプリのwsgiデーモンプロセスは3つだけです。しかし、それははるかに多くのアパッチ労働者を占めています。

更新: apachepreforkmpmを使用します。Napacheワーカーがいます。また、mod_wsgiにはpreforkも使用します。M個のmod_wsgiワーカープロセスがあります。apacheワーカーの数は、MaxClientsによって制御できます。mod_wsgiワーカー数は、上記の構成によって制御されます。

python wsgiアプリ(django)内ではこれを処理できないと思います。mod_wsgiまたはapacheconfigで行う必要があると思います。

mod_statusの最初の行は次のとおりです。

  Server Version: Apache/2.2.17 (Linux/SUSE) mod_ssl/2.2.17 OpenSSL/1.0.0c
  mod_wsgi/3.3 Python/2.7
  Server Built: 2011-07-26 13:43:36.000000000 +0000
===============================================================================
  Current Time: Thursday, 20-Sep-2012 13:15:11 CEST
  Restart Time: Thursday, 06-Sep-2012 16:30:45 CEST
  Parent Server Generation: 0
  Server uptime: 13 days 20 hours 44 minutes 25 seconds
  Total accesses: 307471 - Total Traffic: 7.7 GB
  CPU Usage: u11.85 s1.56 cu0 cs0 - .00112% CPU load
  .257 requests/sec - 6.8 kB/second - 26.4 kB/request
  127 requests currently being processed, 13 idle workers
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWKWWWWW_WWWWWKWWWWWWWWW_WWWWWW_WW_WWWWWWK._WW
W__WW__._W_W__........
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
Srv  PID   Acc   M CPU  SS   Req  Conn  Child Slot   Client         VHost     Request
0-0  15135 0/27/ W 0.04 8417 0    0.0   0.37  290.12 10.1.1.1       foohost   POST /soap_app/foo HTTP/1.1
           11553
           0/
1-0  15142 125/  W 0.18 7354 0    0.0   2.48  324.82 10.1.1.1       foohost   POST /soap_app/foo HTTP/1.1
           12475
           0/
2-0  18350 157/  W 0.27 4780 0    0.0   4.84  300.09 10.1.1.1       foohost   POST /soap_app/foo HTTP/1.1
           11249
3-0  20112 0/10/ W 0.02 7106 0    0.0   0.29  315.77 10.1.1.1       foohost   POST /soap_app/foo HTTP/1.1
           12714
4-0  16562 0/35/ W 0.07 7853 0    0.0   0.96  328.98 10.1.1.1       foohost   POST /soap_app/foo HTTP/1.1
           12098
5-0  20152 0/25/ W 0.06 6732 0    0.0   0.71  288.17 10.1.1.1       foohost   POST /soap_app/foo HTTP/1.1
4

1 に答える 1

1

すべてのリクエストはApacheの子(MaxClientsによって制御される)によって処理されますが、リクエストがURLにヒットするたびにsoap_app、Apacheの子は3つのWSGIDaemonProcessのいずれかを待機します。soap_app3つのプロセスで処理できるよりも速くリクエストを受け取った場合、最終的にはApacheの子が不足します。

soap_app専用のApache子の数を制御する唯一の方法は、mod_proxyを使用して、soap_appリクエストを別の「サービス」にプロキシすることです。プロキシパスディレクティブを使用すると、提供する同時リクエストの数を定義できます。これは、に使用するApacheの子の数と同じになりますsoap_app

リクエストを処理する「サービス」soap_appは、同じApacheの別のVirtualHost(テストしたことはありません)またはsoap_appアプリケーションを使用したgunicornインスタンスである可能性があります。

于 2013-02-21T09:19:19.407 に答える