Apache mpm worker + 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 ,您可以看到正好有两个PID的所有工作人员处于“工作”状态。 目前,PID为822和5284.而且,这些进程没有提供任何function请求。 另外,他们只能用信号9 kill -9kill -9

选项WSGIDaemonProcess cpu-time-limit=120/120不会帮助我们,原因有两个:只有WSGI 3.0及更高版本才具有这个function,另外,这些进程不消耗CPU,所以CPU时间较短。

我们遇到一些服务器的缓慢。 这不是超级慢,但它可以更快(有时挂在请求),我怀疑这个问题是相关的。 无论如何,这不应该是这样的。

这是一个带有Apache 2.2.14和libapache2-mod-wsgi 2.8-2ubuntu1的Ubuntu 10.04 LTS服务器。 网站的服务如下所示:

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

这是工作人员configuration:

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

任何想法这是什么以及如何解决它? 或者,至less如何设置一些自动杀死这些进程? Ulimit很难,因为他们不消耗CPU很多。

您的MPM设置由于各种原因而出现故障。 build议你在PyCon上观看我的演讲:

至于你的服务器挂起,你可能有一个第三方扩展模块正在使用,这是不安全的,从一个下级解释器使用。 您需要强制您的应用程序在主解释器中运行。 看到:

为了弄清楚进程挂起的位置,还可以看到获取堆栈跟踪的方法,如下所述:

如果它是一个预期的死锁,不想尝试使用主解释器,可能需要使用gdb来获取堆栈的痕迹。

如果问题是您的代码阻塞对外部服务的调用,Python堆栈跟踪方法将工作。 你也可以通过使用lsof或者ofiles来查看打开的文件描述符。

我前段时间通过将站点转换为使用守护进程模式而不是embedded模式,并在其前面放置一个nginx代理来处理所有静态文件服务。