详解,Http中(MPM)三种请求处理模式的比较
Http 中的三种请求处理模式(MPM)的比较
http 支持三种MPM 工作模式 :
- prefork ,
- worker,
- enent
prefork---多进程I/O模型,每个进程响应一个请求
Prefork MPM: 预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
- 优点:稳定
- 缺点:慢,占用资源,不适用于高并发场景
这个多处理模块(MPM)实现了一个非线程的、预先分叉的web服务器。每个服务器进程可以响应传入的请求,父进程管理服务器池的大小。它适用于那些为了与非线程安全的库兼容而需要避免线程化的站点。它也是隔离每个请求的最佳MPM,因此单个请求的问题不会影响任何其他请求。此MPM具有很强的自我调节能力,因此很少需要调整其配置指令。最重要的是MaxRequestWorkers足够大,可以处理您希望接收的所有并发请求,但又足够小,可以确保所有进程都有足够的物理RAM。
prefork 模式相关的配置:
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**
是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。
- 优点:相比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类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力
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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
将大数据学习门槛降到了地平线
Hadoop介绍 Hadoop-大数据开源世界的亚当夏娃。 核心是HDFS数据存储系统,和MapReduce分布式计算框架。 HDFS 原理是把大块数据切碎, 每个碎块复制三份,分开放在三个廉价机上,一直保持有三块可用的数据互为备份。使用的时候只从其中一个备份读出来,这个碎块数据就有了。 存数据的叫datenode(格子间),管理datenode的叫namenode(执伞人)。 MapReduce 原理是大任务先分堆处理-Map,再汇总处理结果-Reduce。分和汇是多台服务器并行进行,才能体现集群的威力。难度在于如何把任务拆解成符合MapReduce模型的分和汇,以及中间过程的输入输出<k,v> 都是什么。 单机版Hadoop介绍 对于学习hadoop原理和hadoop开发的人来说,搭建一套hadoop系统是必须的。但 配置该系统是非常头疼的,很多人配置过程就放弃了。 没有服务器供你使用 这里介绍一种免配置的单机版hadoop安装使用方法,可以简单快速的跑一跑hadoop例子辅助学习、开发和测试。 要求笔记本上装了Linux虚拟机,虚拟机上装了docker。 安装 使用d...
- 下一篇
假装网络工程师22——使用VRF穿越MPLS域通信
一、背景介绍 同一个公司可能有多个办公地点,不同的办公地点之间通信往往是向运营商购买***服务,而***服务也可以分为二层与三层,区别是: 二层***服务,可以将运营商看成一个透明的,站点两端在同一网段,彼此间不感知中间的运营商网络 三层***服务,可以将运营商网络看成是一格路由器,站点两端的地址是不同网段,本文介绍的mpls ***就属于三层***服务 二、网络拓扑 本次实验网络拓扑如下图所示: 黄色区域表示运营商网络,而紫色与红色分别表示同一用户的不同站点,其中端口ip地址见下表 路由器端口 ip地址 描述 R1 g0/0/0 15.0.0.1/24 R1 g0/0/1 14.0.0.1/24 R1 g2/0/0 12.0.0.1/24 R1 lo0 1.1.1.1/32 ibgp与mpls邻居间通信地址,ospf router-id,mpls lsr-id R2 g0/0/0 12.0.0.2/24 R2 g0/0/1 23.0.0.2/24 R2 lo0 2.2.2.2/32 ibgp与mpls邻居间通信地址,ospf router-id,mpls lsr-id R3 g0/0...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Hadoop3单机部署,实现最简伪集群