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_beos
、mpm_event
、mpm_netware
、mpmt_os2
、mpm_prefork
、mpm_winnt
、mpm_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表示不限制請求總數(子進程永不結束)。
該參數建議設為非零的值,可以帶來以下兩個好處:
- 可以防止程序中可能存在的內存泄漏無限進行下去,從而耗盡內存。
- 給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
修改MPM模塊配置(方法二)
直接在Apace安裝目錄/conf/httpd.conf 文件中,最下面加上
<IfModule mpm_winnt_module>
ThreadsPerChild 512
MaxRequestsPerChild 0
</IfModule>也可。
注意:在配置相關參數時,請先保證服務器具備足夠的硬件性能(例如:CPU、內存等)。 如果發現自啟動后,隨着服務器的運行時間增加,服務器的內存占用也隨之增加,可能是程序中出現內存泄露,請向下調整參數MaxRequestsPerChild
的值以降低內存泄露帶來的影響,然后盡快找出程序中的問題之所在。