記錄幾個點,備忘:

1、Apache優化1:修改最大並發連接數

==>概念:【MPM模塊】Apache是一個跨平臺的、採用模塊化設計的伺服器。為了應對不同的平臺和不同的環境產生的各種不同的需求,也為了在具體的平臺或環境下達到最 佳的效果,Apache在web伺服器的基礎功能方面(埠綁定、接收請求等)也同樣採用了模塊化設計,這個Apache的核心模塊就叫做多路處理模塊 (Multi-Processing Module,簡稱MPM)。

不同操作系統的MPM模塊如下:

  • Windows:mpm_winnt(重點關注
  • Unix/Linux:mpm_prefork(重點關注
  • BeOS:mpm_beos(由Be公司開發的一種多媒體操作系統,官方版已停止更新。瞭解即可,不用關注
  • Netware:mpm_netware(由NOVELL公司推出的一種網路操作系統。瞭解即可,不用關注
  • OS/2:mpmt_os2(一種最初由微軟和IBM共同開發的操作系統,現由IBM單獨開發(微軟放棄OS/2,轉而開發Windows)。瞭解即可,不用關注

==>配置文件位置:Apace安裝目錄/conf/extra/httpd-mpm.conf

  • 注意:默認情況下,Apache的MPM模塊配置文件並沒有啟用。因此,我們需要在httpd.conf文件中啟用該配置文件,如下所示:

# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf (去掉該行前面的注釋符號"#")

==>配置建議:

(1)windows:mpm_winnt

<IfModule mpm_winnt_module>
ThreadsPerChild 150
#推薦設置:小型網站=1000 中型網站=1000~2000 大型網站=2000~3500
#理解:每個子進程的最大並發線程數。
MaxRequestsPerChild 0
#推薦設置:小=10000 中或大=20000~100000
#理解:每個子進程允許處理的請求總數。如果累計處理的請求數超過該值,該子進程將會結束(然後根據需要確定是否創建新的子進程),該值設為0表示不限制請求總數(子進程永不結束)。
#該參數建議設為非零的值,可以帶來以下兩個好處:
#1.可以防止程序中可能存在的內存泄漏無限進行下去,從而耗盡內存。
#2.給進程一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動進程的數量。
</IfModule>

注意:在以上涉及到統計請求數量的參數中,對於KeepAlive的連接,只有第一個請求會被計數。

(2)linux:mpm_perfork/mpm_worker

<IfModule mpm_prefork_module>
StartServers 5
#推薦設置:小=默認 中=20~50 大=50~100
#理解:數量的伺服器進程開始
MinSpareServers 5
#推薦設置:與StartServers保持一致
#理解:最小數量的伺服器進程,保存備用
MaxSpareServers 10
#推薦設置:小=20 中=30~80 大=80~120
#理解:最大數量的伺服器進程,保存備用
MaxClients 150
#推薦設置:小=500 中=500~1500 大型=1500~3000
#理解:最大的請求並發
MaxRequestsPerChild 0
#推薦設置:小=10000 中或大=10000~500000
#理解:最大數量的伺服器進程允許開始
(此外,還需額外設置ServerLimit[最大的進程數]參數,該參數最好與MaxClients的值保持一致。)
</IfModule>

注意:prefork 控制進程在最初建立 「StartServers」個子進程後,為了滿足MinSpareServers設置的需要創建一個進程,等待一秒鐘,繼續創建兩 個,再等待一秒鐘, 繼續創建四個……如此按指數級增加創建的進程數,最多達到每秒32個,直到滿足MinSpareServers設置的值為止。這種模式 可以不必在請求到 來時再產生新的進程,從而減小了系統開銷以增加性能。MaxSpareServers設置了最大的空閑進程數,如果空閑進程數大於這個 值,Apache 會自動kill掉一些多餘進程。這個值不要設得過大,但如果設的值比MinSpareServers小,Apache會自動把其調整 為 MinSpareServers+1。如果站點負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。  MaxRequestsPerChild設置的是每個 子進程可處理的請求數。每個子進程在處理了「MaxRequestsPerChild」個請求後將自 動銷毀。0意味著無限,即子進程永不銷毀。雖然預設 設為0可以使每個子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:

1、可防止意外的內存泄 漏。

2、在伺服器負載下降的時侯會自動減少子進程數。

因此,可根據伺服器的負載來調整這個值。  

MaxRequestWorkers指令集同時將服務請求的數量上的限制。任何連接嘗試在MaxRequestWorkerslimit將通常被排隊,最多若干基於上ListenBacklog指令。

注意:【mpm_worker模塊】 mpm_worker模塊也主要應用於Unix/Linux平臺的Apache伺服器,它可以看作是mpm_prefork模塊的改進版。mpm_worker模塊的工作方式與mpm_prefork模塊類似。不過,由於處理相同請求的情況下,基於進程(例如mpm_prefork)比基於線程的處理方式佔用的系統資源要多。因此,與mpm_prefork模塊不同的是,mpm_worker模塊會讓每個子進程創建固定數量的服務線程和一個監聽線程,並讓每個服務線程來處理客戶端的請求,監聽線程用於監聽接入請求並將其傳遞給服務線程處理和應答。Apache總是試圖維持一個備用或是空閑的服務線程池。這樣,客戶端無須等待新線程或新進程的建立即可得到處理。

與mpm_prefork模塊相比,mpm_worker模塊可以進一步減少系統資源的開銷。再加上它也使用了多進程,每個進程又有多個線程,因此它與完全基於線程的處理方式相比,又增加了一定的穩定性

<IfModule mpm_worker_module>
StartServers 2
#推薦設置:小=默認 中=3~5 大=5~10
#理解:啟動Apache時創建的子進程數。
MaxClients 150
#推薦設置:小=500 中=500~1500 大型=1500~3000
MinSpareThreads 25
#推薦設置:小=默認 中=50~100 大=100~200
#理解:處於空閑狀態的最小線程數。
#注意:不同的MPM對這個指令的處理是不一樣的:
#mpm_worker的默認值是75。
#這個MPM將基於整個伺服器監視空閑線程數。如果伺服器中總的空閑線程數太少,子進程將產生新的空閑線程。mpm_netware的默認值是10。既然這個MPM只運行單獨一個子進程,此MPM當然亦基於整個伺服器監視空閑線程數。mpm_beos和mpmt_os2的工作方式與mpm_netware差不多,mpm_beos的默認值是1;mpmt_os2的默認值是5。
MaxSpareThreads 75
#推薦設置:小=默認 中=80~160 大=200~400
#理解:處於空閑狀態的最大線程數。
#注意:不同的MPM對這個指令的處理是不一樣的:
#mpm_worker的默認值是250。
#這個MPM將基於整個伺服器監視空閑線程數。如果伺服器中總的空閑線程數太多,子進程將殺死多餘的空閑線程。mpm_netware的默認值是100。既然這個MPM只運行單獨一個子進程,此MPM當然亦基於整個伺服器監視空閑線程數。mpm_beos和mpmt_os2的工作方式與mpm_netware差不多,mpm_beos的默認值是50;mpmt_os2的默認值是10。
ThreadsPerChild 25 #推薦設置:小=默認 中=50~100 大型=100~200
MaxRequestsPerChild 0 #推薦設置:小=10000 中或大=10000~50000
(此外,如果MaxClients/ThreadsPerChild大於16,還需額外設置ServerLimit參數,ServerLimit必須大於等於 MaxClients/ThreadsPerChild 的值。)
</IfModule>

備註:ServerLimit表示Apache允許創建的最大進程數。 值得注意的是,Apache在編譯時內部有一個硬限制ServerLimit 20000(對於mpm_prefork模塊為ServerLimit 200000)。你不能超越這個限制。使用這個指令時要特別當心。如果將ServerLimit設置成一個高出實際需要許多的值,將會有過多的共享內存被分配。如果將ServerLimit和MaxClients設置成超過系統的處理能力,Apache可能無法啟動,或者系統將變得不穩定。

注意:在配置相關參數時,請先保證伺服器具備足夠的硬體性能(例如:CPU、內存等)。 如果發現自啟動後,隨著伺服器的運行時間增加,伺服器的內存佔用也隨之增加,可能是程序中出現內存泄露,請向下調整參數MaxRequestsPerChild的值以降低內存泄露帶來的影響,然後儘快找出程序中的問題之所在。

配置優化摸索中:持續更新。歡迎大牛賜教配置優化方案。


推薦閱讀:
查看原文 >>
相關文章