標籤:穩定性 keepaliv 小數 增加 調整 reads php process 串連數
Apache採用的MPM(Multi -Processing Modules,多道處理模組),管理網路連接處理請求
一、簡介
針對作業系統的處理模組mpm_beos
、mpm_event
、mpm_netware
、mpmt_os2
、mpm_prefork
、mpm_winnt
、mpm_worker
其中
Linux 系統 使用 mpm_worker mpm_prefork
Windows系統使用 mpm_winnt
二、查看原生MPM模式
$ httpd -V|grep "Server MPM"
Server MPM: Prefork
$ httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
三、效能最佳化配置
httpd.conf 開啟mpm配置
# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf
MPM設定檔 /usr/local/apache/conf/extra/httpd-mpm.conf
Prefork 介紹
當Apache伺服器啟動後,mpm_prefork
模組會預先建立多個子進程(預設為5個),當接收到用戶端的請求後,mpm_prefork
模組再將請求轉交給子進程處理,並且每個子進程同時只能用於處理單個請求。如果當前的請求數將超過預先建立的子進程數時,mpm_prefork
模組就會建立新的子進程來處理額外的請求。Apache總是試圖保持一些備用的或者是閒置子進程用於迎接即將到來的請求。這樣用戶端的請求就不需要在接收後等候子進程的產生。
由於在mpm_prefork
模組中,每個請求對應一個子進程,因此其佔用的系統資源相對其他兩種模組而言較多。不過mpm_prefork
模組的優點在於它的每個子進程都會獨立處理對應的單個請求,這樣,如果其中一個請求出現問題就不會影響到其他請求。同時,mpm_prefork
模組可以應用於不具備安全執行緒的第三方模組(比如PHP的非安全執行緒版本),且在不支援線程調試的平台上易於調試。此外,mpm_prefork
模組還具有比mpm_worker
模組更高的穩定性。
建議配置
<IfModule mpm_prefork_module>StartServers 5 #推薦設定:小=預設 中=20~50 大=50~100 數量的伺服器處理序開始MinSpareServers 5 #推薦設定:與StartServers保持一致 最小數量的伺服器處理序,儲存備用MaxSpareServers 10 #推薦設定:小=20 中=30~80 大=80~120 最大數量的伺服器處理序,儲存備用MaxClients 150 #推薦設定:小=500 中=500~1500 大型=1500~3000 最大數量的伺服器處理序允許開始MaxRequestsPerChild 0 #推薦設定:小=10000 中或大=10000~500000 最大串連數的一個伺服器處理序服務(此外,還需額外設定ServerLimit參數,該參數最好與MaxClients的值保持一致。)</IfModule>
prefork 控制進程在最初建立 “StartServers”個子進程後,為了滿足MinSpareServers設定的需要建立一個進程,等待一秒鐘,繼續建立兩 個,再等待一秒鐘, 繼續建立四個……如此按指數級增加建立的進程數,最多達到每秒32個,直到滿足MinSpareServers設定的值為止。這種模式 可以不必在請求到 來時再產生新的進程,從而減小了系統開銷以增加效能。MaxSpareServers設定了最大的空閑進程數,如果空閑進程數大於這個 值,Apache 會自動kill掉一些多餘進程。這個值不要設得過大,但如果設的值比MinSpareServers小,Apache會自動把其調整 為 MinSpareServers+1。如果網站負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。
MaxRequestsPerChild設定的是每個 子進程可處理的請求數。每個子進程在處理了“MaxRequestsPerChild”個請求後將自 動銷毀。0意味著無限,即子進程永不銷毀。雖然預設 設為0可以使每個子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:
1、可防止意外的記憶體泄 漏。2、在伺服器負載下降的時侯會自動減少子進程數。
因此,可根據伺服器的負載來調整這個值。
MaxRequestWorkers指令集同時將服務要求的數量上的限制。任何串連嘗試在MaxRequestWorkerslimit將通常被排隊,最多若干基於上ListenBacklog指令。
在apache2.3.13以前的版本MaxRequestWorkers被稱為MaxClients 。
(MaxClients是這些指令中最為重要的一個,設定的是 Apache可以同 時處理的請求,是對Apache效能影響最大的參數。其預設值150是遠遠不夠的,如果請求總數已達到這個值(可通過 ps -ef|grep http|wc -l來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP訪問卻很 慢的主要原因。雖然理論上這個值越大,可以 處理的請求就越多,但Apache預設的限制不能大於256。)
worker 模組
mpm_worker
模組也主要應用於Unix/Linux平台的Apache伺服器,它可以看作是mpm_prefork
模組的改進版。mpm_worker
模組的工作方式與mpm_prefork
模組類似。不過,由於處理相同請求的情況下,基於進程(例如mpm_prefork
)比基於線程的處理方式佔用的系統資源要多。因此,與mpm_prefork
模組不同的是,mpm_worker
模組會讓每個子進程建立固定數量的服務線程和一個監聽線程,並讓每個服務線程來處理用戶端的請求,監聽線程用於監聽接入請求並將其傳遞給服務線程處理和應答。Apache總是試圖維持一個備用或是閒置服務線程池。這樣,用戶端無須等待新線程或新進程的建立即可得到處理。
與mpm_prefork
模組相比,mpm_worker
模組可以進一步減少系統資源的開銷。再加上它也使用了多進程,每個進程又有多個線程,因此它與完全基於線程的處理方式相比,又增加了一定的穩定性。
<IfModule mpm_worker_module>StartServers 2 #推薦設定:小=預設 中=3~5 大=5~10MaxClients 150 #推薦設定:小=500 中=500~1500 大型=1500~3000MinSpareThreads 25 #推薦設定:小=預設 中=50~100 大=100~200MaxSpareThreads 75 #推薦設定:小=預設 中=80~160 大=200~400 ThreadsPerChild 25 #推薦設定:小=預設 中=50~100 大型=100~200MaxRequestsPerChild 0 #推薦設定:小=10000 中或大=10000~50000(此外,如果MaxClients/ThreadsPerChild大於16,還需額外設定ServerLimit參數,ServerLimit必須大於等於 MaxClients/ThreadsPerChild 的值。)</IfModule>
對應的配置參數作用如下:
-
StartServers
-
啟動Apache時建立的子進程數。
-
MinSpareServers
-
處於空閑狀態的最小子進程數。
所謂空閑子進程是指沒有正在處理請求的子進程。如果當前空閑子進程數少於MinSpareServers
,那麼Apache將以最大每秒一個的速度產生新的子進程。只有在非常繁忙機器上才需要調整這個參數。此值不宜過大。
-
MaxSpareServers
-
處於空閑狀態的最大子進程數。
只有在非常繁忙機器上才需要調整這個參數。此值不宜過大。如果你將該指令的值設定為比MinSpareServers
小,Apache將會自動將其修改成MinSpareServers+1
。
-
MaxClients
-
允許同時串連的最大請求數量。
任何超過MaxClients
限制的請求都將進入等待隊列,直到達到ListenBacklog
指令限制的最大值為止。
對於非線程型的MPM(也就是mpm_prefork
),MaxClients
表示可以用於處理用戶端請求的最大子進程數量,預設值是256。要增大這個值,你必須同時增大ServerLimit
。
對於線程型或者混合型的MPM(也就是mpm_beos
或mpm_worker
),MaxClients
表示可以用於處理用戶端請求的最大線程數量。線程型的mpm_beos
的預設值是50。對於混合型的MPM預設值是16(ServerLimit
)乘以25(ThreadsPerChild
)的結果。因此要將MaxClients
增加到超過16個進程才能提供的時候,你必須同時增加ServerLimit
的值。
-
MinSpareThreads
-
處於空閑狀態的最小線程數。
不同的MPM對這個指令的處理是不一樣的:
mpm_worker
的預設值是75。這個MPM將基於整個伺服器監視空閑線程數。如果伺服器中總的空閑線程數太少,子進程將產生新的空閑線程。mpm_netware
的預設值是10。既然這個MPM只運行單獨一個子進程,此MPM當然亦基於整個伺服器監視空閑線程數。mpm_beos
和mpmt_os2
的工作方式與mpm_netware
差不多,mpm_beos
的預設值是1;mpmt_os2
的預設值是5。
-
MaxSpareThreads
-
處於空閑狀態的最大線程數。
不同的MPM對這個指令的處理是不一樣的:
mpm_worker
的預設值是250。這個MPM將基於整個伺服器監視空閑線程數。如果伺服器中總的空閑線程數太多,子進程將殺死多餘的空閑線程。mpm_netware
的預設值是100。既然這個MPM只運行單獨一個子進程,此MPM當然亦基於整個伺服器監視空閑線程數。mpm_beos
和mpmt_os2
的工作方式與mpm_netware
差不多,mpm_beos
的預設值是50;mpmt_os2
的預設值是10。
備忘:ServerLimit
表示Apache允許建立的最大進程數。 值得注意的是,Apache在編譯時間內部有一個硬限制ServerLimit 20000
(對於mpm_prefork
模組為ServerLimit 200000
)。你不能超越這個限制。
使用這個指令時要特別當心。如果將ServerLimit
設定成一個高出實際需要許多的值,將會有過多的共用記憶體被分配。如果將ServerLimit
和MaxClients
設定成超過系統的處理能力,Apache可能無法啟動,或者系統將變得不穩定。
注意:在配置相關參數時,請先保證伺服器具備足夠的硬體效能(例如:CPU、記憶體等)。 如果發現自啟動後,隨著伺服器的已耗用時間增加,伺服器的記憶體佔用也隨之增加,可能是程式中出現記憶體泄露,請向下調整參數MaxRequestsPerChild
的值以降低記憶體泄露帶來的影響,然後儘快找出程式中的問題之所在。
winnt 模組
mpm_winnt
模組是專門針對Windows作業系統而最佳化設計的MPM模組。它只建立一個單獨的子進程,並在這個子進程中輪流產生多個線程來處理請求。
<IfModule mpm_winnt_module>ThreadsPerChild 150 #推薦設定:小型網站=1000 中型網站=1000~2000 大型網站=2000~3500MaxRequestsPerChild 0 #推薦設定:小=10000 中或大=20000~100000</IfModule>
對應的配置參數作用如下:
-
ThreadsPerChild
-
每個子進程的最大並發線程數。
-
MaxRequestsPerChild
-
每個子進程允許處理的請求總數。如果累計處理的請求數超過該值,該子進程將會結束(然後根據需要確定是否建立新的子進程),該值設為0表示不限制請求總數(子進程永不結束)。
該參數建議設為非零的值,可以帶來以下兩個好處:
- 可以防止程式中可能存在的記憶體流失無限進行下去,從而耗盡記憶體。
- 給進程一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動進程的數量。
注意:在以上涉及到統計請求數量的參數中,對於KeepAlive的串連,只有第一個請求會被計數。
接著,我們再來看看mpm_perfork
模組和mpm_worker
模組下的預設配置:
參考
72724605 參數具體計算
https://www.cnblogs.com/fazo/p/5588644.html 模組詳解
70182476
http://sanyue.iteye.com/blog/2095222
Apache mpm模式最佳化