但是,如果你需要处理大量的并发请求,这种方式会疯狂"吃掉"系统资源。请注意,每个进程都会作为一个完整的Apache实例来发布自己。这意味着它会加载所有模块,而且对每个请求来说都是一个完整的web服务器。如果请求数非常大,而由于协调器需要发布与请求数相同的进程来处理这些请求,这会很快迫使内存使用率达到极限。
Apache Worker MPM
Work多路复用模块会使用线程,它在高并发时在内存使用方面处理的很好。在多路复用模块中,需要的进程数较少,因为它不想Prefork那样需要为每个请求创建一个进程,Worker模式会在进程中创建线程,请求进入的连接通过一个进程中的不同线程来处理。Worker模式中,新的连接只需要等待空闲的线程即可,而不是像Prefork中那样需要等待空闲进程。
Apache Event MPM
Event模式是非常新的。事实上,它只在Apache2.4版本中被作为稳定版发布。Event模式和Worker模式工作原理相同,它也是使用进程和线程。它们最大的区别在与Event模式会为每个请求创建一个线程,而不是为一个HTTP连接创建一个线程。
有一种情况那就是当你喜欢使用线程但是有一个应用程序,这个应用程序使用了较长的keepalive超时时间时这种模式很适用。在Worker MPM中,线程是和连接绑定的,并且无论http请求是否被处理都保持被占用状态。
在Event MPM中,如果处理连接的线程只是用来处理当前请求并且会在请求处理完成后立即释放,不管被父进程处理的HTTP连接的情况。同时,当线程在请求被处理完成立即释放后可以被用来处理其他请求。这意味着需要更少的线程!
我怎么处理这些信息?
既然如此,你该使用哪一种?在我看来,以我最忠诚的忠告,每个人都应该使用Worker MPM,因为它在并发方面相当出色而且对RAM内存的使用较少,虽然如果在兼容性上有问题,你可能需要切换回Prefork。
如果你使用的是最新版本的Apache,你可以尝试使用Event MPM。
如果是用的是PHP,那么使用Worker MPM或者Event MPM时必须使用php-fpm。如果你在Worker模式下使用了mod_php那么你的应用可能会在这样或那样的表单中出错。实际上,这时你也许应该使用的php-fpm,不论apache在何种MPM模式下。









