查看你的httpd使用了哪种模式:

/usr/local/apache2/bin/httpd -V |grep 'Server MPM'

使用哪种模式,需要在编译的时候指定

--with-mpm=prefork|worker|event

当然也可以编译的时候,让三者都支持:

--enable-mpms-shared=all

然后在配置文件中,修改

LoadModule mpm_worker_module modules/mpd_mpm_worker.so

2.2版本默认为worker,2.4版本默认为event

再来比较一下三种模式的差异

1 prefork

prefork模式可以算是很古老但是非常稳定的Apache模式。Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。(我们常用的mod_php,PHP的拓展不需要支持线程安全)
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。

2 worker

worker模式比起上一个,是使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。
有些人会觉得奇怪,那么这里为什么不完全使用多线程呢,还要引入多进程?
原因主要是需要考虑稳定性,如果一个线程异常挂了,会导致父进程连同其他正常的子线程都挂了(它们都是同一个进程下的)。为了防止这场异常场景出现,就不能全部使用线程,使用多个进程再加多线程,如果某个线程出现异常,受影响的只是Apache的一部分服务,而不是整个服务。

优点:占据更少的内存,高并发下表现更优秀。

缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,某个线程会一直被占据,也许中间几乎没有请求,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

注:keep-alive的长连接方式,是为了让下一次的socket通信复用之前创建的连接,从而,减少连接的创建和销毁的系统开销。保持连接,会让某个进程或者线程一直处于等待状态,即使没有数据过来。

3  event

这个是Apache中最新的模式,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。

event MPM在遇到某些不兼容的模块时,会失效,将会回退到worker模式,一个工作线程处理一个请求。官方自带的模块,全部是支持event MPM的。

注意一点,event MPM需要Linux系统(Linux 2.6+)对EPoll的支持,才能启用。

还有,需要补充的是HTTPS的连接(SSL),它的运行模式仍然是类似worker的方式,线程会被一直占用,知道连接关闭。部分比较老的资料里,说event MPM不支持SSL,那个说法是几年前的说法,现在已经支持了。

httpd的三种模式比较相关推荐

  1. 红帽启动apache服务器_红帽7搭建httpd的三种模式(基于主机,端口,IP)

    httpd是Apache超文本传输协议(HTTP)服务器的主程序.被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池. yum install httpd -y           ...

  2. Oracle 11g dataguard三种模式以及实时查询(Real-time query)功能设置

    之前我们讨论过<Linux Oracle 11g dataguard物理standby 配置过程>, 但是在实际过程中会遇到不同的问题,首先我们讨论下ORACLE DATAGUARD的三种 ...

  3. SAP EWM 与 AGV 机器人对接的三种模式

    SAP EWM 与 AGV 机器人对接的三种模式 https://mp.weixin.qq.com/s/xGfUMSBTEMYKce5oXcWDqA 导读    本文转载自:弘毅供应链,跟随供应链专家 ...

  4. Tomcat三种模式及配置APR模式

    为什么80%的码农都做不了架构师?>>>    Tomcat三种模式 Tomcat Connector的三种不同的运行模式性能相差很大,有人测试过的结果如下: 这三种模式的不同之处如 ...

  5. 宠物乘机的三种模式【转】

    几天前微博用户@HUST_维维豆奶在网上控诉,他搭乘东航MU2544次航班(上海浦东-武汉)时,托运的金毛犬在天河机场被打成重伤(附1).机场方面给出了官方回应(附2与附3),并且已向事主支付了五万元 ...

  6. Vim编辑器的基本使用和三种模式

    Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 目前使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字 ...

  7. DELL服务器安装过程中的三种模式AHCI, ATA, RAID

    BIOS 里的 SATA setting 有 AHCI mode, ATA mode, RAID mode三种模式. AHCI vs ATA ATA(AT Attachment) 是一个很久远的标准, ...

  8. mysql binlog 权限_MySQL如何开启binlog?binlog三种模式的分析

    前提,创建表t,并插入数据,语句如下: CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `t_modified` ...

  9. oracle物理DG管理-redo数据传输,应用与三种模式

    环境http://blog.csdn.net/sunziyue/article/details/50799648基础之上 1学习配置参数 下列参数为primary 角色相关 *.db_name='or ...

最新文章

  1. C++右值引用与转移和完美转发
  2. Java 快速排序算法实现-----面试
  3. reactor官方文档译文(2)Reactor-core模块
  4. linux删除最后一个字符串,Bash删除字符串中的第一个和最后一个字符
  5. Json字符串转对象,使用ObjectMapper方式报错:no String-argument constructor/factory method
  6. 设计模式学习笔记——组合(Composite)模式
  7. oenwrt 进不了bios_为什么进不bios_进不了bios怎么解决?
  8. linux添加自己的键盘映射,Linux 键盘映射
  9. Linux 不同方法查看进程消耗CPU IO 等
  10. IOS 支付宝支付开发流程
  11. 【学习笔记】【OC语言】继承
  12. js通过codeURL画二维码
  13. Bengio最新博文:深度学习展望
  14. python shelve模块_python shelve模块
  15. Atitit  godaddy 文件权限 root权限设置
  16. Python模拟黑客帝国影片中的终端动画脚本
  17. Lattice Diamond 3.12下载与安装(免费获取license.dat)
  18. 谈谈公司内部的技术分享
  19. 数据科学数据分析_使用数据科学进行营销分析
  20. 知识管理在企业竞争发展中的作用

热门文章

  1. linux显示文本文件指定行数的数据
  2. Linux定时器接口
  3. bzoj1037[ZJOI2008]生日聚会Party dp
  4. 中国招商银行设计严重缺陷
  5. Python TypeError: descriptor '__init__' requires a 'super' object but received a 'str' 错误
  6. AOP的XML架构、AOP的@AspectJ
  7. 一步一步搭建mysql_Linux——搭建PHP开发环境第一步:mysql
  8. Js双引号和单引号使用注意事项
  9. connection url mysql_JDBC URL格式及其参数说明 oracle mysql
  10. vue项目中简单进行axios封装及响应状态码提示!