Apache優化相關

Apache所運行的硬件環境都是對性能影響最大的因素,即使不能對硬件進行升級,也最好給Apache一個單獨的主機以免受到其他應用的干擾。各個硬件指標中,對性能影響最大的是內存,對於靜態內容(圖片、JavaScript文件、css文件等)它決定了Apache可以緩存多少內容,它緩存的內容越多,在硬盤上讀取內容的機會就會越少,大內存可以極大提高靜態站點的速度;
對動態高負載站點來說,每個請求保存的時間更多一些,Apache的mpm模塊會爲每個請求派生出相應的進程或線程分別處理,而進程或線程的數量與內存的消耗近似成正比,因此增大內存對提高動態站點的負載和運行速度也極爲有利。
其次是硬盤的速度,靜態站點尤爲突出,Apache不斷的在讀取文件併發送給相應的請求,硬盤的讀寫是極其頻繁的;動態站點也要不斷的加載web程序(php等),一個請求甚至要讀取十幾個文件才能處理完成,因此儘可能的提高硬盤速度和質量對提高Apache的性能是有積極意義的。
最後CPU和網絡,CPU影響的是web程序執行速度,網絡影響流量大小。

Apache的幾種工作模式:

查看Apache的工作模式:

### httpd –v
或者
### httpd  -l

Prefork(非線程型的):

其工作方式爲:當Apache服務器啓動後,mpm_prefork模塊會預先創建多個子進程(默認爲5個),每個子進程只有一個線程,當接受到客戶端的請求後,mpm_prefork模塊再將請求轉交給子進程處理,並且每個子進程同時只能用於處理單個請求。如果當前的請求數將超過預先創建的子進程數時,mpm_prefork模塊就會創建新的子進程來處理額外的請求。這樣客戶端的請求就不需要在接受後等候子進程的產生。
由於在mpm_prefork模塊中,每個請求對應一個子進程,因此其佔用的系統資源相對其他兩種模塊而言較多。不過mpm_prefork模塊的優點在於它的每個子進程都會獨立處理對應單個請求,這樣,如果其中一個請求出現問題就不會影響到其他請求。Prefork在效率上要比work要高,但是內存使用大得多,不擅長處理高併發的場景。在這裏插入圖片描述

<IfModule prefork.c>
StartServers       8		//Apache啓動時默認開始的子進程數
MinSpareServers    5		//最小的閒置子進程數
MaxSpareServers   20			//最大的閒置子進程數
MaxRequestWorkers  250		//設置了允許同時的最大接入請求數量。任何超過MaxRequestWorkers限制的請求將進入等候隊列,在Apache2.3.1以前的版本MaxRequestWorkers被稱爲MaxClients,舊的名字仍舊被支持。
MaxConnectionsPerChild 500 	//設置的是每個子進程可處理的請求數。每個子進程在處理了“MaxConnectionsPerChild”個請求後將自動銷燬。0意味着無限,即子進程

在處理了“MaxConnectionsPerChild”個請求後將自動銷燬。0意味着無限,即子進程永不銷燬。雖然缺省設爲0可以使每個子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:
可防止意外的內存泄漏
在服務器負載下降的時候會自動減少子進程數。因此,可根據服務器的負載來調整這個值。在Apache2.3.9之前稱之爲MaxRequestsPerChild。

同時需要注意的問題如下所示:

(1.)MaxRequestWorkers是這些指令中最爲重要的一個,設定的是Apache可以同時處理的請求,是對Apache性能影響最大的參數。如果請求總數已達到這個值(可通過ps -ef | grep httpd | wc -l)來確認,那麼後面的請求就要排隊,直到某個請求已處理完畢。這就是系統資源還剩下很多而HTTP訪問卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越多,建議將初始值設爲(以MB爲單位的最大物理內存/2),然後根據負載情況進行動態調整。比如一臺4G內存的機器,那麼初始值就是4000/2=2000。
(2.)prefork控制進程在最初建立“StartServers”個子進程後,爲了滿足MinSpareServers設置的需要創建一個進程,等待一秒鐘,繼續創建兩個,再等待一秒鐘,繼續創建四個。。。。如此按指數級增加創建的進程數,最多達到每秒32個,直到滿足MinSpareServers設置的值爲止。這種模式可以不必在請求到來時再產生新的進程,從而減小了系統開銷以增加性能。
MaxSpareServers設置了最大的空閒進程數,如果空閒進程數大於這個值,Apache會自動kill掉一些多餘進程。這個值不要設得過大,但如果設的值比MinSpareServers小,Apache會自動把其調整爲MinSpareServers+1。如果站點負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。
(3.)ServerLimit和MaxClients(MaxRequestWorkers)有什麼區別呢?
是因爲在Apache1時代,控制最大進程數只有MaxClients這個參數,並且這個參數最大值爲256,並且是寫死了的,試圖設置爲超過256是無效的,這是由於Apache1時代的服務器硬件限制的。但是Apache2時代由於服務器硬件的升級,硬件已經不再是限制,所以使用ServerServerLimit這個參數來控制最大進程數,ServerLimit值>=MaxClient值纔有效。ServerLimit要放在MaxClients之前,值要不小於MaxClients。

