1. 程式人生 > >Windows系統下Apache效能優化,提高併發

Windows系統下Apache效能優化,提高併發

在Windows系統上面按以往Unix/linux的經驗配置Apache時,由於Windows的記憶體回收機制和程序管理的不同,會發現許多新問題。前些時單位的網站需要搬遷到新的Windows伺服器,筆者在除錯過程中也碰上了許多問題。新系統是Windows 2003 Server,為了滿足網站高負荷的要求,在調整Apache引數時發現程序經常佔用記憶體過多導致當機。經過不斷的優化和修改引數組合,終於讓伺服器穩定下來,可以滿足大量訪問的考驗和應用要求。筆者總結了除錯過程中的問題和解決辦法如下,以供有類似需求的網管員參考(系統環境為Windows Server 2003和apache2.2.8):1、http-mpm.conf設定
Apache的執行緒數控制檔案為http-mpm.conf,在conf/exrtra目錄下面,要使該配置檔案起作用需要在httpd.conf 中將 Include conf/extra/httpd-mpm.conf前#去掉,以使得http-mpm.conf生效。在Windows系統中,起作用的是Winnt mpm段, <IfModule mpm_winnt_module>
ThreadsPerChild      150
MaxRequestsPerChild    0
</IfModule>
以上是預設的配置,一般情況下夠用了,但負荷較大的網站就需要修改了,否則訪問網站會變慢或沒有響應。實際設定中可以根據apache-status檢視apache實時連線狀態,檢視其中執行緒佔用數目情況來進行相應的調整,我的伺服器最後設定如下:
<IfModule mpm_winnt_module>
#ThreadLimit     350
ThreadsPerChild    350
MaxRequestsPerChild    10000
Win32DisableAcceptEx
</IfModule>
其中ThreadLimit是佔用系統執行緒數限制,修改後會在apache-status中直接看到效果,就是對應的最大的可用執行緒數(如下所示):1 requests currently being processed, 349 idle workers
對於mpm_winnt,ThreadLimit的預設值是1920;對於其他mpM這個值是64。

