Apache 配置的性能调优
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
? ? ? ? ? Apache是基于模塊化的設(shè)計(jì),因此可以輕松添加和移除特性。在 Apache 的核心,多處理模塊(Multi-Processing Module,MPM)提供了這種模塊化功能性 —— 管理網(wǎng)絡(luò)連接、調(diào)度請求。MPM使其能夠使用線程。擴(kuò)展模塊化設(shè)計(jì)有兩個(gè)重要好處:Apache可以更簡潔、有效地支持多種操作系統(tǒng);服務(wù)器可以按站點(diǎn)的特殊需要進(jìn)行自定制。 ?
? ? ? ? ??每個(gè)請求使用一個(gè)進(jìn)程的傳統(tǒng)模型稱為 prefork。 較新的線程化模型稱為 worker,它使用多個(gè)進(jìn)程,每個(gè)進(jìn)程又有多個(gè)線程,這樣就能以較低的開銷獲得更好的性能。
? ? ? ? ? 默認(rèn)安裝完apache,查看使用的的是哪種模型:
root@10.1.1.200:~# /usr/sbin/apache2ctl -l Compiled in modules:core.cmod_log_config.cmod_logio.cprefork.chttp_core.cmod_so.c ? ? ? ? ? 以上看到了prefork(如果看到worker.c說明使用的MPM的worker)? ? ? ? ? prefork就是Unix平臺上缺省的MPM,prefork用單獨(dú)的子進(jìn)程來處理不同的請求,進(jìn)程之間是彼此獨(dú)立的,這也使其成為最穩(wěn)定的MPM之一。
? ? ? ? ? 查看prefork在apache里的默認(rèn)配置
root@10.1.1.200:~# cat /etc/apache2/apache2.conf <IfModule mpm_prefork_module>StartServers 5MinSpareServers 5MaxSpareServers 10MaxClients 150MaxRequestsPerChild 0 </IfModule> ? ? ? ? ? prefork模型原理會為每個(gè)請求創(chuàng)建一個(gè)新進(jìn)程。多余的進(jìn)程保持空閑,以處理傳入的請求,這縮短了啟動延遲。這里預(yù)先建立完成控制進(jìn)程在最初建立“StartServers“個(gè)子進(jìn)程后,為了滿足”MinSpareServers“設(shè)置的需要?jiǎng)?chuàng)建若干進(jìn)程,直到滿足”MinSpareServers“設(shè)置的值為止。這就是預(yù)派生(prefork)的由來。這種模式可以不必在請求到來時(shí)再產(chǎn)生新的進(jìn)程,從而減小了系統(tǒng)開銷以增加性能。??
? ? ? ? ?"MaxSpareServers"設(shè)置了最大的空閑進(jìn)程數(shù),如果空閑進(jìn)程數(shù)大于這個(gè)值,Apache會自動kill掉一些多余進(jìn)程。這個(gè)值不要設(shè)得過大,但如果設(shè)的值比”MinSpareServers“小,Apache會自動把其調(diào)整為MinSpareServers+1。如果站點(diǎn)負(fù)載較大,可考慮同時(shí)加大“MinSpareServers”和“MaxSpareServers”。
? ? ? ? ??”MaxRequestsPerChild“設(shè)置的是每個(gè)子進(jìn)程可處理的請求數(shù)。每個(gè)子進(jìn)程在處理了“MaxRequestsPerChild” 個(gè)請求后將自動銷毀。0意味著無限,即子進(jìn)程永不銷毀。雖然缺省設(shè)為0可以使每個(gè)子進(jìn)程處理更多的請求,但如果設(shè)成非零值也有兩點(diǎn)重要的好處:可防止意外的內(nèi)存泄漏;在服務(wù)器負(fù)載下降的時(shí)侯會自動減少子進(jìn)程數(shù).
? ? ? ? ? "MaxClients"是這些指令中最為重要的一個(gè),設(shè)定的是Apache可以同時(shí)處理的請求,是對Apache性能影響最大的參數(shù)。其缺省值 150是遠(yuǎn)遠(yuǎn)不夠的,如果請求總數(shù)已達(dá)到這個(gè)值(可查詢ps -ef|grep apache|wc -l),那么后面的請求就要排隊(duì),直到某個(gè)已處理請求完畢。這就是為什么系統(tǒng)資源還剩下很多而HTTP訪問卻還很慢。?
? ? ? ? ? ?如果 MaxClients設(shè)置 過高,那么所有客戶機(jī)也將體驗(yàn)到糟糕的服務(wù),因?yàn)?Web 服務(wù)器會試圖換出一個(gè)進(jìn)程,以使另一個(gè)進(jìn)程能夠運(yùn)行。而設(shè)得過低意味著可能會不必要地拒絕服務(wù)。MaxClients 的值超過 256,必須將 ServerLimit 也設(shè)為同樣的數(shù)值.ServerLimit是活動子進(jìn)程數(shù)量的硬限制.
? ? ? ? ? ?以下是經(jīng)過調(diào)整優(yōu)化了參數(shù)配置:
root@10.1.1.200:~# cat /etc/apache2/apache2.conf <IfModule mpm_prefork_module>ServerLimit 2000StartServers 10MinSpareServers 10MaxSpareServers 15MaxClients 2000MaxRequestsPerChild 10000 </IfModule>
? ? ? ? ? ? worker的默認(rèn)配置:
root@10.1.1.200:~# cat /etc/apache2/apache2.conf <IfModule mpm_worker_module>StartServers 2MaxClients 150MinSpareThreads 25MaxSpareThreads 75 ThreadsPerChild 25MaxRequestsPerChild 0 </IfModule>? ? ? ? ? ?worker的工作原理是,由主控制進(jìn)程生成“StartServers”個(gè)子進(jìn)程,每個(gè)子進(jìn)程中包含固定的ThreadsPerChild 線程數(shù),各個(gè)線程獨(dú)立地處理請求。同樣,為了不在請求到來時(shí)再生成線程,MinSpareThreads和MaxSpareThreads設(shè)置了最少和最多的空閑線程數(shù);而"MaxClients"設(shè)置了所有子進(jìn)程中的線程總數(shù)。如果現(xiàn)有子進(jìn)程中的線程總數(shù)不能滿足負(fù)載,控制進(jìn)程將派生新的子進(jìn)程。?
? ? "MinSpareThreads"和"MaxSpareThreads"的最大缺省值分別是75和250。這兩個(gè)參數(shù)對Apache的性能影響并不大,可以按照實(shí)際情況相應(yīng)調(diào)節(jié)。?
? ??"ThreadsPerChild"是worker MPM中與性能相關(guān)最密切的指令。這個(gè)指令設(shè)置了每個(gè)進(jìn)程建立的進(jìn)程數(shù)。子進(jìn)程在啟動時(shí)建立這些線程后就不在建立新的線程了。每個(gè)進(jìn)程所擁有的所有線程的總數(shù)足夠大,以便可以處理可能的請求高峰。
? ? ? ? ? ?worker模式下所能同時(shí)處理的請求總數(shù)是由子進(jìn)程總數(shù)乘以"ThreadsPerChild"值決定的,應(yīng)該大于等于"MaxClients"。如果顯式聲明了"ServerLimit",那么它乘以ThreadsPerChild的值必須大于等于"MaxClients",而且"MaxClients"必須是"ThreadsPerChild"的整數(shù)倍,否則Apache將會自動調(diào)節(jié)到一個(gè)相應(yīng)值(可能是個(gè)非期望值).
? ? ? ? ?? 以下是經(jīng)過調(diào)整優(yōu)化了參數(shù)配置:
root@10.1.1.200:~# cat /etc/apache2/apache2.conf <IfModule mpm_worker_module> StartServers 3 MaxClients 2000 ServerLimit 25 MinSpareThreads 50 MaxSpareThreads 200 ThreadLimit 200 ThreadsPerChild 100 MaxRequestsPerChild 0 </IfModule>
查看Apache的并發(fā)請求數(shù)及其TCP連接狀態(tài):?
root@10.1.1.200:~# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' CLOSE_WAIT 2 TIME_WAIT 21 LAST_ACK 5 SYN_RECV 20 ESTABLISHED 1609 SYN_SENT 2 FIN_WAIT1 51 FIN_WAIT2 200其中的SYN_RECV表示正在等待處理的請求數(shù);ESTABLISHED表示正常數(shù)據(jù)傳輸狀態(tài);TIME_WAIT表示處理完畢,等待超時(shí)結(jié)束的請求數(shù)。
狀態(tài):描述?
CLOSED:無連接是活動的或正在進(jìn)行?
LISTEN:服務(wù)器在等待進(jìn)入呼叫?
SYN_RECV:一個(gè)連接請求已經(jīng)到達(dá),等待確認(rèn)?
SYN_SENT:應(yīng)用已經(jīng)開始,打開一個(gè)連接?
ESTABLISHED:正常數(shù)據(jù)傳輸狀態(tài)?
FIN_WAIT1:應(yīng)用說它已經(jīng)完成?
FIN_WAIT2:另一邊已同意釋放?
ITMED_WAIT:等待所有分組死掉?
CLOSING:兩邊同時(shí)嘗試關(guān)閉?
TIME_WAIT:另一邊已初始化一個(gè)釋放?
LAST_ACK:等待所有分組死掉
轉(zhuǎn)載于:https://my.oschina.net/davehe/blog/97335
總結(jié)
以上是生活随笔為你收集整理的Apache 配置的性能调优的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenGL中使用glutDisplay
- 下一篇: [120_移动开发Android]005