NO IMAGE
apache伺服器的time_wait過多 fin_wait1過多等問題2009-01-16 16:591。time_wait狀態過多。
    通常表現為apache伺服器負載高,w命令顯示load average可能上百,但是web服務基本沒有問題。同時ssh能夠登陸,但是反應非常遲鈍。
原因:最可能的原因是httpd.conf裡面keepalive沒有開,導致每次請求都要建立新的tcp連線,請求完成以後關閉,增加了很多time_wait的狀態。另,keepalive可能會增加一部分記憶體的開銷,但是問題不大。也有一些文章討論到了sysctl裡面一些引數的設定可以改善這個問題,但是這就捨本逐末了。

2。fin_wait1狀態過多。fin_wait1狀態是在server端主動要求關閉tcp連線,並且主動傳送fin以後,等待client端回覆ack時候的狀態。fin_wait1的產生原因有很多,需要結合netstat的狀態來分析。
netstat -nat|awk ‘{print awk $NF}’|sort|uniq -c|sort -n
上面的命令可以幫助分析哪種tcp狀態數量異常
netstat -nat|grep “:80″|awk ‘{print $5}’ |awk -F: ‘{print $1}’ | sort| uniq -c|sort -n
則可以幫助你將請求80服務的client ip按照連線數排序。
回到fin_wait1這個話題,如果發現fin_wait1狀態很多,並且client ip分佈正常,那可能是有人用肉雞進行ddos攻擊、又或者最近的程式改動引起了問題。一般說來後者可能性更大,應該主動聯絡程式設計師解決。
但是如果有某個ip連線數非常多,就值得注意了,可以考慮用iptables直接封了他。
 
apache如何限制使用者執行緒數?2009-01-15 13:37限制客戶端一個IP同時連線數,實際應用:限制flashget,網路螞蟻等軟體只有2個程序有效
apache如何限制使用者執行緒數?
限制客戶端一個IP同時連線數,實際應用:限制flashget,網路螞蟻等軟體只有2個程序有效。
(註釋:/opt/httpd/是我的apache的安裝目錄,大家可以自行改成自己的路徑)
首先,從http://dominia.org/djao/下載mod_limitipconn-0.22.tar.gz
上傳解壓後執行
#/opt/httpd/bin/apxs -c -i -a mod_limitipconn.c 將此外部DSO模組編譯入Apache
檢查/opt/httpd/modules是否有mod_limitipconn.so模組
配置apache配置檔案,找到相應位置,如下:
LoadModule limitipconn_module modules/mod_limitipconn.so
#

MaxConnPerIP 2

並將#ExtendedStatus On的註釋去掉
重啟Apache,檢查是否可限制單一IP多個併發連線
測試效果,用flashget下載,預設是5個螞蟻,只有2個可以連線並進行下載,其他的3個始終連線不上!--成功!!!
 
 
Apache效能優化2009-01-15 13:32Tunning 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下的優化進行。

Apache伺服器的優化-模式設定2009-01-15 12:08伺服器的優化
(MPM: Multi-Processing Modules)
apache2主要的優勢就是對多處理器的支援更好,在編譯時同過使用–with-mpm選項來決定apache2的工作模式。如果知道當前的apache2使用什麼工作機制,可以通過httpd -l命令列出apache的所有模組,就可以知道其工作方式:
prefork:
如果httpd -l列出prefork.c,則需要對下面的段進行配置:
StartServers 5 #啟動apache時啟動的httpd程序個數。
MinSpareServers 5 #伺服器保持的最小空閒程序數。
MaxSpareServers 10 #伺服器保持的最大空閒程序數。
MaxClients 150 #最大併發連線數。
MaxRequestsPerChild 1000 #每個子程序被請求服務多少次後被kill掉。0表示不限制,推薦設定為1000。
在該工作模式下,伺服器啟動後起動5個httpd程序(加父程序共6個,通過ps -ax|grep httpd命令可以看到)。當有使用者連線時,apache會使用一個空閒程序為該連線服務,同時父程序會fork一個子程序。直到記憶體中的空閒程序達到MaxSpareServers。該模式是為了相容一些舊版本的程式。我預設編譯時的選項。

