美文网首页APACHE
2.MPM三种工作模式

2.MPM三种工作模式

作者: Stone_説 | 来源:发表于2020-08-03 18:57 被阅读0次

    目录
    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.jpg
    Prefork 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类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
    缺点:没有线程安全控制

    相关文章

      网友评论

        本文标题:2.MPM三种工作模式

        本文链接:https://www.haomeiwen.com/subject/vcturktx.html