在Ubuntu Linux下,我的Apache2服务器上有一些奇怪的东西。
我有两个网站,一个是由Apache2通过Passenger模块(这是一个Ruby Web应用程序)直接处理,另一个是反向代理到另一个端口Tomcat6服务器。
一切看起来都不错,但Apache2的行为似乎真的很贪婪: top我看到它至less有5-6个进程,当我提出这两个服务器的请求时,它们长到13-14。
有这么多的过程是正确的吗?
如果没有必要,我应该configuration它不那么贪婪? 我正在一个function较弱的机器上进行类似的configuration比较(512MB内存与2GB内存),似乎在这台机器上,它保持较less的进程打开。 也许Apache2基准testing机器了解要分配多less资源?
仅供参考,这两台机器实际上是在VMWare服务器下虚拟化的
提前致谢
您应该阅读处理多处理模块(MPM)的Apache文档 。 简而言之,这决定了Apache如何处理多个请求,主要有两种方法: preforking (这就是您现在正在做的事情)和线程工作者 ,这通常更高效。
正如你所说,Prefork创build和维护了一些“备用”的apache进程,每个进程处理一个客户端。 当你处理stream程不足时,Apache会创build更多的stream程。 这可能会很慢,并消耗大量的内存。 可以使用StartServers , MinSpareServers和MaxSpareServersconfiguration指令来调整创build了多less个进程 。
Worker使用单个或less量进程,但在每个进程内部创build多个线程来处理每个请求。 这可以更有效率,但与某些不是线程安全的Apache模块(最显着的是PHP)不兼容。 所以如果你使用这样的模块,你会想要考虑切换到FastCGI。
从Apache文档:
Apache MPM prefork
这个多处理模块(MPM)实现了一个非线程化的预分叉web服务器,以类似于Apache 1.3的方式处理请求。 对于需要避免与非线程安全库兼容的线程的站点来说,这是适当的。 这也是隔离每个请求的最好的MPM,因此单个请求的问题不会影响其他任何请求。
[…]
一个控制过程负责启动监听连接并在到达时提供服务的subprocess。 Apache总是试图维护几个备用或空闲的服务器进程,这些进程已经准备好接收传入的请求。 通过这种方式,客户端不需要等待新的subprocess在被请求之前被分叉。
StartServers,MinSpareServers,MaxSpareServers和MaxClients调节父进程如何创build子服务器请求。 一般来说,Apache是非常自我调节的,所以大多数站点不需要从默认值调整这些指令。 需要提供超过256个同时请求的站点可能需要增加MaxClients,而内存有限的站点可能需要减lessMaxClients以防止服务器发生颠簸(将内存交换到磁盘并返回)。 有关调优stream程创build的更多信息,请参阅性能提示文档。
和:
Apache MPM工作者
这个多处理模块(MPM)实现了一个混合多进程multithreading服务器。 通过使用线程来为请求提供服务,它能够以比基于进程的服务器更less的系统资源来处理大量的请求。 然而,通过保持多个进程可用,每个进程都有许multithreading,它保留了基于进程的服务器的大部分稳定性。
[…]
一个控制过程(父)负责启动subprocess。 每个subprocess创buildThreadsPerChild指令中指定的固定数量的服务器线程,以及侦听连接的侦听器线程,并在到达时将它们传递给服务器线程进行处理。
我从mod_php和mpm_prefork切换到FastCGI PHP和mpm_worker ,发现性能有了很大的提高,特别是对于静态文件(图像,HTML文件等)。 你的旅费可能会改变…