worker:
如果httpd -l列出worker.c,則需要對下面的段進行配置:
StartServers 2 #啟動apache時啟動的httpd程序個數。
MaxClients 150 #最大併發連線數。
MinSpareThreads 25 #伺服器保持的最小空閒執行緒數。
MaxSpareThreads 75 #伺服器保持的最大空閒執行緒數。
ThreadsPerChild 25 #每個子程序的產生的執行緒數。
MaxRequestsPerChild 0 #每個子程序被請求服務多少次後被kill掉。0表示不限制,推薦設定為1000。
該模式是由執行緒來監聽客戶的連線。當有新客戶連線時,由其中的一個空閒執行緒接受連線。伺服器在啟動時啟動兩個程序,每個程序產生的執行緒數是固定的(ThreadsPerChild決定),因此啟動時有50個執行緒。當50個執行緒不夠用時,伺服器自動fork一個程序,再產生25個執行緒。
perchild:
如果httpd -l列出perchild.c,則需要對下面的段進行配置:
NumServers 5 #伺服器啟動時啟動的子程序數
StartThreads 5 #每個子程序啟動時啟動的執行緒數
MinSpareThreads 5 #記憶體中的最小空閒執行緒數
MaxSpareThreads 10 #最大空閒執行緒數
MaxThreadsPerChild 2000 #每個執行緒最多被請求多少次後退出。0不受限制
MaxRequestsPerChild 10000 #每個子程序服務多少次後被重新fork。0表示不受限制。
該模式下,子程序的數量是固定的,執行緒數不受限制。當客戶端連線到伺服器時,又空閒的執行緒提供服務。 如果空閒執行緒數不夠,子程序自動產生執行緒來為新的連線服務。該模式用於多站點伺服器。
 
Apache的prefork模式和worker模式2009-01-15 11:48Apache的prefork模式和worker模式
prefork模式
這個多路處理模組(MPM)實現了一個非執行緒型的、預派生的web伺服器,它的工作方式類似於Apache 1.3。它適合於沒有執行緒安全庫,需要避免執行緒相容性問題的系統。它是要求將每個請求相互獨立的情況下最好的MPM,這樣若一個請求出現問題就不會影響到其他請求。
這個MPM具有很強的自我調節能力,只需要很少的配置指令調整。最重要的是將MaxClients設定為一個足夠大的數值以處理潛在的請求高峰,同時又不能太大,以致需要使用的記憶體超出實體記憶體的大小。
worker模式
此多路處理模組(MPM)使網路伺服器支援混合的多執行緒多程序。由於使用執行緒來處理請求,所以可以處理海量請求,而系統資源的開銷小於基於程序的MPM。但是,它也使用了多程序,每個程序又有多個執行緒,以獲得基於程序的MPM的穩定性。
控制這個MPM的最重要的指令是,控制每個子程序允許建立的執行緒數的ThreadsPerChild指令,和控制允許建立的匯流排程數的MaxClients指令。

