我有一台运行 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