2012-09-21 40 views
1

我們有一個SOAP mod_wsgi(apache)應用程序有時負載很重。相同的Apache服務器還有一些其他的wsgi-apps。不幸的是,你可以只在服務器級別設置MaxClients,而不是每個wsgi-app。一個wsgi應用程序吃所有的apache客戶端

我們得到:

server reached MaxClients setting, consider raising the MaxClients setting 

有沒有辦法從吃的都是Apache的工人停止這個WSGI應用程序?

我想僅返回503「Service Unavailable」給連接到SOAP wsgi應用程序的SOAP客戶端。

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> 

有3只爲SOAP應用WSGI守護進程。但它佔據了更多的阿帕奇工人。

更新: 我們使用apache prefork mpm。有N阿帕奇工人。而對於mod_wsgi,我們也使用prefork。有M個mod_wsgi工作進程。阿帕奇工人數可以由MaxClients控制。 mod_wsgi工作計數由上述配置控制。

我想你不能在python wsgi應用程序(django)中處理這個問題。我想它需要通過mod_wsgi或apache配置來完成。

這裏是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 
+0

請發表評論,如果你不明白的問題一個gunicorn實例。 – guettli

+0

做守護進程和apache worker不是什麼意思嗎? – Xuan

+0

@軒我更新了這個問題。 – guettli

回答

1

所有的請求都被Apache子(由MaxClients的控制)服務,但每一次請求達到soap_app URL Apache的孩子會等待一個3 WSGIDaemonProcess。如果您收到soap_app的請求的速度比通過3個進程處理它們的速度要快,那麼您將會耗盡Apache子項。

我看到控制soap_app專用Apache子項的唯一方法是使用mod_proxy並將soap_app請求代理給另一個「服務」。 proxy pass directive允許您定義要發送的併發請求數,該數將等於您要使用的soap_app的Apache子數。

「服務」爲服務soap_app請求可能是同一個Apache的另一個虛擬主機(從來沒有測試),或與soap_app應用

+0

謝謝您的回答。我認爲這解決了我的問題。我會等待幾天的其他答案。但我想你會得到賞金。 – guettli

相關問題