1. 程式人生 > >Apache的工作模式和最大併發請求數設定

Apache的工作模式和最大併發請求數設定

什麼是apache的工作模式?

個人理解:apache的工作模式就是apache在執行時候的記憶體分配,程序和執行緒的使用方式。舉個例子:一臺apache正在執行的伺服器,如果有個使用者訪問這個apache,那麼apache是啟用一個程序來處理使用者的請求呢?還是在已有的程序中啟用一個執行緒來處理該使用者的請求?這個選擇就是 apache的工作模式來確定的。如果指定了某個工作模式比如prefork模式,那麼每個使用者的請求就要啟用一個程序來處理。

apache有幾種工作模式?怎麼檢視和修改apache的工作模式?

apache的工作模式有:beos,event,worker,prefork,mpmt_os2。

在linux(centos)下使用#http –l 命令可以檢視當前使用的工作模式。也可以使用#apachectl -l命令。

#http –l

#apachectl –l

看到的prefork.c,說明使用的prefork工作模式。

可以在編譯的時候使用#–with-mpm=prefork對應的工作模式名稱來修改工作模式。

beos工作模式(跟linux關係不大,或者暫時用不上)

在Beos系統上的工作模式,使用一個單獨的控制執行緒來建立和控制處理請求的工作執行緒。

event工作模式(不太穩定,或者說暫時用不上)

event模式由於把服務程序從連結中分離出來,在開啟KeepAlive場合下相對worker模式能夠承受的了更高的負載。event模式為 worker開發的變種模式,配置以及指令與worker完全相同。不過event模式不能很好的支援https的訪問,有時還會出現一系列的問題。

worker工作模式(與php配合不好,或者說暫時用不上)

worker模式由於使用執行緒來進行處理請求,所以能夠處理海量請求,而系統資源的開銷要小於基於程序的伺服器。同時worker模式也使用了多程序,每個程序又有著多個執行緒,以獲得基於程序伺服器的穩定性。

mpmt_os2工作模式(很少用,或者說暫時用不上)

mpmt_os2是專門針對OS/2優化過的混合多程序多執行緒多路處理模組(MPM) 。

prefork工作模式(本篇文章的主角,使用最多而且最穩定的工作模式)

prefork工作模式是linux下apache安裝時候的預設工作模式,是使用最普遍的工作模式。為了能夠簡單的明白他的工作原理,下面是一個假設:

有一臺正在執行的apache伺服器,使用者A訪問該apache的時候apache建立一個新的程序1處理使用者A的請求。

這時又有一個使用者B訪問該apache,apache又建立一個新的程序2處理使用者B的請求。

後來又有使用者C,D,E訪問該apache,apache又建立三個程序3,4,5處理他們的請求。

如果每當一個新使用者訪問該apache,apache再建立一個新的程序處理使用者的請求,是不是太慢了呢?

所以apache的prefork模式在apache第一次啟動的時候就建立5個程序,等待使用者的連線請求,有一個使用者訪問,就有一個程序處理他的請求。

那麼如果有5個使用者同時訪問apache,apache第一次建立的5個程序全部用光了,所以apache就再從新在建立5個程序,等待下一批使用者的請求。

prefork模式會根據伺服器的硬體情況,設定apache最多隻能同時建立256個程序。再多的請求就只能等待前面的程序處理完畢在進行處理。

假設完畢!

上面的假設就是prefork模式的工作原理。但是上面假設中具體的數字不是定死的,而是通過prefork模式的配置來設定的。下面是http.conf中的配置資訊。

*帶井號的為註釋部分

prefork模式的幾個重要的引數:

---------------------------------------------------------------------------------------------------------------

名稱                                  預設值                                說明

StartServers                      5                             apache啟動時候預設開始的程序數

MinSpareServers               5                             最小的閒置程序數

MaxSpareServers             10                            最大的閒置程序數

ServerLimit 256                          最大的程序總數(參考,實際看MaxClients)

MaxClients                       256 最大的程序總數

MaxRequestsPerChild      4000 每個程序處理的最多請求數

----------------------------------------------------------------------------------------------------------------

(1)StartServers:這個看了就明白了。

(2)MinSpareServers:舉個例子就明白了。

