對apache中並發控制參數prefork理解和調優

來源:互聯網
上載者:User

一個apache有linux下的並發不是很高的,大約到3K的樣子(其實處理的http的請求可能只有300/s),普通的伺服器都會不同程度的出現問題.apache有關並發控制主要是 prefork和worker二個其中一個來控制.我們可以使用httpd -l來確定當前使用的MPM是prefork.c,還是Worker.c.下面是apache中有關prefork的配置.下面是我最佳化過的參數.

<IfModule prefork.c>

#有這個參數就不必像apache1一樣修改源碼才能修改256客戶數的限制,聽講要放到最前面才會生效,2000是這個參數的最大值
ServerLimit 2000
#指定伺服器啟動時建立的子進程數量,prefork預設為5。
StartServers 25

#指定空閑子進程的最小數量,預設為5。如果當前空閑子進程數少於MinSpareServers ,那麼Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大。
MinSpareServers 25

#設定空閑子進程的最大數量,預設為10。如果當前有超過MaxSpareServers數量的空閑子進程,那麼父進程將殺死多餘的子進程。此參數 不要設的太大。如果你將該指令的值設定為比MinSpareServers小,Apache將會自動將其修改成"MinSpareServers+1"。
MaxSpareServers 50

#限定同一時間用戶端最大接入請求的數量(單個進程並發線程數),預設為256。任何超過MaxClients限制的請求都將進入等候隊列,一旦一個連結被釋放,隊列中的請求將得到服務。要增大這個值,你必須同時增大ServerLimit 。
MaxClients 2000

#每個子進程在其生存期內允許伺服的最大請求數量,預設為10000.到達MaxRequestsPerChild的限制後,子進程將會結束。如果MaxRequestsPerChild為"0",子進程將永遠不會結束。
MaxRequestsPerChild 10000

</IfModule>

將MaxRequestsPerChild設定成非零值有兩個好處:
1.可以防止(偶然的)記憶體流失無限進行,從而耗盡記憶體。
2.給進程一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動進程的數量。

工作方式:
一個單獨的控制進程(父進程)負責產生子進程,這些子進程用於監聽請求並作出應答。Apache總是試圖保持一些備用的 (spare)或者是閒置子進程用於迎接即將到來的請求。這樣用戶端就不需要在得到服務前等候子進程的產生。在Unix系統中,父進程通常以root身 份運行以便邦定80連接埠,而 Apache產生的子進程通常以一個低特權的使用者運行。User和Group指令用於設定子進程的低特權使用者。運行子進程的使用者必須要對它所服務的內容有 讀取的許可權,但是對服務內容之外的其他資源必須擁有儘可能少的許可權。

對上面的有些值,一定要記的不是越大越好.這個需要經過幾次嘗試和出錯之後才能選好要使用的值(不同的硬體處理水平不一樣)。最重要的值是maxclient允許足夠多的 背景工作處理序,同時又不會導致伺服器進行過度的交換(死機)。如果傳入的請求超出處理能力而讓伺服器當掉的話,那麼至少滿足此值的那些請求會得到服務,其他請求被阻塞這樣會更加好。

 

我們調優常常要查看httpd進程數(即prefork模式下Apache能夠處理的並發請求數)

#ps -ef | grep httpd | wc -l

出現的結果,就是當前Apache能夠處理的多少個並發請求,這個值Apache根據負載情況自動調.

查看Apache的並發請求數及其TCP串連狀態:

#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表示處理完畢,等待逾時結束的請求數。

狀態:描述
CLOSED:無串連是活動的或進行中
LISTEN:伺服器在等待進入呼叫
SYN_RECV:一個串連請求已經到達,等待確認
SYN_SENT:應用已經開始,開啟一個串連
ESTABLISHED:正常資料轉送狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉

可以使用Linux下的webbench來作壓力測試.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.