prefork和worker模式的切換
1.將當前的prefork模式啟動檔案改名
mv httpd httpd.prefork
2.將worker模式的啟動檔案改名
mv httpd.worker httpd
3.修改Apache配置檔案
vi /usr/local/apache2/conf/extra/httpd-mpm.conf
找到裡邊的如下一段,可適當修改負載等引數:
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
4.重新啟動服務
/usr/local/apache2/bin/apachectl restart
即可換成worker方式啟動apache2
處於穩定性和安全性考慮,不建議更換apache2的執行方式,使用系統預設prefork即可。另外很多php模組不能工作在worker模式下,例如redhat linux自帶的php也不能支援執行緒安全。所以最好不要切換工作模式。
prefork和worker模式的比較
prefork模式使用多個子程序,每個子程序只有一個執行緒。每個程序在某個確定的時間只能維持一個連線。在大多數平臺上,Prefork MPM在效率上要比Worker MPM要高,但是記憶體使用大得多。prefork的無執行緒設計在某些情況下將比worker更有優勢:它可以使用那些沒有處理好執行緒安全的第三方模組,並且對於那些執行緒除錯困難的平臺而言,它也更容易除錯一些。
worker模式使用多個子程序,每個子程序有多個執行緒。每個執行緒在某個確定的時間只能維持一個連線。通常來說,在一個高流量的HTTP伺服器上,Worker MPM是個比較好的選擇,因為Worker MPM的記憶體使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一個執行緒崩潰,整個程序就會連同其所有執行緒一起”死掉”.由於執行緒共享記憶體空間,所以一個程式在執行時必須被系統識別為”每個執行緒都是安全的”。
總的來說,prefork方式速度要稍高於worker,然而它需要的cpu和memory資源也稍多於woker。
prefork模式配置詳解
<IfModule mpm_prefork_module>
ServerLimit 256
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 256
MaxRequestsPerChild 0
</IfModule>
ServerLimit
預設的MaxClient最大是256個執行緒,如果想設定更大的值,就的加上ServerLimit這個引數。20000是ServerLimit這個引數的最大值。如果需要更大,則必須編譯apache,此前都是不需要重新編譯Apache。
生效前提:必須放在其他指令的前面
StartServers
指定伺服器啟動時建立的子程序數量,prefork預設為5。
MinSpareServers
指定空閒子程序的最小數量,預設為5。如果當前空閒子程序數少於MinSpareServers ,那麼Apache將以最大每秒一個的速度產生新的子程序。此引數不要設的太大。
MaxSpareServers
設定空閒子程序的最大數量,預設為10。如果當前有超過MaxSpareServers數量的空閒子程序,那麼父程序將殺死多餘的子程序。此引數不要設的太大。如果你將該指令的值設定為比MinSpareServers小,Apache將會自動將其修改成”MinSpareServers 1″。
MaxClients
限定同一時間客戶端最大接入請求的數量(單個程序併發執行緒數),預設為256。任何超過MaxClients限制的請求都將進入等候佇列,一旦一個連結被釋放,佇列中的請求將得到服務。要增大這個值,你必須同時增大ServerLimit。
MaxRequestsPerChild
每個子程序在其生存期內允許伺服的最大請求數量,預設為10000.到達MaxRequestsPerChild的限制後,子程序將會結束。如果MaxRequestsPerChild為”0″,子程序將永遠不會結束。將MaxRequestsPerChild設定成非零值有兩個好處:
1.可以防止(偶然的)記憶體洩漏無限進行,從而耗盡記憶體。
2.給程序一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動程序的數量。
worker模式配置詳解
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
StartServers
伺服器啟動時建立的子程序數,預設值是”3″。
MaxClients
允許同時伺服的最大接入請求數量(最大執行緒數量)。任何超過MaxClients限制的請求都將進入等候佇列。預設值是”400″,16(ServerLimit)乘以25(ThreadsPerChild)的結果。因此要增加MaxClients的時候,你必須同時增加ServerLimit的值。
MinSpareThreads
最小空閒執行緒數,預設值是”75″。這個MPM將基於整個伺服器監視空閒執行緒數。如果伺服器中總的空閒執行緒數太少,子程序將產生新的空閒執行緒。
MaxSpareThreads
設定最大空閒執行緒數。預設值是”250″。這個MPM將基於整個伺服器監視空閒執行緒數。如果伺服器中總的空閒執行緒數太多,子程序將殺死多餘的空閒執行緒。MaxSpareThreads的取值範圍是有限制的。Apache將按照如下限制自動修正你設定的值:worker要求其大於等於MinSpareThreads加上ThreadsPerChild的和。
ThreadsPerChild
每個子程序建立的常駐的執行執行緒數。預設值是25。子程序在啟動時建立這些執行緒後就不再建立新的執行緒了。
MaxRequestsPerChild
設定每個子程序在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子程序將會結束。如果MaxRequestsPerChild為”0″,子程序將永遠不會結束。將MaxRequestsPerChild設定成非零值有兩個好處:
1.可以防止(偶然的)記憶體洩漏無限進行,從而耗盡記憶體。
2.給程序一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動程序的數量。
注意對於KeepAlive連結,只有第一個請求會被計數。事實上,它改變了每個子程序限制最大連結數量的行為。
 

巧用tmpfs加速你的linux伺服器
 

今天從朋友高春輝那裡又學了一招,就是使用tmpfs,我把他消化後用來實現虛擬磁碟來存放squid的快取檔案和php的seesion。速度快不少哦!

預設系統就會載入/dev/shm ,它就是所謂的tmpfs,有人說跟ramdisk(虛擬磁碟),但不一樣。象虛擬磁碟一樣,tmpfs 可以使用您的 RAM,但它也可以使用您的交換分割槽來儲存。而且傳統的虛擬磁碟是個塊裝置,並需要一個 mkfs 之類的命令才能真正地使用它,tmpfs 是一個檔案系統,而不是塊裝置;您只是安裝它,它就可以使用了。

tmpfs有以下優勢:
1。動態檔案系統的大小,
2。tmpfs 的另一個主要的好處是它閃電般的速度。因為典型的 tmpfs 檔案系統會完全駐留在 RAM 中,讀寫幾乎可以是瞬間的。
3。tmpfs 資料在重新啟動之後不會保留,因為虛擬記憶體本質上就是易失的。所以有必要做一些指令碼做諸如載入,繫結的操作。

