关于Apache的三种工作模式
1、第一种Prefork MPM
多进程模式,prefork模式可以算是很古老但是非常稳定的模式。每个子进程中只有一个线程,在一个时间点内,只能处理一个请求。
优点:很成熟,兼容所有新老模块。进程之间完全独立,使得它非常稳定。同时,不需要担心线程安全的问题。
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。且它不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。
2、第二种Worker MPM
多进程+多线程模式。每个子进程能够生成一些服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下,表现得比 prefork模式好。
考虑到稳定性,若挂了一个线程,会导致父进程连同其他正常的子线程都挂了。在多进程+多线程模式中,各个进程之间都是独立的,如果某个线程出现异常,受影响的只是Apache的一部分服务,而不是整个服务。其他进程仍然可以工作。
优点:占据更少的内存,高并发下表现更优秀。
缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,也许中间几乎没有请求,这时就会发生阻塞,线程被挂起,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。
3、第三种Event MPM
多进程+多线程+epoll。现已成为稳定可用的模式,它和 worker模式很像,最大的区别在于,它解决了 keep-alive 场景下 ,长期被占用的线程的资源浪费问题。