Http 中的三种请求处理模式(MPM)的比较
http 支持三种MPM 工做模式 :html
- prefork ,
- worker,
- enent
prefork---多进程I/O模型,每一个进程响应一个请求
Prefork MPM: 预派生模式,有一个主控制进程,而后生成多个子进程,每一个子进程有一个独立的线程响应用户请求,相对比较占用内存,可是比较稳定,能够设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景web
- 优势:稳定
- 缺点:慢,占用资源,不适用于高并发场景
这个多处理模块(MPM)实现了一个非线程的、预先分叉的web服务器。每一个服务器进程能够响应传入的请求,父进程管理服务器池的大小。它适用于那些为了与非线程安全的库兼容而须要避免线程化的站点。它也是隔离每一个请求的最佳MPM,所以单个请求的问题不会影响任何其余请求。此MPM具备很强的自我调节能力,所以不多须要调整其配置指令。最重要的是MaxRequestWorkers足够大,能够处理您但愿接收的全部并发请求,但又足够小,能够确保全部进程都有足够的物理RAM。vim
prefork 模式相关的配置:centos
StartServers 100 #记录开始进程为100 当没有人访问的时候就变成为80个 MinSpareServers 50 MaxSpareServers 80 ServerLimit 2560 #最多进程数,最大值 20000 MaxRequestWorkers 2560 #最大的并发链接数,默认256 MaxConnectionsPerChild 4000 #子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个 请求以后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放) MaxRequestsPerChild 4000 #从 httpd.2.3.9开始被MaxConnectionsPerChild代替
worker---复用的多进程I/O模型,多进程多线程
*一个主进程:生成m个子进程,每一个子进程负责生个n个线程,每一个线程响应一个请求,并发响应请求:mn**
安全
是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每一个子进程里面包含固定的线程,使用线程程来处理请求,当线程不够使用的时候会再启动一个新的子进程,而后在进程里面再启动线程处理请求,因为其使用了线程处理请求,所以能够承受更高的并发。bash
- 优势:相比prefork 占用的内存较少,能够同时处理更多的请求
- 缺点:使用keep-alive的长链接方式,某个线程会一直被占据,即便没有传输数据,也须要一直等待到超时才会被释放。若是过多的线程,被这样占据,也会致使在高并发场景下的无服务线程可用。(该问题在prefork模式下,一样会发生)
worker和event 模式相关的配置服务器
ServerLimit 16 #最多worker进程数 Upper limit on configurable number of processes StartServers 10 #Number of child server processes created at startup MaxRequestWorkers 150 #Maximum number of connections that will be processed simultaneously MinSpareThreads 25 #每一个work 最多空闲25个 最大空闲75个 MaxSpareThreads 75 ThreadsPerChild 25 #Number of threads created by each child process每一个线程 i控制的个数
event---事件驱动模型,增长了一个监听线程
一个主进程:生成m个子进程,每一个子进程负责生个n个线程,每一个线程响应一个请求,并发响应多线程
请求:m*n,有专门的监控线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又容许释放。这样加强了高并发场景下的请求处理能力并发
event MPM:Apache中最新的模式,属于事件驱动模型(epoll),每一个进程响应多个请求,在如今版本里的已是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程由于被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又容许它释放。这样加强了高并发场景下的请求处理能力dom
event只在有数据发送的时候才开始创建链接,链接请求才会触发工做线程,即便用了TCP的一个选项,叫作延迟接受链接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP链接,不发送请求,则不会触发Accept操做,也就不会触发工做线程去干活,进行了简单的防***(TCP链接)
优势:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又容许它释放
缺点:没有线程安全控制
总结:
要求更高伸缩性的站点能够选择使用线程的 MPM,即 worker 或 event(互联网公司)
须要可靠性或者与旧软件兼容的站点可使用 prefork(传统公司)。
worker和event 模式相关的配置
ServerLimit 16 #最多worker进程数 Upper limit on configurable number of processes StartServers 10 #Number of child server processes created at startup MaxRequestWorkers 150 #Maximum number of connections that will be processed simultaneously MinSpareThreads 25 #每一个work 最多空闲25个 最大空闲75个 MaxSpareThreads 75 #每一个线程 i控制的个数 ThreadsPerChild 25 #Number of threads created by each child process
切换使用的MPM
#启用要启用的MPM相关的LoadModule指令便可,其它未启用的两项须要在行首加#注释 #三种选择一种就能够的 vim /etc/httpd/conf.modules.d/00-mpm.conf #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so #LoadModule mpm_worker_module modules/mod_mpm_worker.so LoadModule mpm_event_module modules/mod_mpm_event.so
注意:不要同时启用多个MPM模块,不然会出现如下错误
AH00534: httpd: Configuration error: More than one MPM loaded.
范例:查看CentOS 8 和 CentOS 7 默认的MPM工做模式
#查看CentOS 8 默认的MPM工做模式 [root@centos8 ~]#httpd -M |grep mpm AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using centos8.localdomain. Set the 'ServerName' directive globally to suppress this message mpm_event_module (shared) #查看CentOS 7 默认的MPM工做模式 [root@centos7 ~]#httpd -M |grep mpm AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using centos7.localdomain. Set the 'ServerName' directive globally to suppress this message mpm_prefork_module (shared)
范例:修改CentOS 8使用 prefork 模型
[root@centos8 ~]#vim /etc/httpd/conf.modules.d/00-mpm.conf [root@centos8 ~]#grep Load /etc/httpd/conf.modules.d/00-mpm.conf # one of the following LoadModule lines. See the httpd.conf(5) man LoadModule mpm_prefork_module modules/mod_mpm_prefork.so #LoadModule mpm_worker_module modules/mod_mpm_worker.so #LoadModule mpm_event_module modules/mod_mpm_event.so [root@centos8 ~]#httpd -M | grep mpm AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using centos8.localdomain. Set the 'ServerName' directive globally to suppress this message mpm_prefork_module (shared)
部份内容来自https://www.cnblogs.com/luck-pig/p/12007045.html