好了講了一些大道理,大家看的煩了吧,還是講講我的應用吧:)

首先在/dev/stm建個tmp資料夾,然後與實際/tmp繫結

mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp
mount –bind /dev/shm/tmp /tmp


1。squid的快取目錄設定

vi /etc/squid/squid.conf

修改成
cache_dir ufs /tmp 256 16 256
這裡的第一個256表示使用256M記憶體,我覺得高效能LINUX雙效防火牆HOWTO使用ramdisk的方法還不如直接使用tmpfs,至少每次啟動不用mkfs,還可以動態改變大小。

然後重啟一下服務,ok,現在所有的squid快取檔案都儲存倒tmpfs檔案系統裡了,很快哦。


2。對php效能的優化

對於一個訪問量大的以apache+php的網站,可能tmp下的臨時檔案都會很多,比如seesion或者一些快取檔案,那麼你可以把它儲存到tmpfs檔案。

儲存seesion的方法很簡單了只要修改php.ini就行了,由於我已經把/dev/stm/tmp與/tmp繫結,所以不改寫也行,至於php程式產生的快取檔案那隻能改自己的php程式了:)

希望我的這個方法,能對你有所啟發。

參考文件:使用虛擬記憶體(virtual
memory,VM)檔案系統和繫結安裝

Apache下限制每個虛擬主機的併發數
 

下載模組:http://www.nowhere-land.org/programs/mod_vhost_limit/

安裝:
apxs -c mod_vhost_limit.c -o /path/to/libexec/mod_vhost_limit.so

在 httpd.conf 加入:
LoadModule vhost_limit_module libexec/mod_vhost_limit.so
AddModule mod_vhost_limit.c

配置:
MaxClients 150
ExtendedStatus On

NameVirtualHost *
<VirtualHost *>
    ServerName server1
    DocumentRoot /some/where/1
    MaxVhostClients 100
</VirtualHost>

<VirtualHost *>
    ServerName server2
    DocumentRoot /some/where/2
    MaxVhostClients 30
</VirtualHost>

<VirtualHost *>
    ServerName server3
    DocumentRoot /some/where/3
</VirtualHost>

其中:server1 被限制為 100 個併發執行緒數。server2 被限制為 30 個併發執行緒數。server3 沒有被限制。
注:需 mod_status 的 ExtendedStatus On 支援!!

如超出限制的併發數在客戶端就會出現503錯誤:
Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
——————————————————————————–

Apache/1.3.27 Server at server1 Port 80

在 error_log 中將會有類似以下的錯誤提示:
[Mon Jun 23 15:22:24 2003] [error] client access to server1 deferred, MaxVhostClients 100 exceeded
——————————————————————————–

下載 mod_limitipconn.c
http://dominia.org/djao/limit/mod_limitipconn-0.04.tar.gz
http://dominia.org/djao/limit/mod_limitipconn-0.04-1.i386.rpm
(proxy client detection feature not enabled)
http://dominia.org/djao/limit/mod_limitipconn-0.04-1.src.rpm
我用的是tar包下載的是mod_limitipconn-0.04.tar.gz,(該模組已經可以支援apache2)在伺服器上執行# wgethttp://dominia.org/djao/limit/mod_limitipconn-0.04.tar.gz 下載到本地,然後執行下面的命令編譯安裝。我的apache位於/usr/local/apache目錄

解壓縮:
[[email protected] chenlf]# tar zxvf mod_limitipconn-0.04.tar.gz
mod_limitipconn-0.04/
mod_limitipconn-0.04/Makefile
mod_limitipconn-0.04/README
mod_limitipconn-0.04/apachesrc.diff
mod_limitipconn-0.04/mod_limitipconn.c
mod_limitipconn-0.04/ChangeLog

