apache prefork/mod_wsgi 生成的进程数量似乎超出配置
在一个生产环境中,我使用nginx作为反向代理,后面连接到apache的mpm-prefork/mod_wsgi。我发现有90个apache子进程,而我原本预计最多应该只有40个,因为我在下面的配置中设置了这个最大值。这个配置/setup其实没什么特别的:
- nginx通过
proxy_pass
反向代理到apache,并且负责提供静态资源 - apache只处理动态请求
相关的nginx配置:
worker_processes 15;
events {
worker_connections 1024;
}
keepalive_timeout 10;
相关的apache配置:
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
<IfModule mpm_prefork_module>
StartServers 20
MinSpareServers 7
MaxSpareServers 10
MaxClients 200
MaxRequestsPerChild 0
</IfModule>
mod_wsgi配置,其中webapp
是进程的名称:
WSGIDaemonProcess webapp user=www group=users threads=1 processes=40
我是不是漏掉了什么?
3 个回答
你可以让apache的进程数量超过WSGI的实例数量。
如果你想限制apache的进程数量,可以把apache的MaxClients设置为40。
你正在使用 mod_wsgi
的守护进程模式,这意味着 mod_wsgi
的进程和 Apache 的处理进程是相互独立的。
根据你的配置,在 Apache 启动后,你有:
- 同时启动了 40 个
mod_wsgi
进程。 - 20 个 Apache 处理进程(StartServers),如果没有新的请求,它们可以自动减少到 10 个(MaxSpareServers)。
在负载增加时,Apache 的处理进程最多可以增加到 200 个(MaxClients)。但是 mod_wsgi
的进程数量仍然是 40 个。
我的建议是使用 worker mpm,而不是仅仅使用 Apache 处理动态内容。这可以帮助减少内存消耗,并提高扩展性。
mod_wsgi守护进程看起来像是Apache服务器的子进程,但其实它们并不是同一种东西。这是因为mod_wsgi守护进程是从Apache的父进程分叉出来的,而不是通过分叉和执行新的进程。换句话说,它们的可执行文件名称并没有改变。
为了能区分mod_wsgi守护进程和普通的Apache服务器子进程,可以给WSGIDaemonProcess提供一个'显示名称'的选项。这个选项可以让你在使用'ps'程序和一些类似'top'的程序查看进程时,给这些进程起个名字。想了解更多,可以查看mod_wsgi网站上关于WSGIDaemonProcess指令的文档。
http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess