Apache的三种工作模型

apache作为web服务端:

Apache起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发,目前经历了两大版本分别是1.X和 2.X,其可以通过编译安装实现特定的功能,官方网站

1.Apache prefork模型

预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,一个进程对应一个用户的请求,它的最大并发数为1024,这就导致没有办法适用于高并发的应用场景。每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适合用于访问量不是很大的场景。
优点:
相对稳定
缺点
占用内存资源较大;
1024个进程不适合高并发场景
Apache的三种工作模型

2.Apache woker模型

是一种多进程和多线程混合的模型,一个主进程来控制多个子进程,每个子进程里面包含固定的线程,让线程来处理用户的请求,当线程不够使用的时候再启动另一个子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理i请求,因此可以承受更高的并发数。
优点
相对于prefork来说,占用的内存较少;
可以同时处理更多的请求;
缺点
如果用户使用keepalive的长连接方式,其中某个线程会一直被占用,即使没有数据传输也要一直等待,等待到超时时间后才会被释放。如果存在多个keepalive长链接的话,也会导致在高并发场景下的无服务线程可用。
Apache的三种工作模型

3.Apache event模型

Apache中最新的模型,2012年发布的apache2.4.x系列正式支持event模型,属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。他和worker模式很像,最大的区别在于他解决了keepalive场景下长期被占用的线程资源浪费问题(某些线程因为被keepalive,空挂在那里等待,中间几乎没有请求数据,甚至等待超时。)event MPM中,会有一个专门的线程来管理这些keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增加了高并发场景下请求处理能力。
优点
单线程响应多请求,占据更少的内存;
高并发下表现优秀,会有专门的监听线程来管理keepalive类的请求,当有真实请求过来的时候,将请求传递给服务线程
缺点
没有线程安全控制;
Apache的三种工作模型

4.prefork、worker、event对比

prefork: 进程模型,两级结构,主进程负责生成子进程,每个子进程负责响应一个请求
worker: 线程模型,三级结构,主进程负责生成子进程,每个子进程负责处理多个线程,每个线程响应一个请求
event: 线程模型,三级机构,主进程负责生成子进程,每个子进程生成多个线程,每个线程响应一个请求,但是增加了监听线程,用于解决在设置keep-alived场景下线程的空等待问题