Apache優化:修改最大並發連接數(ThreadsPerChild的值)


Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting.

當Apache的安裝目錄/logs下的error-2017-06-28.log文件中,出現以上日志說明時,說明Apache需要進行優化了,修改Apache的最大並發連接數。

 

Apache是一個跨平台的web服務器,由於其簡單高效、穩定安全的特性,被廣泛應用於計算機技術的各個領域。現在,Apache憑借其龐大的用戶數,已成為用戶數排名第一的web服務器。

眾所周知,Apache是一個跨平台的、采用模塊化設計的服務器。為了應對不同的平台和不同的環境產生的各種不同的需求,也為了在具體的平台或環境下達到最佳的效果,Apache在web服務器的基礎功能方面(端口綁定、接收請求等)也同樣采用了模塊化設計,這個Apache的核心模塊就叫做多路處理模塊(Multi-Processing Module,簡稱MPM)。

Apache針對不同的操作系統提供了多個不同的MPM模塊,例如:mpm_beosmpm_eventmpm_netwarempmt_os2mpm_preforkmpm_winntmpm_worker。如果條件允許,我們可以根據實際需求將指定的MPM模塊編譯進我們自己的Apache中(Apache的源碼是開放的,允許用戶自行編譯)。不過,如果在編譯時我們沒有選擇,Apache將按照如下表格根據不同的操作系統自行選擇對應的MPM模塊,這也是Apache針對不同平台推薦使用的MPM模塊。

不同操作系統上默認的MPM模塊
操作系統 MPM模塊 描述
Windows mpm_winnt 不用介紹了吧:)
Unix/Linux mpm_prefork 不用介紹了吧:)
BeOS mpm_beos 由Be公司開發的一種多媒體操作系統,官方版已停止更新。
Netware mpm_netware 由NOVELL公司推出的一種網絡操作系統
OS/2 mpmt_os2 一種最初由微軟和IBM共同開發的操作系統,現由IBM單獨開發(微軟放棄OS/2,轉而開發Windows)

mpm_winnt模塊

mpm_winnt模塊是專門針對Windows操作系統而優化設計的MPM模塊。它只創建一個單獨的子進程,並在這個子進程中輪流產生多個線程來處理請求。

修改MPM模塊配置(方法一)

在對Apache的MPM模塊具備一定了解后,我們就可以針對不同的MPM模塊來修改Apache最大並發連接數配置了。

1.啟用MPM模塊配置文件

Apace安裝目錄/conf/extra目錄中有一個名為httpd-mpm.conf的配置文件。該文件主要用於進行MPM模塊的相關配置。不過,在默認情況下,Apache的MPM模塊配置文件並沒有啟用。因此,我們需要在httpd.conf文件中啟用該配置文件,如下所示:

# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf (去掉該行前面的注釋符號"#")

2.修改MPM模塊配置文件中的相關配置

在啟動MPM模塊配置文件后,我們就可以使用文本編輯器打開該配置文件,我們可以看到,在該配置文件中有許多<IfModule>配置節點,如下圖所示:

只有Apache使用對應MPM模塊時,對應配置才會生效

此時,我們就需要根據當前Apache服務器所使用的MPM模塊,來修改對應<IfModule>節點下的參數配置。首先,我們來看看mpm_winnt模塊下的默認配置:

#由於mpm_winnt模塊只會創建1個子進程,因此這里對單個子進程的參數設置就相當於對整個Apache的參數設置。

<IfModule mpm_winnt_module>
ThreadsPerChild      150 #推薦設置:小型網站=1000 中型網站=1000~2000 大型網站=2000~3500 MaxRequestsPerChild 0 #推薦設置:小=10000 中或大=20000~100000 </IfModule>

對應的配置參數作用如下:

ThreadsPerChild
每個子進程的 最大並發線程數。
MaxRequestsPerChild
每個子進程允許處理的請求總數。如果累計處理的請求數超過該值,該子進程將會結束(然后根據需要確定是否創建新的子進程),該值設為0表示不限制請求總數(子進程永不結束)。

該參數建議設為非零的值,可以帶來以下兩個好處:

  1. 可以防止程序中可能存在的內存泄漏無限進行下去,從而耗盡內存。
  2. 給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。

修改MPM模塊配置(方法二)

直接在Apace安裝目錄/conf/httpd.conf 文件中,最下面加上

<IfModule mpm_winnt_module>
ThreadsPerChild 512
MaxRequestsPerChild 0
</IfModule>  

也可。

注意:在配置相關參數時,請先保證服務器具備足夠的硬件性能(例如:CPU、內存等)。 如果發現自啟動后,隨着服務器的運行時間增加,服務器的內存占用也隨之增加,可能是程序中出現內存泄露,請向下調整參數MaxRequestsPerChild的值以降低內存泄露帶來的影響,然后盡快找出程序中的問題之所在。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM