Apache優化配置——工做模式

Apache所運行的硬件環境都是對性能影響最大的因素
apache

各個硬件指標中,對性能影響最大的是內存,其次是硬盤的速度服務器

●Apache的工做模式多線程

一、prefork模式(一個 非線程型的)併發

⑴、主要工做方式:當Apache服務器啓動後,mpm_prefork模塊會預先建立多個子進程(默認爲5個),每一個子進程只有一個線程,當接收到客戶端的請求後,mpm_prefork模塊再將請求轉交給子進程處理,而且每一個子進程同時只能用於處理單個請求。若是當前的請求數將超過預先建立的子進程數時,mpm_prefork模塊就會建立新的子進程來處理額外的請求。Apache老是試圖保持一些備用的或者是空閒的子進程用於迎接即將到來的請求,這樣客戶端的請求就不須要在接收後等候子進程的產生。ide

⑵prefork在效率上要比worker要高,可是內存使用大多不擅長處理高併發的場景高併發

⑶Apache在prefork工做模式下影響性能的重要參數說明:性能

#prefork MPMspa

<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服務

二、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、簡單來講,就是一個程序至少有一個進程,一個進程至少有一個線程

    線程的劃分尺度小於進程,使得多線程程序的併發性高

    進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率

三、Event模式

這是Apache最新的工做模式,是worker模式的變種,它把服務進程從鏈接中分離出來,worker模式不一樣的是在於它解決了,keep-alive長鏈接的時候佔用線程資源被浪費的問題,在event工做模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢後,又容許它釋放。這加強了在高併發場景下的請求處理。event模式不能很好的支持https的訪問

相關文章
相關標籤/搜索