發新話題

Apache 調整、優化方法:性能優化

Apache 調整、優化方法:性能優化

Apache 幾目前Internet上使用最為廣泛的Web服務器。它具有比商業Web服務器不遑多讓的功能與速度,同時安裝與設置也十分簡單,正是這些特性讓它成為市場佔有率最高的Web服務器軟件。不過Apache安裝簡單,並不意味著簡單地安裝就可以適用於絕大多數應用環境,在高負荷的Web站點,Apache 還需要進行調整、優化......

優化方法:
Apache的配置文件是httpd.conf。Windows下該文件位於 Apache安裝目錄的Conf子目錄下,RedHat Enterprise Linux AS 3.0 Update 2位於/etc/httpd/conf。通過調整該文件的某些參數,可以優化Apache的運行效率。

為了驗證後文Apache參數的調整是否起作用,我們通常用Apache附帶的ab(Apache Bench)對其進行壓力測試。

ab最常用的語法格式是這樣的:
ab -n XXX -c YYY -k http://hostname.port/path/filename

其中:
-n XXX:
表示最多進行XXX次測試。也就是下載filename文件XXX次。

-c YYY:
客戶端並發連接個數。

-k:   
啟用HTTP KeepAlive功能。默認不啟用KeepAlive功能。

比如我們要對http://hostname:port/file.com下載10000次進行測試,並發訪問為60個,啟用HTTP KeepAlive功能,則訪問指令為:

ab -n 10000 -c 60 -k http://hostname:port/file.htm

測試平台
在本次優化過程中。筆者採用了兩台電腦進行壓力測試。其中一台為客戶端,運行ab發送請求,另外一台為服務器,安裝有Apache提供Web服務。

1.服務器配置
服務器端,筆者採用了較低端的配置。這樣更容易通過ab測試看來調整參數後的效果:

CPU:      Intel Celeron 1.0GHz
內存:    512MB SRAM 100MHz
硬盤:    Maxtor 4D040H2
網卡:    D-Link DFE 530TX

服務器端筆者安裝兩種操作系統:Windows Server 2003 Enterprise Edition並升級到最新的Hotfix。Apache服務器版本為2.0.50;或者RedHat Enterprise Linux AS 3.0 Update 2。

2.客戶端配置
為了使評測的瓶頸不在客戶端,筆者客戶端配置要比服務器端好,具體硬件配置如下:
CPU:      P4 3.0GHz 533MHz 打開了HT支持
內存:    512MB DDR 400
硬盤:    WD1200JB-00CRA1
網卡:    D-Link DFE 530TX

客戶端安裝有RedHat Enterprise Linux AS 3.0 Update 2。並利用其中的ab來進行性能測試。

通用優化技巧:
對於Apache服務器來說,為了提高性能需要進行的某些參數調整具有通用性,也就是說只要採用了就可以使其性能更好。

1.關閉DNS和名字解析
* HostnameLookups on | off | double

Apache 1.3之前HostnameLookups默認是打開的。這樣客戶端在訪問服務器時,服務器將要解析客戶端的主機名,並將其保存在日誌文件中。對客戶端進行域名反向解析會大幅降低服務器速度,所以最好將其設置為Off。關閉指令如下:

HostnameLookups off

* UseCanonicalName on | off | dns

打開UseCanonicalName是Web服務器的標準做法。這是因為客戶發送的大部分請求都是對本服務器的引用,打開該項設置就能使用 ServerName和Port選項的設置內容構建完整的URL。如果將這個參數設置為Off,那麼Apache將使用從客戶請求中獲得服務器名字和端口值,重新構建URL。

如果你不需要在Apache中架設虛擬主機,建議設置為:

UseCanonicalName on

2.關閉多餘模塊

Apache 採用了模塊化設計,管理員可以有選擇地加載一些模塊來加強服務器的功能。這些模塊,可以在創建服務器時靜態編譯到服務器的二進制代碼中,也可以編譯成一些獨立服務器程序的Dynamic Shared Objects(DSO)文件,在Apache啟動的時候根據需要,動態加載。事實證明,不加載多餘的模塊總是可以提高Apache的性能。

Apache的DSO模塊是在httpd.conf中以:

LoadModule access_module modules/mod_access.so

方式加載。當不需要某個模塊時,只要在其前添加「#」,註釋掉該行。

一般來說,不需要加載以下模塊:

mod_include.so:
服務器端包含,是一種已經過時的技術。

mod_autoindex.so:
如果不希望Apache列目錄顯示,可以刪除。

mod_access.so、mod_auth.so:
如果你不需要進行安全驗證,也沒有必要加載。

