apache2.2.11最大連接數(shù)配置(轉(zhuǎn)載)
apache2.2.11最大連接數(shù)配置(轉(zhuǎn)載)
每次重做服務(wù)器,就會學(xué)到一些新的東西,所以了解linux最簡潔有效的辦法,就是不停的重做系統(tǒng),重新配置優(yōu)化系統(tǒng)(XD!)。
本次使用了apache2.2.6,編譯完成后,最大連接數(shù)默認為150,運行一段時間后出現(xiàn)大量的CLOSE_WAIT,于是修改默認連接數(shù)。apache2.2以后許多功能都抽出來單獨存放了,在http.conf里進行引用。存儲連接數(shù)等相關(guān)指令的文件是httpd-mpm.conf,apache采用的是prefork模式來進行連接數(shù)量方面的控制,prefork模塊的格式如下:
<ifmodule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0<ifmodule>
其工作原理如下:
控制進程在最初建立StartServers個子進程后, 為了滿足MinSpareServers設(shè)置的需要,創(chuàng)建一個進程,等待一秒鐘,繼續(xù)創(chuàng)建第二個,等待一秒鐘,繼而創(chuàng)建四個,如此按指數(shù)級增加創(chuàng)建的進程 數(shù),最多達到每秒32個,直到滿足MinSpareServers設(shè)置的值為止,這也就是預(yù)派生(prefork)的由來。這種模式可以使得不必在請求到 來時再產(chǎn)生新的進程,從而減小了系統(tǒng)開銷以增加性能。
MaxSpareServers 設(shè)置了最大的空閑進程數(shù),如果空閑進程數(shù)大于這個值,Apache會自動kill某些多余進程。這個值一般不要設(shè)的過大,但如果設(shè)的比 MinSpareServers小,Apache會自動把它調(diào)整為MinSpareServers+1。如果站點負載較大的話,可考慮同時加大 MinSpareServers和MaxSpareServers。
MaxRequestsPerChild設(shè)置的是每個子進程可以 處理的請求數(shù)。每個子進程在處理了MaxRequestsPerChild個請求后將自動銷毀。0意味著無限,即子進程永不銷毀。雖然缺省設(shè)為0可以使每 個子進程處理更多的請求,但如果設(shè)成非零值也有兩點重要的好處:
1. 可防止意外的內(nèi)存卸漏;
2. 在服務(wù)器負載下降的時侯會自動減少子進程數(shù)。
因此,可根據(jù)服務(wù)器的負載來調(diào)整這個值,如果非零的話,筆者認為10000左右是比較合適的。事實上這個值對Apache的性能影響不是很大。
MaxClients 是這些指令中最為重要的一個,它設(shè)定的就是Apache可以同時處理的請求,這是對Apache性能影響最大的參數(shù).在我個人看來,缺省的150是遠遠不 夠的,如果請求總數(shù)已達到這個值(可通過ps –ef|grep httpd|wc –l來確認),那么下面的請求就要排隊,直到某個已處理請求完畢。這就是為什么系統(tǒng)資源還剩下很多,而http訪問卻很慢的主要原因。系統(tǒng)管理員可以根據(jù) 硬件配置和負載情況來動態(tài)調(diào)整這個值,雖然理論上這個值越大,可以處理的請求就越多,但Apache默認的限制是不能大于256。如果把這個值設(shè)為大于 256那么Apache將無法起動。事實上,256對于負載稍重的站點也是很不夠的。在Apache1.3中這是個硬限制,如果要加大這個值,必須在 configure前手工修改源代碼樹下的src/include/httpd.h,查找256,會發(fā)現(xiàn)#define HARD_SERVER_LIMIT 256這行,把256改為你要增大的值如4000,然后重新編譯Apache即可。我想這個方法稍有些經(jīng)驗的Apache系統(tǒng)管理員都知道,不過我相信在 Apache2.0中知道如何加大這個值的人就不會太多了。
在Apache2.0中新加入了ServerLimit指令,使得無須重編譯Apache就可以加大MaxClients。下面是筆者的prefork配置段。
<IfModule prefork.c>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1500
MaxRequestsPerChild 10000
</IfModule>
BTW: ServerLimit的最大值是20000,這對于大多數(shù)站點是足夠了,但如果你一定要再加大的話,那么這個值位于源代碼樹下的server/mpm/prefork/prefork.c中。里面的
#define DEFAULT_SERVER_LIMIT 256
#define MAX_SERVER_LIMIT 20000
這兩行就對應(yīng)著MaxClients和ServerLimit的限制值。 但我相信很少有人可以用到20000的并發(fā)連接數(shù)。
以上內(nèi)容來自unix中文 對于prefork的工作模式能夠?qū)崿F(xiàn)的功能描寫的比較詳盡了。我在用的時候發(fā)現(xiàn)ServerLimits和MaxClients這兩個參數(shù)的順序是不可以顛倒的,否則重起apache時會報警。根據(jù)周超 同學(xué)的提醒,凡是有依賴關(guān)系的命令,書寫應(yīng)該都是有順序的。
同時在查資料的過程中,揀到一條命令:
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
這條語句返回結(jié)果如下
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
其中的SYN_RECV表示正在等待處理的請求數(shù);ESTABLISHED表示正常數(shù)據(jù)傳輸狀態(tài);TIME_WAIT表示處理完畢,等待超時結(jié)束的請求數(shù)。
返回的結(jié)果非常簡潔直接,就是句子有點長 -_-。
原文來自51CTO技術(shù)論壇
本次使用了apache2.2.6,編譯完成后,最大連接數(shù)默認為150,運行一段時間后出現(xiàn)大量的CLOSE_WAIT,于是修改默認連接數(shù)。apache2.2以后許多功能都抽出來單獨存放了,在http.conf里進行引用。存儲連接數(shù)等相關(guān)指令的文件是httpd-mpm.conf,apache采用的是prefork模式來進行連接數(shù)量方面的控制,prefork模塊的格式如下:
<ifmodule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0<ifmodule>
其工作原理如下:
控制進程在最初建立StartServers個子進程后, 為了滿足MinSpareServers設(shè)置的需要,創(chuàng)建一個進程,等待一秒鐘,繼續(xù)創(chuàng)建第二個,等待一秒鐘,繼而創(chuàng)建四個,如此按指數(shù)級增加創(chuàng)建的進程 數(shù),最多達到每秒32個,直到滿足MinSpareServers設(shè)置的值為止,這也就是預(yù)派生(prefork)的由來。這種模式可以使得不必在請求到 來時再產(chǎn)生新的進程,從而減小了系統(tǒng)開銷以增加性能。
MaxSpareServers 設(shè)置了最大的空閑進程數(shù),如果空閑進程數(shù)大于這個值,Apache會自動kill某些多余進程。這個值一般不要設(shè)的過大,但如果設(shè)的比 MinSpareServers小,Apache會自動把它調(diào)整為MinSpareServers+1。如果站點負載較大的話,可考慮同時加大 MinSpareServers和MaxSpareServers。
MaxRequestsPerChild設(shè)置的是每個子進程可以 處理的請求數(shù)。每個子進程在處理了MaxRequestsPerChild個請求后將自動銷毀。0意味著無限,即子進程永不銷毀。雖然缺省設(shè)為0可以使每 個子進程處理更多的請求,但如果設(shè)成非零值也有兩點重要的好處:
1. 可防止意外的內(nèi)存卸漏;
2. 在服務(wù)器負載下降的時侯會自動減少子進程數(shù)。
因此,可根據(jù)服務(wù)器的負載來調(diào)整這個值,如果非零的話,筆者認為10000左右是比較合適的。事實上這個值對Apache的性能影響不是很大。
MaxClients 是這些指令中最為重要的一個,它設(shè)定的就是Apache可以同時處理的請求,這是對Apache性能影響最大的參數(shù).在我個人看來,缺省的150是遠遠不 夠的,如果請求總數(shù)已達到這個值(可通過ps –ef|grep httpd|wc –l來確認),那么下面的請求就要排隊,直到某個已處理請求完畢。這就是為什么系統(tǒng)資源還剩下很多,而http訪問卻很慢的主要原因。系統(tǒng)管理員可以根據(jù) 硬件配置和負載情況來動態(tài)調(diào)整這個值,雖然理論上這個值越大,可以處理的請求就越多,但Apache默認的限制是不能大于256。如果把這個值設(shè)為大于 256那么Apache將無法起動。事實上,256對于負載稍重的站點也是很不夠的。在Apache1.3中這是個硬限制,如果要加大這個值,必須在 configure前手工修改源代碼樹下的src/include/httpd.h,查找256,會發(fā)現(xiàn)#define HARD_SERVER_LIMIT 256這行,把256改為你要增大的值如4000,然后重新編譯Apache即可。我想這個方法稍有些經(jīng)驗的Apache系統(tǒng)管理員都知道,不過我相信在 Apache2.0中知道如何加大這個值的人就不會太多了。
在Apache2.0中新加入了ServerLimit指令,使得無須重編譯Apache就可以加大MaxClients。下面是筆者的prefork配置段。
<IfModule prefork.c>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1500
MaxRequestsPerChild 10000
</IfModule>
BTW: ServerLimit的最大值是20000,這對于大多數(shù)站點是足夠了,但如果你一定要再加大的話,那么這個值位于源代碼樹下的server/mpm/prefork/prefork.c中。里面的
#define DEFAULT_SERVER_LIMIT 256
#define MAX_SERVER_LIMIT 20000
這兩行就對應(yīng)著MaxClients和ServerLimit的限制值。 但我相信很少有人可以用到20000的并發(fā)連接數(shù)。
以上內(nèi)容來自unix中文 對于prefork的工作模式能夠?qū)崿F(xiàn)的功能描寫的比較詳盡了。我在用的時候發(fā)現(xiàn)ServerLimits和MaxClients這兩個參數(shù)的順序是不可以顛倒的,否則重起apache時會報警。根據(jù)周超 同學(xué)的提醒,凡是有依賴關(guān)系的命令,書寫應(yīng)該都是有順序的。
同時在查資料的過程中,揀到一條命令:
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
這條語句返回結(jié)果如下
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
其中的SYN_RECV表示正在等待處理的請求數(shù);ESTABLISHED表示正常數(shù)據(jù)傳輸狀態(tài);TIME_WAIT表示處理完畢,等待超時結(jié)束的請求數(shù)。
返回的結(jié)果非常簡潔直接,就是句子有點長 -_-。
原文來自51CTO技術(shù)論壇