溫馨提示×

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

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

Apache優(yōu)化配置——工作模式

發(fā)布時(shí)間:2020-07-17 01:06:58 來源:網(wǎng)絡(luò) 閱讀:1670 作者:Cherry_liang 欄目:建站服務(wù)器

Apache所運(yùn)行的硬件環(huán)境都是對(duì)性能影響最大的因素

各個(gè)硬件指標(biāo)中,對(duì)性能影響最大的是內(nèi)存,其次是硬盤的速度

●Apache的工作模式

1、prefork模式(一個(gè) 非線程型的)

⑴、主要工作方式:當(dāng)Apache服務(wù)器啟動(dòng)后,mpm_prefork模塊會(huì)預(yù)先創(chuàng)建多個(gè)子進(jìn)程(默認(rèn)為5個(gè)),每個(gè)子進(jìn)程只有一個(gè)線程,當(dāng)接收到客戶端的請(qǐng)求后,mpm_prefork模塊再將請(qǐng)求轉(zhuǎn)交給子進(jìn)程處理,并且每個(gè)子進(jìn)程同時(shí)只能用于處理單個(gè)請(qǐng)求。如果當(dāng)前的請(qǐng)求數(shù)將超過預(yù)先創(chuàng)建的子進(jìn)程數(shù)時(shí),mpm_prefork模塊就會(huì)創(chuàng)建新的子進(jìn)程來處理額外的請(qǐng)求。Apache總是試圖保持一些備用的或者是空閑的子進(jìn)程用于迎接即將到來的請(qǐng)求,這樣客戶端的請(qǐng)求就不需要在接收后等候子進(jìn)程的產(chǎn)生。

⑵prefork在效率上要比worker要高,但是內(nèi)存使用大多不擅長(zhǎng)處理高并發(fā)的場(chǎng)景

⑶Apache在prefork工作模式下影響性能的重要參數(shù)說明:

#prefork MPM

<ifModule mpm_prefork_module>

        StartServers    5        #Apache啟動(dòng)時(shí)默認(rèn)開始的子進(jìn)程數(shù)

        MinSpareServers    5        #最小的閑置子進(jìn)程數(shù)

        MaxSpareServers    10        #最大的閑置子進(jìn)程數(shù),

        MaxRequestWorkers    250        #MaxRequestWorkers設(shè)置了允許同時(shí)最大接入的請(qǐng)求數(shù)量,任何超過MaxRequestWorkers限制的請(qǐng)求將進(jìn)入等候隊(duì)列

        MaxConnectionsPerChild    500        #設(shè)置的是每個(gè)子進(jìn)程可處理的請(qǐng)求數(shù)。每個(gè)進(jìn)程在處理了“MaxConnectionsPerChild”請(qǐng)求后將自動(dòng)銷毀。0意味著無限,即子進(jìn)程永不銷毀。設(shè)置為1時(shí)可防止意外的內(nèi)存泄漏。設(shè)置為2時(shí)表示在服務(wù)器負(fù)載下降的時(shí)候會(huì)自動(dòng)減少子進(jìn)程數(shù)??筛鶕?jù)服務(wù)器的負(fù)載來調(diào)整此值

★注:

①M(fèi)axRequestWorkers是這些指令中最為重要的一個(gè),設(shè)定的是Apache可以同時(shí)處理的請(qǐng)求,是對(duì)Apache性能影響最大的參數(shù)。如果請(qǐng)求總數(shù)已經(jīng)達(dá)到這個(gè)值(通過ps -ef | grep http | wc -l來確認(rèn))那么后面的請(qǐng)求就要排隊(duì),直到某個(gè)已處理請(qǐng)求完畢。這就是系統(tǒng)資源還剩下很多而http訪問卻很慢的主要原因。雖然理論上這個(gè)值越大,可以處理的請(qǐng)求就越多,建議將初始值設(shè)為以MB為單位的最大物理內(nèi)存/2,然后根據(jù)負(fù)載情況進(jìn)行動(dòng)態(tài)調(diào)整。

②prefork控制進(jìn)程在最初建立“StartServers”子進(jìn)程后,為了滿足MinSpareServers設(shè)置的需要?jiǎng)?chuàng)建一個(gè)進(jìn)程,等待一秒鐘,繼續(xù)創(chuàng)建兩個(gè),再等待一秒鐘,繼續(xù)創(chuàng)建四個(gè)......如此按指數(shù)級(jí)增加創(chuàng)建的進(jìn)程數(shù),最多達(dá)到每秒32個(gè),直到滿足MinSpareServers設(shè)置的值為止,這種模式可以不必再請(qǐng)求到來時(shí)再產(chǎn)生新的進(jìn)程,從而減小了系統(tǒng)開銷以增加性能。MaxSpareServers設(shè)置了最大的空閑進(jìn)程數(shù),如果空閑進(jìn)程數(shù)大于這個(gè)值,Apache會(huì)kill掉一些多余的進(jìn)程,這個(gè)值不要設(shè)的過大,但如果設(shè)的值比MinSpareServers小,Apache會(huì)自動(dòng)把其調(diào)整為MinSpareServers+1。如果站點(diǎn)負(fù)載較大,可考慮同時(shí)加大MinSpareServers和MaxSpareServers。

ServerLimit和MaxClients(MaxRequestWorkers)的區(qū)別:在Apache時(shí)代,控制最大進(jìn)程數(shù)只有MaxClients這個(gè)參數(shù),并且這個(gè)參數(shù)最大值為256,并且是寫死了的,試圖設(shè)置為超過256是無效的,這是由于Apache1時(shí)代的服務(wù)器硬件是限制的。但是Apache2時(shí)代由于服務(wù)器硬件的升級(jí),硬件已經(jīng)不再是限制,所以ServerLimit這個(gè)參數(shù)來控制最大進(jìn)程數(shù),ServerLimit值>=MaxClient值才有效。ServerLimit要放在MaxClients之前,值不要小于Maxclients。

