1

我们有一个 SOAP mod_wsgi (apache) 应用程序,有时负载很重。相同的 Apache 服务于一些其他 wsgi-apps。不幸的是,您只能在服务器级别设置 MaxClients,而不是每个 wsgi-app。

我们得到:

server reached MaxClients setting, consider raising the MaxClients setting

有没有办法阻止这个 wsgi 应用程序吃掉所有的 apache 工作人员?

我只想将 503“服务不可用”返回给连接到 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 个 wsgi 守护进程。但它占用了更多的 apache 工人。

更新: 我们使用 apache prefork mpm。有 N 个 apache 工作者。对于 mod_wsgi,我们也使用 prefork。有 M 个 mod_wsgi 工作进程。apache 工作人员计数可以由 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
4

1 回答 1

1

所有请求都由 Apache 子进程(由 MaxClients 控制)提供服务,但每次请求命中soap_appurl 时,Apache 子进程都会等待 3 个 WSGIDaemonProcess 之一。如果您收到的请求soap_app比您使用 3 个进程为它们提供服务的速度更快,您最终将用完 Apache 子进程。

我看到控制专用于soap_app 的Apache 子节点数量的唯一方法是使用mod_proxy 并将soap_app请求代理到另一个“服务”。代理传递指令允许您定义要服务的并发请求的数量,这将等于您要用于的 Apache 子节点的数量soap_app

为请求提供服务的“服务”soap_app可以是同一个 Apache 的另一个 VirtualHost(从未测试过)或带有soap_app应用程序的 gunicorn 实例

于 2013-02-21T09:19:19.407 回答