編譯安裝:
[roo[email protected] chenlf]# cd mod_limitipconn-0.04
[[email protected] mod_limitipconn-0.04]# ls
apachesrc.diff     ChangeLog     Makefile
mod_limitipconn.c README
[[email protected] mod_limitipconn-0.04]
# /usr/local/apache/bin/apxs -c -i -a mod_limitipconn.c
gcc -DLINUX=22 -I/usr/include/db1 -fpic -DSHARED_MODULE -I
/usr/local/apache/include -c mod_limitipconn.c
gcc -shared -o mod_limitipconn.so mod_limitipconn.o
[activating module `limitipconn’ in /usr/local/apache/conf/httpd.conf]
cp mod_limitipconn.so \
/usr/local/apache/libexec/mod_limitipconn.so
chmod 755 /usr/local/apache/libexec/mod_limitipconn.so
cp /usr/local/apache/conf/httpd.conf
    /usr/local/apache/conf/httpd.conf.bak
cp /usr/local/apache/conf/httpd.conf.new
    /usr/local/apache/conf/httpd.conf
rm /usr/local/apache/conf/httpd.conf.new

修改配置檔案:
全域性控制,在httpd.conf加上以下幾行: 
<IfModule mod_limitipconn.c>
    <Location /> # 所有虛擬主機的/目錄
        MaxConnPerIP 3 # 每IP只允許3個併發連線
        NoIPLimit image/* # 對圖片不做IP限制
    </Location>
    <Location /mp3> # 所有主機的/mp3目錄
        MaxConnPerIP 1 # 每IP只允許一個連線請求
        OnlyIPLimit audio/mpeg video # 該限制只對視訊和音訊格式的檔案
    </Location>
</IfModule>
區域性限制,你也可以在虛擬主機的配置檔案裡設定IP限制,方法是完全一樣: 
<VirtualHost xx.xxx.xx.xx>
    ServerAdmin [email protected]
    DocumentRoot /home/my
    ServerName www.my.com
    <IfModule mod_limitipconn.c>
        <Location /> # 所有虛擬主機的/目錄
            MaxConnPerIP 5 # 每IP只允許3個併發連線
            NoIPLimit image/* # 對圖片不做IP限制
        </Location>
        <Location /mp3> # 所有主機的/mp3目錄
            MaxConnPerIP 2 # 每IP只允許一個連線請求
            OnlyIPLimit audio/mpeg video # 該限制只對視訊和音訊格式的檔案
        </Location>
    </IfModule>
    ErrorLog /home/my/logs/error_log
    CustomLog /home/my/logs/access_log common
</VirtualHost>
此外必須將 apache 的 ExtendedStatus 設定為ON。
在httpd.conf找到 # ExtendedStatus On 去掉前面的註釋即可。

好了,全部配置結束,重起apache就可以生效了。

http://blog.penner.cn/2005/04/17/restrict-connect-number-from-every-virtualhost-under-apache.html

 

 

檢視Apache併發請求數及其TCP連線狀態

# prefork MPM 
# StartServers: number of server processes to start 
# MinSpareServers: minimum number of server processes which are kept spare 
# MaxSpareServers: maximum number of server processes which are kept spare 
# MaxClients: maximum number of server processes allowed to start 
# MaxRequestsPerChild: maximum number of requests a server process serves 

StartServers     10 
MinSpareServers   10 
MaxSpareServers   15 
ServerLimit     2000 
MaxClients      2000 
MaxRequestsPerChild 10000 

  檢視httpd程序數(即prefork模式下Apache能夠處理的併發請求數): 

  Linux命令: 

ps -ef | grep httpd | wc -l 

  返回結果示例: 

  1388 

  表示Apache能夠處理1388個併發請求,這個值Apache可根據負載情況自動調整,我這組伺服器中每臺的峰值曾達到過2002。

  檢視Apache的併發請求數及其TCP連線狀態: 

  Linux命令: 

netstat -n | awk ‘/^tcp/ { S[$NF]} END {for(a in S) print a, S[a]}’ 

  (這條語句是從新浪互動社群事業部技術總監王老大那兒獲得的,非常不錯) 

  返回結果示例: 

  LAST_ACK 5 

  SYN_RECV 30 

  ESTABLISHED 1597 

  FIN_WAIT1 51 

  FIN_WAIT2 504 

  TIME_WAIT 1057 

  其中的SYN_RECV表示正在等待處理的請求數;ESTABLISHED表示正常資料傳輸狀態;TIME_WAIT表示處理完畢,等待超時結束的請求數。 

  關於TCP狀態的變遷,可以從下圖形象地看出: 

  狀態:描述 

  CLOSED:無連線是活動的或正在進行 

  LISTEN:伺服器在等待進入呼叫 

  SYN_RECV:一個連線請求已經到達,等待確認 

  SYN_SENT:應用已經開始,開啟一個連線 

  ESTABLISHED:正常資料傳輸狀態 

  FIN_WAIT1:應用說它已經完成 

  FIN_WAIT2:另一邊已同意釋放 

  ITMED_WAIT:等待所有分組死掉 

  CLOSING:兩邊同時嘗試關閉 

  TIME_WAIT:另一邊已初始化一個釋放 

  LAST_ACK:等待所有分組死掉