標籤:apache 工作模式
Apache所啟動並執行硬體環境都是對效能影響最大的因素
各個硬體指標中,對效能影響最大的是記憶體,其次是硬碟的速度
●Apache的工作模式
1、prefork模式(一個 非線程型的)
⑴、主要工作方式:當Apache伺服器啟動後,mpm_prefork模組會預先建立多個子進程(預設為5個),每個子進程只有一個線程,當接收到用戶端的請求後,mpm_prefork模組再將請求轉交給子進程處理,並且每個子進程同時只能用於處理單個請求。如果當前的請求數將超過預先建立的子進程數時,mpm_prefork模組就會建立新的子進程來處理額外的請求。Apache總是試圖保持一些備用的或者是閒置子進程用於迎接即將到來的請求,這樣用戶端的請求就不需要在接收後等候子進程的產生。
⑵prefork在效率上要比worker要高,但是記憶體使用量大多不擅長處理高並發的情境
⑶Apache在prefork工作模式下影響效能的重要參數說明:
#prefork MPM
<ifModule mpm_prefork_module>
StartServers 5 #Apache啟動時預設開始的子進程數
MinSpareServers 5 #最小的閑置子進程數
MaxSpareServers 10 #最大的閑置子進程數,
MaxRequestWorkers 250 #MaxRequestWorkers設定了允許同時最大接入的請求數量,任何超過MaxRequestWorkers限制的請求將進入等候隊列
MaxConnectionsPerChild 500 #設定的是每個子進程可處理的請求數。每個進程在處理了“MaxConnectionsPerChild”請求後將自動銷毀。0意味著無限,即子進程永不銷毀。設定為1時可防止意外的記憶體流失。設定為2時表示在伺服器負載下降的時候會自動減少子進程數。可根據伺服器的負載來調整此值
★註:
①MaxRequestWorkers是這些指令中最為重要的一個,設定的是Apache可以同時處理的請求,是對Apache效能影響最大的參數。如果請求總數已經達到這個值(通過ps -ef | grep http | wc -l來確認)那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而http訪問卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越多,建議將初始值設為以MB為單位的最大實體記憶體/2,然後根據負載情況進行動態調整。
②prefork控制進程在最初建立“StartServers”子進程後,為了滿足MinSpareServers設定的需要建立一個進程,等待一秒鐘,繼續建立兩個,再等待一秒鐘,繼續建立四個......如此按指數級增加建立的進程數,最多達到每秒32個,直到滿足MinSpareServers設定的值為止,這種模式可以不必再請求到來時再產生新的進程,從而減小了系統開銷以增加效能。MaxSpareServers設定了最大的空閑進程數,如果空閑進程數大於這個值,Apache會kill掉一些多餘的進程,這個值不要設的過大,但如果設的值比MinSpareServers小,Apache會自動把其調整為MinSpareServers+1。如果網站負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。
③ServerLimit和MaxClients(MaxRequestWorkers)的區別:在Apache時代,控制最大進程數只有MaxClients這個參數,並且這個參數最大值為256,並且是寫死了的,試圖設定為超過256是無效的,這是由於Apache1時代的伺服器硬體是限制的。但是Apache2時代由於伺服器硬體的升級,硬體已經不再是限制,所以ServerLimit這個參數來控制最大進程數,ServerLimit值>=MaxClient值才有效。ServerLimit要放在MaxClients之前,值不要小於Maxclients。
④查看Apache載入的模組:apachectl -t -D DUMP_MODULES 或 apachectl -M 或 apachectl -l
查看Apache的工作模式:httpd -v 或 httpd -l
⑤修改prefork參數和啟動prefork模式
vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
vi /usr/local/http-2.4.23/conf/httpd.conf 添加兩行:LoadModule mpm_prefork_module/mod_mpm_prefork.so 和 Include conf/extra/httpd-mpm.conf
重啟httpd服務
2、Worker模式(多線程多進程)
⑴與prefork的比較:prefork速度要稍高於worker,然而它需要的CPU和memory資源也稍多於worker
⑵Apache在worker工作模式下影響效能的重要參數說明
#worker MPM
<ifModule mpm_worker_module>
StartServers 3 #Apache啟動時預設開始的子進程數
MinSpareThreads 75 #最小空閑數量的背景工作處理序
MaxSpareThreads 250 #最大空閑數量的背景工作執行緒
ThreadPerChild 25 #每個子進程產生的線程數量
MaxRequestWorkers 400 #MaxRequestWorkers設定了允許同時最大接入的請求數量,任何超過MaxRequestWorkers限制的請求將進入等候隊列
MaxConnectionsPerChild 0 #設定的是每個子進程可處理的請求數。每個進程在處理了“MaxConnectionsPerChild”請求後將自動銷毀。0意味著無限,即子進程永不銷毀。
★註:
①Worker由主控制進程產生“StartServers”子進程,每個子進程中包含固定的ThreadsPerChild線程數,各個線程獨立地處理請求。同樣,為了不在請求到來時再產生線程,MinSpareThreads和MaxSpareThreads設定了最少和最多的空閑線程數。而MaxRequestWorkers設定了同時連入的clients最大總數,如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程。MinSpareThreads和MaxSpareThreads的最大預設值分別是75和250.這兩個參數對Apache的效能影響並不大,可以按照實際情況相應調節
② ThreadsPerChild是worker MPM 中與效能相關最密切的指令,ThreadsPerChild的最大預設值是64,如果負載較大,64位也是不夠的,這時要使用ThreadLimit指令,他的最大預設值是20000
③Worker模式下所能同時處理的請求總數是由子進程總數乘以ThreadsPerChild值決定的,應該大於等於MaxRequestWorkers。如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。預設最大的子進程總數是16,加大時也需要顯示聲明ServerLimit。需要注意的是,如果顯示聲明了ServerLimit,那麼它乘以ThreadsPerChild的值必須大於等於MaxRequestWorkers,而且MaxRequestWorkers必須是ThreadsPerChild的整數倍,否則Apache將會自動調節到一個相應值。
④進程與線程的區別(線程是指進程內的一個執行單元,也是進程內的可調度實體)
a、地址空間:進程內的一個執行單元;進程至少有一個線程;它們共用進程的地址空間;而進程有自己獨立的地址空間
b、資源擁有:進程是資源分派和擁有的單位,同一進程內的線程共用進程的資源
c、線程是處理器調度的基本單位,但進程不是
d、二者均可並發執行:進程和線程都是由操作 系統所體會的程式啟動並執行基本單元, 系統利用該基本單元實現系統對應用的並發性
e、簡單來說,就是一個程式至少有一個進程,一個進程至少有一個線程
線程的劃分尺度小於進程,使得多線程程式的並發性高
進程在執行過程中擁有獨立的記憶體單元,而多個線程共用記憶體,從而極大地提高了程式的運行效率
3、Event模式
這是Apache最新的工作模式,是worker模式的變種,它把服務進程從串連中分離出來,worker模式不同的是在於它解決了,keep-alive長串連的時候佔用線程資源被浪費的問題,在event工作模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給伺服器的線程,執行完畢後,又允許它釋放。這增強了在高並發情境下的請求處理。event模式不能很好的支援https的訪問
本文出自 “營運” 部落格,請務必保留此出處http://cherryliang.blog.51cto.com/12911935/1939982
Apache最佳化配置——工作模式