为什么我有这么多 apache2 进程?

为什么我有这么多 apache2 进程?

我有一台运行 GNU/kFreeBSD 8.1-1-amd64 和 Apache 的 Debian 6.0.1 机器。我apache2-mpm-worker使用 进行安装apt-get,我的apache2.conf文件包含:

<IfModule mpm_prefork_module>
    StartServers          4
    MinSpareServers       2
    MaxSpareServers       5
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule> 
<IfModule mpm_worker_module>
    StartServers          1
    MinSpareThreads       2
    MaxSpareThreads      20
    ThreadLimit          64
    ThreadsPerChild      20
    MaxClients          100
    MaxRequestsPerChild 400
</IfModule>

因此我应该只看到几个 Apache 进程在运行。但是,看起来更像是在运行 prefork,因为我似乎有很多进程,而不是很多线程:

root@garrison:/# ps awwwwx | grep apache
78438 ?        S+     0:00 grep apache
78424 ?        S      0:00 /usr/sbin/apache2 -k start
78423 ?        S      0:00 /usr/sbin/apache2 -k start
78422 ?        S      0:00 /usr/sbin/apache2 -k start
78421 ?        S      0:00 /usr/sbin/apache2 -k start
78420 ?        S      0:00 /usr/sbin/apache2 -k start
78419 ?        S      0:00 /usr/sbin/apache2 -k start
78418 ?        S      0:00 /usr/sbin/apache2 -k start
78417 ?        S      0:00 /usr/sbin/apache2 -k start
78416 ?        S      0:00 /usr/sbin/apache2 -k start
78415 ?        S      0:00 /usr/sbin/apache2 -k start
78414 ?        S      0:00 /usr/sbin/apache2 -k start
78413 ?        S      0:00 /usr/sbin/apache2 -k start
78412 ?        S      0:00 /usr/sbin/apache2 -k start
78411 ?        S      0:00 /usr/sbin/apache2 -k start
78410 ?        S      0:00 /usr/sbin/apache2 -k start
78409 ?        S      0:00 /usr/sbin/apache2 -k start
78408 ?        S      0:00 /usr/sbin/apache2 -k start
78407 ?        S      0:00 /usr/sbin/apache2 -k start
78406 ?        S      0:00 /usr/sbin/apache2 -k start
78405 ?        S      0:00 /usr/sbin/apache2 -k start
78404 ?        S      0:00 /usr/sbin/apache2 -k start
78402 ?        S      0:00 /usr/sbin/apache2 -k start
78401 ?        S      0:00 /usr/sbin/apache2 -k start
78400 ?        S      0:00 /usr/sbin/apache2 -k start
78397 ?        Ss     0:00 /usr/sbin/apache2 -k start

但 Apache 显然安装了 worker 模块,而不是 prefork 模块:

root@garrison:/HostRAID/netboot/IntelNetboot.nbi# /usr/sbin/apache2 -l
Compiled in modules:
  core.c
  mod_log_config.c
  mod_logio.c
  worker.c
  http_core.c
  mod_so.c

怎么回事?为什么我有这么多apache2进程?此服务器处于加载。(即没有 http 请求)

答案1

我不确定,但你的ps输出让我想起了 Linux 2.4 - 线程曾经以进程的形式出现,ps直到从Linux 线程原生 Posix 线程库

这句话来自此主题似乎证实了我的怀疑:

在 GNU/kFreeBSD 下,线程是进程克隆,与 Linux 2.4 系列类似

如果是这种情况,则并不意味着工作程序出现故障。它不是分叉 - 您看到的是线程。Apache 文档ThreadsPerChild

此指令设置每个子进程创建的线程数。子进程在启动时创建这些线程,并且永远不会创建更多线程。(...) 与 mpm_winnt 一起使用时,ThreadsPerChild 的默认值为 64,与其他进程一起使用时,ThreadsPerChild 的默认值为 25。

http://httpd.apache.org/docs/2.0/mod/mpm_common.html#threadsperchild

相关内容