您好,登錄后才能下訂單哦!
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的訪問
免責(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)容。