目录
0.介绍
1.prefork
2.worker
3.event
0.介绍
prefork:多进程I/O模型,每个进程响应一个请求,默认模型
一个主进程:生成和回收n个子进程,创建套接字,不响应请求
多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个
worker:复用的多进程I/O模型,多进程多线程, IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求: m*n
event:事件驱动模型( worker模型的变种)
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求: m*n,有专门的监控线程来管理这些keep-alive
类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
配置文件
[root@node03 ~]# rpm -ql httpd|less
/etc/httpd/conf.modules.d/00-mpm.conf
httpd-2.2: event 测试版, centos6默认
httpd-2.4: event 稳定版, centos7默认
1.Prefork MPM
prefork MPM.jpgPrefork MPM: 预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,
可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
修改配置文件
[root@node03 conf.modules.d]# pwd
/etc/httpd/conf.modules.d
[root@node03 conf.modules.d]# ls
00-base.conf 00-dav.conf 00-lua.conf 00-mpm.conf 00-proxy.conf 00-systemd.conf 01-cgi.conf
[root@node03 conf.modules.d]# vim 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
[root@node03 html]# pstree -p|grep httpd
|-httpd(7880)-+-httpd(7881)
| |-httpd(7882)
| |-httpd(7883)
| |-httpd(7884)
| `-httpd(7885)
[root@node03 html]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 7880 0.0 0.5 230428 5200 ? Ss 19:16 0:00 /usr/sbin/httpd -DFOREGROUND
apache 7881 0.0 0.3 230428 3020 ? S 19:16 0:00 /usr/sbin/httpd -DFOREGROUND
apache 7882 0.0 0.3 230428 3020 ? S 19:16 0:00 /usr/sbin/httpd -DFOREGROUND
apache 7883 0.0 0.3 230428 3020 ? S 19:16 0:00 /usr/sbin/httpd -DFOREGROUND
apache 7884 0.0 0.3 230428 3020 ? S 19:16 0:00 /usr/sbin/httpd -DFOREGROUND
apache 7885 0.0 0.3 230428 3020 ? S 19:16 0:00 /usr/sbin/httpd -DFOREGROUND
优点:稳定
缺点:慢,占用资源,不适用于高并发场景
2.worker MPM
worker MPM.jpg修改配置文件
[root@node03 conf.modules.d]# pwd
/etc/httpd/conf.modules.d
[root@node03 conf.modules.d]# ls
00-base.conf 00-dav.conf 00-lua.conf 00-mpm.conf 00-proxy.conf 00-systemd.conf 01-cgi.conf
[root@node03 conf.modules.d]# vim 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
[root@node03 conf.modules.d]# systemctl restart httpd
[root@node03 html]# pstree -p
systemd(1)─┬─NetworkManager(6069)─┬─{NetworkManager}(6085)
......
├─httpd(8018)─┬─httpd(8019)
│ ├─httpd(8020)─┬─{httpd}(8024)
│ │ ├─{httpd}(8025)
......
│ │ └─{httpd}(8049)
│ ├─httpd(8021)─┬─{httpd}(8052)
│ │ ├─{httpd}(8053)
......
│ │ └─{httpd}(8077)
│ └─httpd(8022)─┬─{httpd}(8078)
│ ├─{httpd}(8079)
......
│ └─{httpd}(8103)
[root@node03 html]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 8018 0.1 0.5 230632 5400 ? Ss 19:27 0:00 /usr/sbin/httpd -DFOREGROUND
apache 8019 0.0 0.3 230380 2988 ? S 19:27 0:00 /usr/sbin/httpd -DFOREGROUND
apache 8020 0.0 0.5 517460 5540 ? Sl 19:27 0:00 /usr/sbin/httpd -DFOREGROUND
apache 8021 0.0 0.5 517460 5540 ? Sl 19:27 0:00 /usr/sbin/httpd -DFOREGROUND
apache 8022 0.0 0.5 517460 5544 ? Sl 19:27 0:00 /usr/sbin/httpd -DFOREGROUND
worker MPM:是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,
当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,
因此可以承受更高的并发。
优点:相比prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输 数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也 会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会 发生)
3.event MPM
event MPM.jpg修改配置文件
[root@node03 conf.modules.d]# pwd
/etc/httpd/conf.modules.d
[root@node03 conf.modules.d]# ls
00-base.conf 00-dav.conf 00-lua.conf 00-mpm.conf 00-proxy.conf 00-systemd.conf 01-cgi.conf
[root@node03 conf.modules.d]# vim 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
[root@node03 conf.modules.d]# systemctl restart httpd
[root@node03 html]# pstree -p
systemd(1)─┬─NetworkManager(6069)─┬─{NetworkManager}(6085)
......
├─httpd(8120)─┬─httpd(8121)
│ ├─httpd(8122)─┬─{httpd}(8147)
│ │ ├─{httpd}(8149)
......
│ │ └─{httpd}(8179)
│ ├─httpd(8123)─┬─{httpd}(8127)
│ │ ├─{httpd}(8128)
......
│ │ └─{httpd}(8157)
│ └─httpd(8124)─┬─{httpd}(8180)
│ ├─{httpd}(8181)
......
│ └─{httpd}(8205)
[root@node03 html]# ps aux
root 8120 0.0 0.5 230644 5420 ? Ss 19:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 8121 0.0 0.3 230392 2996 ? S 19:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 8122 0.0 0.5 517472 5568 ? Sl 19:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 8123 0.0 0.5 517472 5568 ? Sl 19:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 8124 0.0 0.5 517472 5576 ? Sl 19:33 0:00 /usr/sbin/httpd -DFOREGROUND
event MPM: Apache中最新的模式,属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,
最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,
中间几乎没有请求过来,甚至等到超时)。 eventMPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,
将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力
event只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,
加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击( TCP连接)
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
缺点:没有线程安全控制
网友评论