最好加載以下模塊:

mod_dir.so:
用於定義缺省文檔index.php、index.jsp等。

mod_log_config.so:
用於定義記錄文件格式。

mod_mime.so:
定義文件類型的關聯。

最後需要說明一點的是,並不是加載所有的模塊都會降低Apache性能。比如mod_zip可以把文件壓縮之後再傳給客戶端,這樣就可以減少40%左右的網絡流量,而mod_expires則可以減少10%左右的重複請求。

3.取消.htaccess驗證

除非你確定需要使用.htaccess文件來控制客戶端對相應目錄的訪問權限,否則設置「AllowOverride None」,可以免除Apache在每個目錄搜索.htaccess文件之苦。

4.取消符號鏈接

FollowSymLinks 允許使用符號連接,這將使用瀏覽器有可能訪問文檔根目錄(DocumentRoot)之外的內容,並且只有符號連接的目的與符號連接本身為同一用戶所擁有時(SymLinksOwnerMatch),才允許訪問,這個設置將增加一些安全性,但將耗費Apache大量的資源。

筆者建議:

Options FollowSymLinks

但是不要啟用SymLinksOwnerMatch。

5.打開KeepAlive支持

在HTTP 1.0中和Apache服務器的一次連接只能發出一次HTTP請求,而KeepAlive參數支持HTTP 1.1版本的一次連接,多次傳輸功能,這樣就可以在一次連接中發出多個HTTP請求。從而避免對於同一個客戶端需要打開不同的連接。很多請求通過同一個 TCP連接來發送,可以節約網絡和系統資源。

在Apache的配置文件httpd.conf中,設置:

KeepAlive on
KeepAliveTimeout 15

這樣就能限制每個連接的保持時間是15秒。在我們的評測中發現,打開KeepAlive之前,ab測試的數據為:

Requests per second:    201.32 [#/sec] (mean)
Time per request:      298.031 [ms] (mean)
Time per request:      4.967 [ms] (mean, across all concurrent requests)
Transfer rate:          839.49 [Kbytes/sec] received

而打開KeepAlive支持之後,ab測試數據為:

Requests per second:    341.70 [#/sec] (mean)
Time per request:      175.594 [ms] (mean)
Time per request:      2.927 [ms] (mean, across all concurrent requests)
Transfer rate:          1437.04 [Kbytes/sec] received

最能反應Apache服務器性能的Requests per second,即每秒完成的請求次數從201.32提升到341.70,提升幅度為70%。雖然在現實環境中,不可能有這麼多的同一連接發出的請求,但啟用KeepAlive確實在一定程度上可以提高Apache服務器的吞吐量和反應速度。

另外,可以設置:

MaxKeepAliveRequests 100

把 MaxKeepAliveRequests設置的儘量大,可以在一次連接中進行更多的HTTP請求。但在我們的測試中還發現,把 MaxKeepAliveRequests設置成1000,則評測的客戶端容易出現「Send requesttimed out」的錯誤,所以具體數值還要根據自己的情形來設置。

參數決定性能

Apache除了可以通過一些常規方式進行優化外,還需要調整其運行參數,這樣才能構建一個適合相應網絡環境的Web服務。這些指令從兩個級別對Apache進行了優化。

* 進程級(Process-level)

進程級的參數用來控制Apache相應的客戶端請求的進程數Process(在Windows下稱之為線程數,threads)。

* 協議級(Protocol-level)

協議級的指令則用來控制Apache與客戶端的連接多久才自動斷開。

由於Windows和Linux/UNIX設計原理的不同,所以進程級的指令根據Apache是工作在Linux/UNIX或者Windows下,而分成兩種。

1.Linux下Apache性能優化

Linux下的Apache預設工作在prefork模式下(由每個進程處理連接請求),這種工作模式也是Apache 1.3系列的工作模式。如果你需要其工作在其他模式下,則需要手工編譯源代碼來實現:

./configure --prefix=/usr/local/apache-2.0.50 --with-mpm=worker --enable-include && make && make install

Linux下進程級的Apache調整參數包括以下五個。
* StartServers
該參數決定Linux啟動時,自動打開的Apache服務器的數目。它對Apache服務器的性能沒有太大的影響。因為如果MinSpareServers設置的比較大,Apache服務器進程數會馬上調整到不小於MinSpareServers的數目。

在Linux下,我們可以通過:
ps aux |grep httpd

來查看當前打開的Apache服務進程數。
* MinspareServers

該參數用於配置在任何時候可用的最小Apache進程個數。一般情況下,當目前可用的Apache進程數不能滿足需求時,Apache會自動打開新進程以服務客戶。所以設置MinspareServers為較大的值只是為了讓在比較繁忙的Web環境,讓Apache可以盡快地滿足客戶端的訪問需求。對於每天有百萬訪問量的網站來說,下面的數值是比較合適的:
MinspareServers 32

* MaxSpareServers

較大的MinSpareServers可以保證Apache有較快的反應速度,過大的MinSpareServers又會佔用更多的系統內存。如果你的系統內存不是很充足或者運行有其他的服務,把MaxSpareServers設置小一些可以為其他服務空出一些內存。當空閒Apache進程超過 MaxSpareServers指定的數值時,Apache主進程會殺掉多餘的空閒進程而保持空閒進程在MaxSpareServers指定的數值。

對於每天百萬訪問量的網站來說,配置大容量的內容,並且設置如下的值是比較合適的:

MaxSpareServers 64

* MaxClients

服務器的處理能力畢竟是有限的,不可能同時處理無限多的連接請求。參數MaxClients就用於規定服務器支持的最多並發訪問的客戶數。

如果MaxClients設置得過大,系統在繁忙時不得不在過多的進程之間來回切換為更多的客戶服務。這樣對每個客戶的反應就會變慢;如果設置得過小,系統繁忙時就會拒絕客戶連接請求。

我們的設想原則是,當服務器性能較高時,可以適當增加這個值的設置。如果繁忙出現拒絕訪問現象,說明需要升級服務器硬件了。

如果你不在意訪問速度,或者認為反應速度慢也總比拒絕連接好,可以把該值設置大一些。

* MaxRequestsPerChild

當設置KeepAlive為off時,Apache服務器是用單獨的子進程為一次連接服務,這樣,每次連接都需要生成、關閉子進程,這些額外的操作浪費了計算機的大量處理能力。最好的方式是一個子進程可以為多次連接請求服務。

但子進程在接受訪問請求時,需要不斷地申請和釋放內存,次數多了就會造成內存垃圾,影響系統穩定性。為瞭解決這個問題,可以規定每一個子進程處理的最大請求數,超過此數值,就讓該子進程退出,再從原始的httpd進程中重新複製一個乾淨的副本,從而提高系統的穩定性。

第個子進程能夠處理服務請求的最大次數由MaxRequestsPerChild定義。RedHat Enterprise Linux AS 3.0 Update 2缺省的設置值為1000這個值比較適合(設置為0支持每個副本進行無限次的服務處理)。

在我們的測試過程中發現,RedHat Enterprise Linux AS 3.0 Update 2下默認配置的Apache並不能很好地應付大負荷站點。我們需要打開KeepAlive,並加大StartServers、 MinSpareServers、MaxSpareServers和MaxClients的數值。這些參數對於Apache性能的改善有很大的影響。

小知識:
RedHat Enterprise Linux AS 3.0 Update 2最大MaxClients只能設置到256。如果你需要設置其為更高,需要在MaxClients前面添加:
ServerLimit xxx
其中xxx不能少於MaxClients的數值。該設置方法適用於Apache 2.0系列。

2.Windows下Apache優化

Windows下,Apache 2.0經過了全新的設計,採用多線程的方式(work)運行。這種運行方式,理論上比Linux/UNIX的Perfork運行模式有更好的性能。

Work模式下由單個控制進程負責子進程的建立。每個子進程可以建立由ThreadsPerChild指定的固定數量的線程。由獨立的線程監聽並處理到來的連接。

在Windows下可以執行「Apache -l」。查看當前工作模式,如果顯示「mpm_winnt.c」,則表示Apache工作在多線程模式下;在Linux下執行「httpd -l」看到「prefork.c」表示工作在子進程模式下。

其配置語句是:
StartServers          2
MaxClients          150
MinSpareThreads      25
MaxSpareThreads      75         
ThreadsPerChild      25
MaxRequestsPerChild    0

Apache 力圖維持一個備用的服務線程池,讓客戶端無須等待線程/進程的建立即可得到處理。最初建立的進程數由StartServers指定。然後Apache會不停地檢測所有Apache進程中空閒線程的總數,並新建或結束進程使總數維持在MinSpareThreads和MaxSpareThreads所指定的範圍以內。但同時可以得到處理的客戶端的最大數量又取決於MaxClients指令,而進程建立的最大數量取決於ServerLimit指令。三者之間的關係為:
ServerLimit*ThreadsPerChild >=MaxClients
具體參數和優化方法這裡由於篇幅所限,不再具體介紹。有興趣的朋友可以參考前文介紹的Linux下的優化進行。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。