apache在沒有使用者訪問時候有5個閒置的程序,如果有一個使用者訪問網站。則閒置的程序就只有4個,這個值小於MinSpareServers,所以apache就以第一秒1個程序,第二秒2個程序,第三秒4個程序的速度新建空閒程序。直到大於等於MinSpareServers個空閒程序才結束。

(3)MaxSpareServers:還是舉個例子就明白了。

apache在沒有使用者訪問時候有5個閒置的程序,如果有5個使用者同時訪問網站。則閒置的程序就只有0個,這個值小於 MinSpareServers,所以apache就以第一秒1個程序,第二秒2個程序,第三秒4個程序的速度新建空閒程序。直到大於等於 MinSpareServers個空閒程序才結束。在這個例子中直到第三秒,一共生成1+2+4個程序才能滿足大於等於MinSpareServers的要求。後來這5個使用者訪問完apache,訪問結束,關閉瀏覽器。所以apache就有了5+7個空閒的程序。這時空閒的程序比較多,apache就開始關閉一些程序,直到滿足小於MaxSpareServers個空閒程序才結束。如果該值小於MinSpareServers則apache預設將該值設定成MinSpareServers+1。

(4)ServerLimit:這個引數是控制apache的程序總數的,那為什麼會有兩個引數控制apache的程序總數呢?這個引數在apache1的時代是沒有的,因為那個時候有個256M記憶體的伺服器就很厲害了。後來apache2的時代到來,伺服器的硬體也得到升級。很多伺服器都是4G記憶體,還有很多比4G記憶體大的伺服器出現。apache1的時代只有一個MaxClients引數控制程序總數就夠了,而這個引數最大值是256定死了。但是到了apache2的時代必須調整ServerLimit值大於256才能使MaxClient支援大於256的值。

(5)MaxClients:apache最大的程序數。apache1的時代只有一個MaxClients引數控制程序總數就夠了,而這個引數最大值是256定死了。但是到了apache2的時代必須調整ServerLimit值大於256才能使MaxClient支援大於256的值。

(6)MaxRequestsPerChild:舉個例子就明白了。

apache在沒有使用者訪問的時候有5個空閒程序。當一個使用者訪問網站,訪問完又離開。則apache的第一個程序就處理了一個請求,從新進入閒置狀態。再有一個使用者訪問網站,訪問完後離開。則apache的第一個程序就處理了1+1個請求。這樣繼續訪問3998個使用者,這個程序就處理了4000個請求,之後就自動關閉這個程序。這個時候apache就只有4個限制的程序,小於MinSpareServers值所以apache從今建立一個空閒程序。至於為什麼處理完4000個請求就要關閉這個程序呢?答案之一:為了防止記憶體的洩露。

下面圖文介紹這些引數(要深刻理解一個知識就要親自去體驗)

測試環境引數 
說明

作業系統 
centos4.5(虛擬機器)

伺服器 
apache2.2.6

記憶體 
1G

伺服器地址 
192.168.212.128

客戶端地址 
192.168.212.1

測試檔案index.php

<?php
for($i = 0;$i <= 10;$i++){
	echo date('H:i:s',time());
	echo '<br/>';
	sleep(10);
}
?>

測試http.conf的prefork模式設定:(設定有點極端,但是可以很好的理解說明)

首先檢視apache第一次啟動時候的空閒程序:

linux(centos)下檢視apache的程序可以使用#ps -ef|grep httpd命令,檢視apache程序的記憶體使用情況可以使用#ps –U apache –u apache u命令

#service httpd restrat:重啟apache,初始化程序

#ps -ef|grep httpd:使用者名稱為apache的才是apache用於處理使用者請求的程序

#ps –U apache –u apache u:檢視使用者名稱為apache的程序(即apache為了處理使用者請求而建立的程序詳情)

當前為沒有任何使用者訪問時候apache建立StartServers=1個程序

(1)當有一個使用者訪問(通過本機上的ie瀏覽器訪問虛擬主機上apache伺服器模式該情景)

可以看到apache的程序增加為2個,為什麼呢?當唯一的空閒程序時候完之後,空閒程序小於MinSpareServers,apache就從新建立一個程序。注意檢視RSS值(該程序的記憶體使用量KB)為4424的空閒程序。

再看看訪問完成之後的apache程序數。 

可以看到還是隻有兩個程序,而且這兩個程序都是空閒的。