注意:Apache在編譯時內部有一個硬性的限制"ThreadLimit 20000"(對於mpm_winnt是"ThreadLimit 15000"),你不能超越這個限制。ThreadsPerChlid是Apache程序的子執行緒數,這個指令設定了每個子程序建立的執行緒數。子程序在啟動時建立這些執行緒後就不再建立新的執行緒了。如果使用一個類似於mpm_winnt只有一個子程序的mpM,這個數值要足夠大,以便可以處理可能的請求高峰。如果使用一個類似於worker有多個子程序的mpM,每個子程序所擁有的所有執行緒的總數要足夠大,以便可以處理可能的請求高峰。
該引數需要根據 apache-status實時的監控情況來調節,太大會導致記憶體增長過快,直到伺服器當機,太小會導致伺服器連線佇列在高峰期時佔滿,從而導致網站連線 慢。同時我們應該修改另一個配置檔案httpd-default.php中的超時設定來配合這個引數。
對於mpm_winnt,ThreadsPerChild的預設值是64;對於其他mpM是25。MaxRequestsPerChild是程序的最大的請求數目,既指網站收到請求的快取數。設定太小了會影響伺服器效能,因為會佔用較多cpu時間,太大了則會佔用記憶體資源。一般大型的網站檔案個數都是成千上萬,所以管理員應該根據網站情況自己設定。
MaxRequestsPerChild指令設定每個子程序在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子程序將會結束。如果MaxRequestsPerChild為"0",子程序將永遠不會結束。
在mpm_netware和mpm_winnt上的預設值是"0"。
將MaxRequestsPerChild設定成非零值有兩個好處:
a)可以防止(偶然的)記憶體洩漏無限進行,從而耗盡記憶體。
b)給程序一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動程序的數量。
注意:對於KeepAlive連結,只有第一個請求會被計數。事實上,它改變了每個子程序限制最大連結數量的行為。Win32DisableAcceptEx加入該語句是為了解決一些警告:
[warn] (OS 64)指定的網路名不再可用。 : winnt_accept: Asynchronous AcceptEx failed。 2、httpd-default.conf設定在httpd.conf中去掉Include conf/extra/httpd-default.conf前的#以使httpd-default.php生效。我們需要調節以下引數:Timeout 20
該引數為連線超時,預設的300秒顯然太大,縮小該引數就會減少同時連線數,即使用者實際佔用的執行緒數,這樣就可以起到配合上面ThreadsPerChlid引數的作用。KeepAlive On
該引數為是否保持活連線,目前網站中一個頁面一般會包含多個檔案,所以相應使用者訪問時會有多個請求,因此開啟可以提高伺服器效能。MaxKeepAliveRequests 50
該引數為最大的活連線請求數,可以根據網頁實際包含的檔案數目自行調節。KeepAliveTimeout 5
該引數為活連線的超時時間,一般只要設定成小於Timeout即可。這樣設定後,Apache在響應請求和防止惡意攻擊方面就取得較為平衡的效果,當然由於記憶體回收機制和程序管理不同,Windows下長期執行 Apache還是不如Unix穩定,因此我們可以讓Apache在每天凌晨訪問人數少時自動重啟一次,以回收資源。用Windows自帶的計劃任務就可以 簡單的實現。這樣,我們就使Apache在Windows平臺下像Unix一樣長期穩定的提供服務了。windows下apache及mysql定時自動重啟&伺服器定時自動重啟有時候覺得,伺服器執行時間過長,造成伺服器記憶體等壓力過大。因此,不用重新啟動伺服器的情況下,完成apache和mysql的記憶體釋放,是非常有益處的(把重啟時間設定在訪問量最低的)。
首先,apache的重新啟動。有兩種apache自動定時重啟的方法(兩種,第二種可一同時啟動apache和mysql,所以推薦一下第二種):第一種、使用任務計劃
開始>>程式>>附件>>管理工具>>任務計劃
新增任務計劃>>下一步>>apache restart>>選擇時間(可以設定的為每天凌晨2-4點)>>一路確定即可。第二種(個人覺得比較簡單,同樣也是任務計劃) 採用at命令新增計劃任務1、在c:盤根目錄新建一個apacheautostart.bat檔案,然後右鍵編輯,將檔案內容設為如下後儲存:
@ECHO OFF
net stop apache2
net start apache2
net stop mysql
net start mysql
(附加說明:上面的apache2與mysql為服務名稱。)2、“開始”-》執行“cmd”-》執行命令“at 04:00 c:\apacheautostart.bat”
這樣每天早晨4點系統就會自動重啟apache與mysql
(附加說明:04:00為重啟時間,c:\autostartserver.bat為第一步的bat檔案地址)mysql的重新啟動,也通過上面at命令方法重新啟動了,所以推薦一下第二種方法。——————————————————————————–同樣,你也可一給自己的伺服器加上一個定時自動重啟的功能(比如每週重新啟動伺服器一次)。可以用at命令和shutdown命令配合實現。AT命令可以安排在特定日期和時間執行命令和程式,shutdown則可以在命令列下關閉並重啟計算機,要在每週日的特定時間自動重啟計算機,只需 在命令提示符下輸入“at 02:00 /every:星期一 shutdown /l /r /y /c”,這將在每週一的凌晨2點自動重啟計算機。有關at命令和shutdown命令的更詳盡資訊,請在Windows Server 2003的命令提示符下輸入“at /?”和“shutdown /?”獲得,或者在http://support.microsoft.com/kb/317371/zh-cn,也有微軟官方知識庫中的相關文章。    本文原文出處飄易沒有找到,原作者如有看到,請留下網址,我會補充連結進來。    【Windows下如何開啟 apache的 apache-status監控功能】:httpd.conf中,載入模組: 
把 LoadModule status_module modules/mod_status.so 這句加上,如果前面有帶#號,開啟的話,需要將#去除,並加入:
<location /server-status>
         SetHandler server-status
         Order Deny,Allow
         Deny from all
         Allow from localhost
</location>
ExtendedStatus On
這是一個完整的server-status的配置。
配置完成,重新啟動apache即可(注意,不能直接restart,而要先stop,再start)可以用http://localhost/server-status來訪問,同時
http://localhostm/server-status?refresh=N將表示訪問狀態頁面可以每N秒自動重新整理一次;
Deny from表示禁止的訪問地址;
Allow from表示允許的地址訪問;
ExtendedStatus On 表示的是待會訪問的時候能看到詳細的請求資訊,另外該設定僅能用於全域性設定,不能在特定的虛擬主機中開啟或關閉。啟用擴充套件狀態資訊將會導致伺服器執行效率降低。【補充】:
1、關於Apache引數ThreadsPerChild 和 MaxRequestsPerChild 的說明詳見官方網址:http://httpd.apache.org/docs/2.2/mod/mpm_common.html
2、中文版 Apache mpM指令:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mpm_common.html