詳解,Http中(MPM)三種請求處理模式的比較

Http 中的三種請求處理模式(MPM)的比較

http 支持三種MPM 工做模式 :html

  • prefork ,
  • worker,
  • enent

prefork---多進程I/O模型,每一個進程響應一個請求

詳解,Http中(MPM)三種請求處理模式的比較

Prefork MPM: 預派生模式,有一個主控制進程,而後生成多個子進程,每一個子進程有一個獨立的線程響應用戶請求,相對比較佔用內存,可是比較穩定,能夠設置最大和最小進程數,是最古老的一種模式,也是最穩定的模式,適用於訪問量不是很大的場景web

  • 優勢:穩定
  • 缺點:慢,佔用資源,不適用於高併發場景

這個多處理模塊(MPM)實現了一個非線程的、預先分叉的web服務器。每一個服務器進程能夠響應傳入的請求,父進程管理服務器池的大小。它適用於那些爲了與非線程安全的庫兼容而須要避免線程化的站點。它也是隔離每一個請求的最佳MPM,所以單個請求的問題不會影響任何其餘請求。此MPM具備很強的自我調節能力,所以不多須要調整其配置指令。最重要的是MaxRequestWorkers足夠大,能夠處理您但願接收的全部併發請求,但又足夠小,能夠確保全部進程都有足夠的物理RAM。vim

prefork 模式相關的配置:centos

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**
詳解,Http中(MPM)三種請求處理模式的比較安全

是一種多進程和多線程混合的模型,有一個控制進程,啓動多個子進程,每一個子進程裏面包含固定的線程,使用線程程來處理請求,當線程不夠使用的時候會再啓動一個新的子進程,而後在進程裏面再啓動線程處理請求,因爲其使用了線程處理請求,所以能夠承受更高的併發。bash

  • 優勢:相比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---事件驅動模型,增長了一個監聽線程

詳解,Http中(MPM)三種請求處理模式的比較

一個主進程:生成m個子進程,每一個子進程負責生個n個線程,每一個線程響應一個請求,併發響應多線程

請求:m*n,有專門的監控線程來管理這些keep-alive類型的線程,當有真實請求時,將請求傳遞給服務線程,執行完畢後,又容許釋放。這樣加強了高併發場景下的請求處理能力併發

event MPM:Apache中最新的模式,屬於事件驅動模型(epoll),每一個進程響應多個請求,在如今版本里的已是穩定可用的模式。它和worker模式很像,最大的區別在於,它解決了keep-alive場景下,長期被佔用的線程的資源浪費問題(某些線程由於被keep-alive,空掛在哪裏等待,中間幾乎沒有請求過來,甚至等到超時)。event MPM中,會有一個專門的線程來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又容許它釋放。這樣加強了高併發場景下的請求處理能力dom

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

相關文章
相關標籤/搜索