(2)當有兩個使用者訪問(通過本機上的兩個ie瀏覽訪問虛擬主機上的apache伺服器模擬該情景)

可以看到有兩個使用者訪問的時候apache的程序數增加為3個。為什麼呢?當本來空閒2個程序時候完之後,空閒程序小於MinSpareServers,apache就從新建立一個程序。注意檢視RSS值(該程序的記憶體使用量KB)為4424的空閒程序。

再看看訪問完成之後的apache程序數。

可以看到空閒的程序數又減少為2個。為什麼呢?當兩個使用者訪問完成之後兩個使用者的程序都會關閉,這時候就會有3個空閒程序,這個值大於MaxSpareServers=2的值。所以apache會自動關掉一個程序滿足MaxSpareServers=2的值。

(3)當有三個使用者同時訪問(通過本機上的三個ie瀏覽訪問虛擬主機上的apache伺服器模擬該情景)

可以看到apache的程序有3個,而這三個程序都在處理使用者的請求,沒有多餘的空閒程序產生。為什麼呢?因為在上面我們設定了MaxClients的值為3。所以apache最多隻會生成3個程序。

再看看這三個使用者訪問完成之後的apache程序數。

可以看到空閒的程序數又減少為2個。為什麼呢?當三個使用者訪問完成之後三個使用者的程序都會關閉,這時候就會有3個空閒程序,這個值大於MaxSpareServers=2的值。所以apache會自動關掉一個程序滿足MaxSpareServers=2的值。

(4)當有四個使用者同時訪問(通過本機上的四個ie瀏覽訪問虛擬主機上的apache伺服器模擬該情景)

可以看到雖然有四個使用者同時訪問,但是apache建立的程序數還是隻有3個。就是說apache只對前面的3個使用者請求進行了處理。第4個使用者只能等待。

這個時候檢視apache的TCP連線情況。(對於TCP連線不太理解的可以點選檢視

可以看到這4個使用者都已經建立了連線。但是apache只處理了前面的3個請求。處理完3個請求在處理最後一個請求,這點可能從檔案的列印內容看到。四個使用者幾乎是同時訪問的。

可以看到最後一個使用者的請求時間是前面三個使用者訪問完成之後開始的。

依次類推,當有7個使用者同時訪問時候又是什麼樣的?只貼幾張圖,看了就明白了。

結論

如果從頭到尾詳細讀過本篇文章,會得出如下的結論:

1,apache是嚴格按照prefork模式的配置引數來程序分配和管理的。不像網上有些文章那樣修改了某個值,apache不起作用。只能說您改的不對,或者說您對上面的內容還不夠理解。

2,MaxClients值就是apache的最大程序數。不像網上有些文章說的這個值越大越好(有的文章既然推薦該值為4000),您可以從上面的程序圖中看到apache的每個程序的%MEM(記憶體佔用百分比)值為0.5%左右。所以這個值的具體設定的最大數位:100/0.5 = 200。而這也只是在這個伺服器只有一個apache的情況下。如果伺服器有其他程式需要佔用記憶體(比如mysql)這個值要小於200。你總不能把作業系統的所有記憶體都給apache吧?

3,每個瀏覽器是一個使用者,每個使用者就是一條程序。明白意思了吧?我的這臺伺服器的併發量只有200。就是說我的這臺伺服器只能支援同時200個使用者訪問,再多的使用者訪問就只能是等待。或者說我這臺伺服器只支援200個瀏覽器的訪問。關於伺服器的併發我會在下面一片文章中詳細講解。

4,200的併發量很小嗎?要知道apache處理資料的速度是相當快的。一條正常的首頁訪問可能就一秒鐘處理完畢。所以在假想的狀態下,我的這臺伺服器,每分鐘可以訪問60*200=12000個使用者。每天可以訪問12000*60*24=17280000個使用者的訪問。這當然是在完全飽和的訪問狀態的假想資料。下一篇文章我會詳細講解網站併發,請求,連擊等內容。

5,如果訪問的使用者數大於MaxClients的數,多出的使用者不會立刻斷掉連線,還是會建立TCP連線。只不過會等待前面的使用者處理完在得到相應。在php.ini,http.conf,作業系統設定的超時時間內得不到相應才會斷掉連線。