查看Apache加載的模塊:

# apachectl -t -D DUMP_MODULES
或者
# apachectl –M

修改和啓用prefork參數:

在這裏插入圖片描述
在這裏插入圖片描述
之後重啓httpd即可。

Work模式(多線程進程):

與prefork模式相比,work使用了多進程多線程的混合模式,work模式也同樣會先預派生一些子進程,然後每個子進程創建一些線程,同時包括一個監聽線程,每個請求過來會被分配到一個線程來服務。線程比起進程會更輕量,因爲線程是通過共享父進程的內存空間,因此,內存的佔用會減少一些,在高併發的場景下會比prefork有更多可用的線程,表現會更優秀一些;另外,如果一個線程出現了問題也會導致同一進程下的線程出現問題,如果是多個線程出現問題,也只是影響Apache的一部分,而不是全部。由於用到多進程多線程,需要考慮的線程的安全了,在使用keep-alive長連接的時候,某個線程會一被佔用,即使中間沒有請求,需要等到超時纔會被釋放(該問題在prefork模式下也存在)
總的來說,prefork方式速度要稍高於work,然而它需要的CPU和memory資源也稍多於work。

參數解釋:
# worker MPM
<IfModule mpm_worker_module>
StartServers    3 :#apache啓動時候默認開始的子進程數
MinSpareThreads   75:#最小空閒數量的工作線程
MaxSpareThreads  250:#最大空閒數量的工作線程
ThreadsPerChild   25:#每個子進程產生的線程數量
MaxRequestWorkers  400:#與prefork模式相同
MaxConnectionsPerChild  0:#與prefork模式相同
</IfModul>

注意:
(1.)work由主控制進程生成“StartServers”個子進程,每個子進程中包含固定的ThreadsPerChild線程數,各個線程獨立地處理請求。同樣,爲了不在請求到來時再生成線程,MinSpareThreads和MaxSpareThreads設置了最少和最多的空閒線程數;而MaxRequestWorkers設置了同時連入的clients最大總數。如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程。
MinSpareThreads和 MaxSpareThreads的最大缺省值分別是75和250。這兩個參數
對Apache的性能影響並不大,可以按照實際情況相應調節。
(2.)ThreadsPerChild是worker MPM中與性能相關最密切的指令。ThreadsPerChild的最大缺省值是64,如果負載較大,64也是不夠的。這時要顯示使用ThreadLimit指令,它的最大缺省值是20000。
(3.)worker模式下所能同時處理的請求總數是由子進程總數乘以ThreadsPerChild值決定的,應該大於等於MaxRequestWorkers。如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。默認最大的子進程總數是16,加大時也需要顯示聲明ServerLimit(系統配置的最大進程數量,最大值是20000)。需要注意的是,如歌顯示聲明瞭ServerLimit,那麼它乘以 ThreadsPerChild的值必須大於等於MaxRequestWorkers,而且MaxRequestWorkers必須是ThreadsPerChild整倍數,否則Apache將會自動調節到相應的一個相應值。
(4.)進程與線程的區別
線程是指進程內的一個執行單元,也是進程內的可調度實體。
與進程的區別是:
地址空間:進程內的一個執行單元,進程至少有一個線程,它們共享進程的地址空間,而進程有自己獨立的地址空間。
資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
線程是處理器調度的基本單位,但進程不是
二者均可併發執行
進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。
進程和線程的區別在於:
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程;線程的劃分尺度小於進程,使得多線程程序的併發性高。另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

Event模式:

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

Apache配置參數詳解

(1.)keepAlive On/Off
keepAlive 指的是保持連接活躍,換一句話說,如果將KeepAlive設置爲On,那麼來自同一客戶端的請求就不需要再一次連接,避免每次請求都要新建一個連接而加重服務器的負擔。一般情況下,圖片較多的網站應該把KeepAlive設爲On。
(2.)KeepAliveTimeOutnumber
如果第二次請求和第一次請求之間超過KeepAliveTimeOut的時間的話,第一次連接就會中斷,再新建第二個連接。它的設置一般考慮圖片或者JS等文件兩次請求間隔,一般設置爲3-5秒。
(3.)MaxKeepAliveRequests100
一次連接可以進行的HTTP請求的最大請求次數。將其值設爲0將支持在一次連接內進行無限次的傳輸請求。
事實上沒有客戶程序在一次連接中請求太多的頁面,通常達不到這個上限就完成連接了。
(4.)HostnameLookupson|off|double
如果是使用on,那麼只有進行一次反查,如果用double,那麼進行反查之後還要進行一次正向解析,只有兩次的結果互相符合才行,而off就是不進行域名驗證。如果爲了安全,建議使用double;爲了加快訪問速度,建議使用off;域名查找開啓這個會增加Apache的負擔,減慢訪問速度建議關閉
(5.)timeout 5
推薦5這個是Apache接受請求或者發出相應的時間超過這個時間斷開
注意:以上配置項可在/usr/local/http-2.4.23/conf/extra/httpd-default.conf設置並在httpd.conf文件中通過include選項引用

