溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

apache worker性能調(diào)優(yōu)

發(fā)布時(shí)間:2020-06-16 02:01:18 來源:網(wǎng)絡(luò) 閱讀:2242 作者:_追隨我心 欄目:軟件技術(shù)

worker的工作原理及配置 
  相對于prefork,worker是2.0 版中全新的支持多線程和多進(jìn)程混合模型的MPM。由于使用線程來處理,所以可以處理相對海量的請求,而系統(tǒng)資源的開銷要小于基于進(jìn)程的服務(wù)器。但是,worker也使用了多進(jìn)程,每個(gè)進(jìn)程又生成多個(gè)線程,以獲得基于進(jìn)程服務(wù)器的穩(wěn)定性。這種MPM的工作方式將是Apache 2.0的發(fā)展趨勢。 
  在configure -with-mpm=worker后,進(jìn)行make編譯、make install安裝。在缺省生成的
httpd.conf中有以下配置段:
StartServers 2 
MaxClients 150 
MinSpareThreads 25 
MaxSpareThreads 75 
ThreadsPerChild 25 
MaxRequestsPerChild 0 
  worker的工作原理是,由主控制進(jìn)程生成“StartServers”個(gè)子進(jìn)程,每個(gè)子進(jìn)程中包含固定的ThreadsPerChild線程數(shù),各個(gè)線程獨(dú)立地處理請求。同樣,為了不在請求到來時(shí)再生成線程,MinSpareThreads和MaxSpareThreads設(shè)置了最少和最多的空閑線程數(shù);而MaxClients設(shè)置了所有子進(jìn)程中的線程總數(shù)。如果現(xiàn)有子進(jìn)程中的線程總數(shù)不能滿足負(fù)載,控制進(jìn)程將派生新的子進(jìn)程。 
  MinSpareThreads和MaxSpareThreads的最大缺省值分別是75和250。這兩個(gè)參數(shù)對Apache的性能影響并不大,可以按照實(shí)際情況相應(yīng)調(diào)節(jié)。 
  ThreadsPerChild是worker MPM中與性能相關(guān)最密切的指令。ThreadsPerChild的最大缺省值是64,如果負(fù)載較大,64也是不夠的。這時(shí)要顯式使用ThreadLimit指令,它的最大缺省值是20000。上述兩個(gè)值位于源碼樹server/mpm/worker/worker.c中的以下兩行: 
#define DEFAULT_THREAD_LIMIT 64 
#define MAX_THREAD_LIMIT 20000 
  這兩行對應(yīng)著ThreadsPerChild和ThreadLimit的限制數(shù)。最好在configure之前就把64改成所希望的值。注意,不要把這兩個(gè)值設(shè)得太高,超過系統(tǒng)的處理能力,從而因Apache不起動(dòng)使系統(tǒng)很不穩(wěn)定。 
  Worker模式下所能同時(shí)處理的請求總數(shù)是由子進(jìn)程總數(shù)乘以ThreadsPerChild值決定的,應(yīng)該大于等于MaxClients。如果負(fù)載很大,現(xiàn)有的子進(jìn)程數(shù)不能滿足時(shí),控制進(jìn)程會(huì)派生新的子進(jìn)程。默認(rèn)最大的子進(jìn)程總數(shù)是16,加大時(shí)也需要顯式聲明ServerLimit(最大值是20000)。這兩個(gè)值位于源碼樹server/mpm/worker/worker.c中的以下兩行: 
#define DEFAULT_SERVER_LIMIT 16 
#define MAX_SERVER_LIMIT 20000 
  需要注意的是,如果顯式聲明了ServerLimit,那么它乘以ThreadsPerChild的值必須大于等于MaxClients,而且MaxClients必須是ThreadsPerChild的整數(shù)倍,否則Apache將會(huì)自動(dòng)調(diào)節(jié)到一個(gè)相應(yīng)值(可能是個(gè)非期望值)。下面是常用worker配置段: 
StartServers 3 
MaxClients 2000 
ServerLimit 25 
MinSpareThreads 50 
MaxSpareThreads 200 
ThreadLimit 200 
ThreadsPerChild 100 
MaxRequestsPerChild 0 
  通過上面的敘述,可以了解到Apache 2.0中prefork和worker這兩個(gè)重要MPM的工作原理,并可根據(jù)實(shí)際情況來配置Apache相關(guān)的核心參數(shù),以獲得最大的性能和穩(wěn)定性。

附:以下個(gè)人理解,恐怕有誤。

StartServers 3   //apache已啟動(dòng)馬上創(chuàng)建3個(gè)httpd進(jìn)程(ps aux可以看到)
MaxClients 2000   //同一時(shí)間最大接受2000個(gè)請求(其實(shí)就是2000個(gè)線程)
ServerLimit 25 //apache最大能啟動(dòng)25個(gè)進(jìn)程。
MinSpareThreads 50 //apache至少要有50個(gè)空閑線程,用來等待接下來的請求,不滿則由進(jìn)程創(chuàng)建線程
MaxSpareThreads 200 //apache最多能有200個(gè)線程,超出了200個(gè)線程,則殺死多余的線程
ThreadLimit 200 //限制一個(gè)進(jìn)程最多只能創(chuàng)建200個(gè)線程
ThreadsPerChild 100 //設(shè)定一個(gè)進(jìn)程固定創(chuàng)建100個(gè)線程
MaxRequestsPerChild 10000   //設(shè)定當(dāng)一個(gè)進(jìn)程一共接受過10000此請求之后被殺死。以釋放內(nèi)存。

   從上面的配置我們可以看出,當(dāng)apache啟動(dòng)時(shí),啟動(dòng)3個(gè)httpd進(jìn)程,每個(gè)進(jìn)程又生成100個(gè)線程,但是超過了最大限定的數(shù)字,于是殺死100個(gè)線程,也就是一個(gè)進(jìn)程。當(dāng)某個(gè)時(shí)候有300個(gè)請求,目前只有200個(gè)線程,于是父進(jìn)程再創(chuàng)建2個(gè)子進(jìn)程。等請求處理完畢后,在把閑置釋放到只剩下200個(gè)以內(nèi)。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI