技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機(jī)純凈版,64位旗艦版,綠色軟件,免費(fèi)軟件下載基地!

當(dāng)前位置:主頁 > 教程 > 服務(wù)器類 >

Apache中配置最大并發(fā)用戶數(shù) tcp連接設(shè)置

來源:技術(shù)員聯(lián)盟┆發(fā)布時間:2019-03-02 12:15┆點(diǎn)擊:

Apache在配置編譯時可以自主的選擇想要使用的MPM模塊,使用./configure --with-mpm=MPM命令。我們主要了解prefork和worker這兩種MPM模塊。

Prefork
如果不用“--with-mpm”顯式指定某種MPM,prefork就是Unix平臺上缺省的MPM。它所采用的預(yù)派生子進(jìn)程方式,用單獨(dú)的子進(jìn)程來處理不同的請求,進(jìn)程之間彼此獨(dú)立。在make編譯和make install安裝后,使用httpd -l來確定當(dāng)前使用的
MPM是prefork.c。查看httpd-mpm.conf配置文件,里面包含如下默認(rèn)的配置段:

代碼如下
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
 

prefork控制進(jìn)程在最初建立“StartServers”個子進(jìn)程后,為了滿足MinSpareServers設(shè)置的需要創(chuàng)建一個進(jìn)程,等待一秒鐘,繼續(xù)創(chuàng)建兩個,再等待一秒鐘,繼續(xù)創(chuàng)建四個……如此按指數(shù)級增加創(chuàng)建的進(jìn)程數(shù),最多達(dá)到每秒32個,直到滿足MinSpareServers設(shè)置的值為止。這種模式可以不必在請求到來時再產(chǎn)生新的進(jìn)程,從而減小了系統(tǒng)開銷以增加性能。MaxSpareServers設(shè)置了最大的空閑進(jìn)程數(shù),如果空閑進(jìn)程數(shù)大于這個值,Apache會自動kill掉一些多余進(jìn)程。這個值不要設(shè)得過大,但如果設(shè)的值比MinSpareServers小,Apache會自動把其調(diào)整為MinSpareServers+1。如果站點(diǎn)負(fù)載較大,可考慮同時加大MinSpareServers和MaxSpareServers。MaxRequestsPerChild設(shè)置的是每個子進(jìn)程可處理的請求數(shù)。每個子進(jìn)程在處理了“MaxRequestsPerChild”個請求后將自動銷毀。0意味著無限,即子進(jìn)程永不銷毀。雖然缺省設(shè)為0可以使每個子進(jìn)程處理更多的請求,但如果設(shè)成非零值也有兩點(diǎn)重要的好處:1、可防止意外的內(nèi)存泄漏。2、在服務(wù)器負(fù)載下降的時侯會自動減少子進(jìn)程數(shù)。因此,可根據(jù)服務(wù)器的負(fù)載來調(diào)整這個值。MaxClients是這些指令中最為重要的一個,設(shè)定的是Apache可以同時處理的請求,是對Apache性能影響最大的參數(shù)。其缺省值150是遠(yuǎn)遠(yuǎn)不夠的,如果請求總數(shù)已達(dá)到這個值(可通過ps -ef|grep http|wc -l來確認(rèn)),那么后面的請求就要排隊,直到某個已處理請求完畢。這就是系統(tǒng)資源還剩下很多而HTTP訪問卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越多,但Apache默認(rèn)的限制不能大于256。ServerLimit指令無須重編譯Apache就可以加大MaxClients。ServerLimt應(yīng)該放在第一個位置,放在其他指令之間不起作用(不明白原因)。

代碼如下
<IfModule prefork.c>
ServerLimit  10000
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 10000
MaxRequestsPerChild 0
</IfModule>

Worker
相對于prefork,worker全新的支持多線程和多進(jìn)程混合模型的MPM。由于使用線程來處理,所以可以處理相對海量的請求,而系統(tǒng)資源的開銷要小于基于進(jìn)程的服務(wù)器。但是,worker也使用了多進(jìn)程,每個進(jìn)程又生成多個線程,以獲得基于進(jìn)程服務(wù)器的穩(wěn)定性。在configure --with-mpm=worker后,進(jìn)行make編譯、make install安裝。在缺省生成的httpd-mpm.conf中有以下默認(rèn)配置段:

代碼如下
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
 

Worker由主控制進(jìn)程生成“StartServers”個子進(jìn)程,每個子進(jìn)程中包含固定的ThreadsPerChild線程數(shù),各個線程獨(dú)立地處理請求。同樣,為了不在請求到來時再生成線程,MinSpareThreads和MaxSpareThreads設(shè)置了最少和最多的空閑線程數(shù);而MaxClients設(shè)置了同時連入的clients最大總數(shù)。如果現(xiàn)有子進(jìn)程中的線程總數(shù)不能滿足負(fù)載,控制進(jìn)程將派生新的子進(jìn)程。MinSpareThreads和MaxSpareThreads的最大缺省值分別是75和250。這兩個參數(shù)對Apache的性能影響并不大,可以按照實(shí)際情況相應(yīng)調(diào)節(jié)。ThreadsPerChild是worker MPM中與性能相關(guān)最密切的指令。ThreadsPerChild的最大缺省值是64,如果負(fù)載較大,64也是不夠的。這時要顯式使用ThreadLimit指令,它的最大缺省值是20000。Worker模式下所能同時處理的請求總數(shù)是由子進(jìn)程總數(shù)乘以ThreadsPerChild值決定的,應(yīng)該大于等于MaxClients。如果負(fù)載很大,現(xiàn)有的子進(jìn)程數(shù)不能滿足時,控制進(jìn)程會派生新的子進(jìn)程。默認(rèn)最大的子進(jìn)程總數(shù)是16,加大時也需要顯式聲明ServerLimit(最大值是20000)。需要注意的是,如果顯式聲明了ServerLimit,那么它乘以ThreadsPerChild的值必須大于等于MaxClients,而且MaxClients必須是ThreadsPerChild的整數(shù)倍,否則Apache將會自動調(diào)節(jié)到一個相應(yīng)值。