apache prefork/mod_wsgi 生成的进程数量似乎超出配置

4 投票
3 回答
3090 浏览
提问于 2025-04-15 11:51

在一个生产环境中,我使用nginx作为反向代理,后面连接到apache的mpm-prefork/mod_wsgi。我发现有90个apache子进程,而我原本预计最多应该只有40个,因为我在下面的配置中设置了这个最大值。这个配置/setup其实没什么特别的:

  1. nginx通过proxy_pass反向代理到apache,并且负责提供静态资源
  2. 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 个回答

0

你可以让apache的进程数量超过WSGI的实例数量。

如果你想限制apache的进程数量,可以把apache的MaxClients设置为40。

1

你正在使用 mod_wsgi 的守护进程模式,这意味着 mod_wsgi 的进程和 Apache 的处理进程是相互独立的。

根据你的配置,在 Apache 启动后,你有:

  • 同时启动了 40 个 mod_wsgi 进程。
  • 20 个 Apache 处理进程(StartServers),如果没有新的请求,它们可以自动减少到 10 个(MaxSpareServers)。

在负载增加时,Apache 的处理进程最多可以增加到 200 个(MaxClients)。但是 mod_wsgi 的进程数量仍然是 40 个。

我的建议是使用 worker mpm,而不是仅仅使用 Apache 处理动态内容。这可以帮助减少内存消耗,并提高扩展性。

10

mod_wsgi守护进程看起来像是Apache服务器的子进程,但其实它们并不是同一种东西。这是因为mod_wsgi守护进程是从Apache的父进程分叉出来的,而不是通过分叉和执行新的进程。换句话说,它们的可执行文件名称并没有改变。

为了能区分mod_wsgi守护进程和普通的Apache服务器子进程,可以给WSGIDaemonProcess提供一个'显示名称'的选项。这个选项可以让你在使用'ps'程序和一些类似'top'的程序查看进程时,给这些进程起个名字。想了解更多,可以查看mod_wsgi网站上关于WSGIDaemonProcess指令的文档。

http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess

撰写回答