httpd的运行模式prefork、worker、event

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了httpd的运行模式prefork、worker、event相关的知识,希望对你有一定的参考价值。

参考技术A

httpd-2.x版本引入了插入式的并行处理模式,多路处理模块(MPM),其有三种运行模式,分别是prefork、worker和event,对于event模式在httpd-2.2来说还在于测试阶段,通常来说不会在生成环境上面运行,而在httpd-2.4上event模式已经完成测试,可以在生产环境上运行了。

prefork是一个两级进程模型,非线程的模式,其实通过由父进程管理创建子进程,子进程相应的相应的请求的方式来运行的。以prefork模式运行的httpd,在启动之际就预派生fork了一些子进程,然后等待请求。每个子进程只有一个线程,在一个时间点内只能处理一个请求。
优点 :成熟、稳定、兼容所有新老模块。进程之间完全独立,无须担心线程安全的问题。
缺点 :一个进程相对会占用更多的系统资源,消耗更多的内存。不适合处理高并发请求,因其会把请求放进队列中,一直等到有可用进程才会处理相应的请求。
在httpd-2.2中的配置:

worker是一个三级结构、多进程多线程的模式,其在启动时也预先fork了几个子进程,每个子进程能够生产若干个服务线程和若干个监听线程,每个服务线程处理一个请求,监听线程负责接入请求并将其传递给服务线程处理和应答。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此内存的占用会减少些,在高并发的场景下表现比prefork模式好。
优点 :占用内存少,高并发性能更优秀。
缺点 :当一个线程出现问题的时候会导致同一进程下的线程也会出现问题。在keep-alive长连接的方式下,某个线程会被一直占用,即使中间没有请求,也需要等待到超时才会被释放。
在httpd-2.2中的配置:

event模式是最新的运行模式,在httpd-2.4中已经是稳定可用的模式。其运行原理与worker类似,区别在于,event模式解决了在keep-alive模式下,线程被长期占用直到超时,从而导致资源浪费的问题。
在event模块中,有一个专门的线程来管理这些keep-alive类型的线程,当接收到真实的请求时,会将请求传递给服务线程,执行完毕后,会将对应的服务线程释放,这样就能实现线程的异步非阻塞。
在httpd-2.2中的配置:

在Centos 6.9上安装httpd 2.2:

安装完成后,httpd的默认运行模式为prefork,查看其运行模式为:

在/etc/httpd.conf中查看其对应prefork配置:

启动httpd服务并查看相关的进程状态:

修改 /etc/httpd/conf/httpd.conf中的prefork配置:

重启httpd服务并查看相应的进程:

使用ab工具对相应的URL进行压力测试并观察进程的状况:

对于httpd-2.2版本来说,要更改运行模式为worker模式,需先修改配置文件/etc/sysconfig/httpd:

重启httpd服务后,查看进程状态:

修改 /etc/httpd/conf/httpd.conf文件中的worker的配置:

重启httpd服务后,使用ab工具进行压力测试:

压测命令: ab -n 200000 -c 300 http://188.88.88.171/index.html

http-2.2的event模式还处于测试阶段,因此不建议在生产环境上运行,httpd-2.4的event模式为正式版可在生产环境上部署。
修改配置文件/etc/sysconfig/httpd:

重启httpd服务,并查看httpd服务:

修改/etc/httpd/conf/httpd.conf,添加event配置:

压测命令: ab -n 200000 -c 300 http://188.88.88.171/index.html

在测试启动httpd 的各种模式的过程中,我曾尝试编译安装后启动worker模式,但是发现其worker进程状态跟配置文件里头的worker设置并不一致,最初以为是配置错误,但是后来经测试验证发现,通过yum安装后配置同样的设置,得出的结果是正确的,所以初步判断为编译安装的问题,相比yum安装,我做的编译安装缺少了挺多文件的,但是因为水平有限,无法完整编译出正确的安装。因此在此记录下相关的问题和现象,以便后续学习研究透了后进行回顾。

编译安装httpd-2.2的命令:

以上是关于httpd的运行模式prefork、worker、event的主要内容,如果未能解决你的问题,请参考以下文章

Apache worker/prefork模式说明及优化配置

Httpd安装,request报文以及相关访问控制

Apache 两种工作模式 :prefork worker

如何找到 Apache 在 Linux 中使用的 MPM 模型(worker、prefork 或 event)

linux mpm模式用prefork好还是worker好

apache工作模式worker以及prefork的切换