查看Apache加載的模塊:apachectl -t -D DUMP_MODULES 或 apachectl -M 或 apachectl -l

    查看Apache的工作模式:httpd -v 或 httpd -l

修改prefork參數(shù)和啟動(dòng)prefork模式

   vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf

    vi /usr/local/http-2.4.23/conf/httpd.conf 添加兩行:LoadModule mpm_prefork_module/mod_mpm_prefork.so 和 Include conf/extra/httpd-mpm.conf

    重啟httpd服務(wù)

2、Worker模式(多線程多進(jìn)程) 

⑴與prefork的比較:prefork速度要稍高于worker,然而它需要的CPU和memory資源也稍多于worker

⑵Apache在worker工作模式下影響性能的重要參數(shù)說明

#worker MPM

<ifModule mpm_worker_module>

    StartServers    3        #Apache啟動(dòng)時(shí)默認(rèn)開始的子進(jìn)程數(shù)

    MinSpareThreads    75        #最小空閑數(shù)量的工作進(jìn)程

    MaxSpareThreads    250        #最大空閑數(shù)量的工作線程

    ThreadPerChild    25        #每個(gè)子進(jìn)程產(chǎn)生的線程數(shù)量

    MaxRequestWorkers    400        #MaxRequestWorkers設(shè)置了允許同時(shí)最大接入的請(qǐng)求數(shù)量,任何超過MaxRequestWorkers限制的請(qǐng)求將進(jìn)入等候隊(duì)列

    MaxConnectionsPerChild    0        #設(shè)置的是每個(gè)子進(jìn)程可處理的請(qǐng)求數(shù)。每個(gè)進(jìn)程在處理了MaxConnectionsPerChild請(qǐng)求后將自動(dòng)銷毀。0意味著無限,即子進(jìn)程永不銷毀

★注:

①Worker由主控制進(jìn)程生成“StartServers”子進(jìn)程,每個(gè)子進(jìn)程中包含固定的ThreadsPerChild線程數(shù),各個(gè)線程獨(dú)立地處理請(qǐng)求。同樣,為了不在請(qǐng)求到來時(shí)再生成線程,MinSpareThreads和MaxSpareThreads設(shè)置了最少和最多的空閑線程數(shù)。而MaxRequestWorkers設(shè)置了同時(shí)連入的clients最大總數(shù),如果現(xiàn)有子進(jìn)程中的線程總數(shù)不能滿足負(fù)載,控制進(jìn)程將派生新的子進(jìn)程。MinSpareThreads和MaxSpareThreads的最大缺省值分別是75和250.這兩個(gè)參數(shù)對(duì)Apache的性能影響并不大,可以按照實(shí)際情況相應(yīng)調(diào)節(jié)

② ThreadsPerChild是worker MPM 中與性能相關(guān)最密切的指令,ThreadsPerChild的最大缺省值是64,如果負(fù)載較大,64位也是不夠的,這時(shí)要使用ThreadLimit指令,他的最大缺省值是20000

③Worker模式下所能同時(shí)處理的請(qǐng)求總數(shù)是由子進(jìn)程總數(shù)乘以ThreadsPerChild值決定的,應(yīng)該大于等于MaxRequestWorkers。如果負(fù)載很大,現(xiàn)有的子進(jìn)程數(shù)不能滿足時(shí),控制進(jìn)程會(huì)派生新的子進(jìn)。默認(rèn)最大的子進(jìn)程總數(shù)是16,加大時(shí)也需要顯示聲明ServerLimit。需要注意的是,如果顯示聲明了ServerLimit,那么它乘以ThreadsPerChild的值必須大于等于MaxRequestWorkers,而且MaxRequestWorkers必須是ThreadsPerChild的整數(shù)倍,否則Apache將會(huì)自動(dòng)調(diào)節(jié)到一個(gè)相應(yīng)值

④進(jìn)程與線程的區(qū)別(線程是指進(jìn)程內(nèi)的一個(gè)執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體)

a、地址空間:進(jìn)程內(nèi)的一個(gè)執(zhí)行單元;進(jìn)程至少有一個(gè)線程;它們共享進(jìn)程的地址空間;而進(jìn)程有自己獨(dú)立的地址空間

b、資源擁有:進(jìn)程是資源分配和擁有的單位,同一進(jìn)程內(nèi)的線程共享進(jìn)程的資源

c、線程是處理器調(diào)度的基本單位,但進(jìn)程不是

d、二者均可并發(fā)執(zhí)行:進(jìn)程和線程都是由操作 系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元, 系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對(duì)應(yīng)用的并發(fā)性

e、簡(jiǎn)單來說,就是一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程

    線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高

    進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率

3、Event模式

這是Apache最新的工作模式,是worker模式的變種,它把服務(wù)進(jìn)程從連接中分離出來,worker模式不同的是在于它解決了,keep-alive長(zhǎng)連接的時(shí)候占用線程資源被浪費(fèi)的問題,在event工作模式中,會(huì)有一些專門的線程用來管理這些keep-alive類型的線程,當(dāng)有真實(shí)請(qǐng)求過來的時(shí)候,將請(qǐng)求傳遞給服務(wù)器的線程,執(zhí)行完畢后,又允許它釋放。這增強(qiáng)了在高并發(fā)場(chǎng)景下的請(qǐng)求處理。event模式不能很好的支持https的訪問


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

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

AI