優化相關:

MPM這個比較關鍵,是影響併發效率的主要因素:
(1.)StartServers 10
設置服務器啓動時建立的子進程數量。因爲子進程數量動態的取決於負載的輕重,所以一般沒有必要調整這個參數。
(2.)MinSpareServers 10
設置空閒子進程的最小數量。所謂空閒子進程是指沒有正在處理的請求的子進程。如果當前空閒子進程數少於MinSpareServers,那麼Apache將以最大每秒一個的速度產生新的子進程。只有在非常繁忙機器上才需要調整這個參數。將此參數設的太大通常是一個壞主意。
(3.)MaxSpareThreads 75
設置空閒子進程的最大數量。如果當前有超過MaxSpareServers數量的空閒子進程,那麼父進程將殺死多餘的子進程。只有在非常繁忙機器上才需要調整這個參數。將此參數設的太大通常是一個壞主意。如果你將該指令的值設置爲比MinSpareServers小,Apache將會自動將其修改成”MinSpareServers+1″。
(4.)ServerLimit 2000
服務器允許配置的進程數上限。只有在你需要將MaxClients設置成高於默認值256的時候才需要使用。要將此指令的值保持和MaxClients一樣。修改此指令的值必須完全停止服務後再啓動才能生效,以restart方式重新啓動將不會生效。
(5.)MaxClients/MaxRequestWorkers 256
用於客戶端請求的最大請求數量(最大子進程數),任何超過MaxClients限制的請求都將進入等候隊列。默認值是256,如果要提高這個值必須同時提高ServerLimit的值。建議將初始值設爲(以MB爲單位的最大物理內存/2),然後根據負載情況進行動態調整。
比如一臺4G內存的機器,那麼初始值就是4000/2=2000。
(6.)MaxRequestsPerChild /MaxConnectionsPerChild0
設置的是每個子進程可處理的請求數,每個子進程在處理了“MaxRequestsPerChild”個請求後將自動銷燬。0意味着無限,即子進程永不銷燬。內存較大的服務器可以設置爲0或較大的數字。內存較小的服務器不妨設置成30、50、100。所以一般情況下,如果你發現服務器的內存直線上升,建議修改該參數試試。
注意:以上配置項可在/usr/local/http-2.4.23/conf/extra/httpd-mpm.conf設置並在httpd.conf文件中通過include選項引用

事例性能調優,模塊啓用/關閉:

(1)啓用壓縮 LoadModule deflate_module modules/mod_deflate.so
(2)啓用重寫 LoadModule rewrite_module modules/mod_rewrite.so
(3)啓用默認擴展,支持在這裏進行修改httpd主要配置 Include conf/extra/httpd-default.conf
(4)提供文件描述符緩存支持,從而提高Apache性能 LoadModule file_cache_module modules/mod_file_cache.so
(5)啓用基於URI鍵的內容動態緩衝(內存或磁盤) LoadModule cache_module modules/mod_cache.so
(6)啓用基於磁盤的緩衝管理器 LoadModule cache_disk_module modules/mod_cache_disk.so
(7)基於內存的緩衝管理器 LoadModule socache_memcache_module modules/mod_socache_memcache.so
(8)屏蔽所有不必要的模塊
#LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule authn_socache_module modules/mod_authn_socache.so #LoadModule authn_core_module modules/mod_authn_core.so
(9)已經過時屏蔽 #LoadModule autoindex_module modules/mod_autoindex.so (10)用於定義缺省文檔index.php、index.jsp等 LoadModule dir_module modules/mod_dir.so
(11)用於定義記錄文件格式 LoadModule log_config_module modules/mod_log_config.so
(12)定義文件類型的關聯 LoadModule mime_module modules/mod_mime.so
(13)減少10%左右的重複請求 LoadModule expires_module modules/mod_expires.so
(14)允許apache修改或清除傳遞到cgi或ssi頁面的環境變量 LoadModule env_module modules/mod_env.so
(15)根據客戶端請求頭字段設置環境變量,如果不需要則屏蔽掉 #LoadModule setenvif_module modules/mod_setenvif.so
(16)生成描述服務器狀態的頁面 #LoadModule status_module modules/mod_status.so
(17)別名 LoadModule alias_module modules/mod_alias.so
(18)url地址重寫模塊 LoadModule rewrite_module modules/mod_rewrite.so (19)jk_mod 負載均衡調度模塊 LoadModule jk_module modules/mod_jk.so (20)過濾模塊,使用緩存必須啓用過濾模塊 LoadModule filter_module modules/mod_filter.so
(21)關閉服務器版本信息 LoadModule version_module modules/mod_version.so (22)自動修正用戶輸入的url錯誤 LoadModule speling_module modules/mod_speling.so

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章