Apache MPM三种工作模式详解

一、apache特性与功能

apache是一个多模块化的Web服务,使用简单,速度快,稳定性好,可以做负载均衡及代理服务器来使用。
apache特性

  • 高度模块化:core + modules
  • DSO:Dynamic Shared Object 动态加载/卸载
  • MPM:multi-processing module 多路处理模块

apache 功能

  • 虚拟主机:IP、Port、FQDN

  • CGI:Common Gateway Interface,通用网关接口

  • 反向代理

  • 负载均衡

  • 路径别名

  • 丰富的用户认证机制:basic,digest

  • 支持第三方模块

二、apache有三种工作模式 MPM (multi-processing module)工作模式

  • Prefork MPM
  • Worker MPM
  • Event MPM

Prefork MPM

在这里插入图片描述
prefork:多进程I/O模型,每个进程响应一个请求,CentOS 7 默认模型
一个主进程:生成和回收n个子进程,创建套接字,不响应请求
多个子进程:工作 work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求
Prefork MPM: 预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景

  • 优点:稳定

  • 缺点:慢,占用资源,不适用于高并发场景

Worker MPM

在这里插入图片描述
worker: 复用的进程I/O模型,多进程多线程,windows IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应
请求:m*n
worker MPM:是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。

  • 优点:相比prefork 占用的内存较少,可以同时处理更多的请求

  • 缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

Event MPM

在这里插入图片描述
event:事件驱动模型(worker模型的变种)。CentOS8,默认的模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应
请求:m*n,有专门的监控线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
event MPM:Apache中最新的模式,属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力,event只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击(TCP连接)

  • 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放

  • 缺点:没有线程安全控制

httpd-2.4:event 稳定版,centos7 以后默认
httpd-2.2:event 测试版,centos6 默认

总结:

Prefork MPM: 使用多个进程,每个进程只有一个线程,每个进程再某个确定的时间只能维持一个连接,优点是稳定,缺点是内存消耗过高。

Worker MPM: 使用多个进程,每个进程有多个线程,每个线程在某个确定的时间只能维持一个连接,内存占用比较小,是个适用高并发、高流量的场景,缺点是一个线程崩溃,整个进程就会连同其任何线程一起挂掉。

Event MPM: 使用多进程多线程+epoll的模式

发布了12 篇原创文章 · 获赞 0 · 访问量 406

猜你喜欢

转载自blog.csdn.net/swyer_66/article/details/104720006