前几个月把需要在后台自动运行以及处理一些编辑操作请求队列的脚本统统集中到了一台巨牛的服务器上面跑,结果发现再牛的机器处理那么多并发的操作还是会吃不消。于是让老查再腾一台服务器出来分摊任务,同时还可以作为互备。下午老查找过来了,说新弄的那台服务器apache起来之后ps出来有几十个httpd进程,很奇怪。httpd.conf的配置是和原来服务器一样的,启动的时候按照配置的数量应该是只有5个才对。

一时想不出原因来,只好采用笨办法:比较两台服务器的不同。

比来比去,突然发现apache的logs目录下面比原来的服务器多了个大小为0名为 cgisock 的日志文件。

到httpd.conf里面一搜,这文件是配置给mod_cgid.c的,不过已经注释掉了。

再g一把mod_cgid,原来只要编译时选择了多线程多道处理模块支持,这个模块就会缺省地被使用来代替mod_cgi ! 

 

看来是这个多道处理模块(MPMs)带来的问题了。看看这个介绍就明白了,Apache 2.0 带有多道处理模块的选择以处理网络端口绑定、接受请求并指派子进程来处理这些请求。

比如, 需要更好缩扩性的站点可以选择象worker这样线程化的MPM, 而需要更好的稳定性和兼容性以适应一些旧的软件的站点可以用prefork

MPM必须在编译配置时进行选择,并编译到服务器中。如果编译器能够确定线程功能被启用,它将会负责优化大量功能。因为一些MPM在Unix上使用了线程,而另外一些没有使用,所以如果在编译配置时选择了MPM并编译进Apache,Apache将会有更好的表现。

用 ./httpd -l 命令去查看两个服务器上的apache,果然原来的服务器使用的是prefork.c,而新服务器上使用的是worker.c。老查说那上面的apache并不是新安装的,很早就在那就怪不得了。

估计是之前有人安装的时候使用./configure脚本时用 --with-mpm= 参数选择了worker方式的MPM。在不同的MPM模式下,apache启动之后初始的进程数量不一样也就是正常的事情了。

下表列出了不同操作系统下默认的MPMs。如果你在编译时没有进行选择,这将是默认选择的MPM

BeOS beos
Netware mpm_netware
OS/2 mpmt_os2
Unix prefork
Windows mpm_winnt

 

结论: 这并不是一个问题,只是不同MPM模式下的正常表现。