1. 程式人生 > >Apache優化配置——工作模式

Apache優化配置——工作模式

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優化配置——工作模式