煩惱歲月

          付出總是有回報的 take action follow your heart , or follow your head
          posts - 40, comments - 5, trackbacks - 0, articles - 4

          Apache 2.0中prefork.c模塊和worker.c模塊的比較

          Posted on 2007-11-13 10:44 不需要解釋 閱讀(1742) 評論(0)  編輯  收藏 所屬分類: apache

          Apache 2.XX中prefork.c模塊和worker.c模塊的比較

          空閑子進(jìn)程:是指沒有正在處理請求的子進(jìn)程。

          1、prefork.c模塊(一個非線程型的、預(yù)派生的MPM)
              prefork MPM 使用多個子進(jìn)程,每個子進(jìn)程只有一個線程。每個進(jìn)程在某個確定的時間只能維持一個連接。在大多數(shù)平臺上,Prefork MPM在效率上要比Worker MPM要高,但是內(nèi)存使用大得多。prefork的無線程設(shè)計在某些情況下將比worker更有優(yōu)勢:它可以使用那些沒有處理好線程安全的第三方模塊,并且對于那些線程調(diào)試?yán)щy的平臺而言,它也更容易調(diào)試一些。

          <IfModule prefork.c>
          ServerLimit  20000
          StartServers  5
          MinSpareServers  5
          MaxSpareServers  10
          MaxClients  1000
          MaxRequestsPerChild 0
          </IfModule>

          ServerLimit     2000
          //默認(rèn)的MaxClient最大是256個線程,如果想設(shè)置更大的值,就的加上ServerLimit這個參數(shù)。20000是ServerLimit這個參數(shù)的最大值。如果需要更大,則必須編譯apache,此前都是不需要重新編譯Apache。
          生效前提:必須放在其他指令的前面

          StartServers  5
          //指定服務(wù)器啟動時建立的子進(jìn)程數(shù)量,prefork默認(rèn)為5。

          MinSpareServers  5
          //指定空閑子進(jìn)程的最小數(shù)量,默認(rèn)為5。如果當(dāng)前空閑子進(jìn)程數(shù)少于MinSpareServers ,那么Apache將以最大每秒一個的速度產(chǎn)生新的子進(jìn)程。此參數(shù)不要設(shè)的太大。

          MaxSpareServers  10
          //設(shè)置空閑子進(jìn)程的最大數(shù)量,默認(rèn)為10。如果當(dāng)前有超過MaxSpareServers數(shù)量的空閑子進(jìn)程,那么父進(jìn)程將殺死多余的子進(jìn)程。此參數(shù)不要設(shè)的太大。如果你將該指令的值設(shè)置為比MinSpareServers小,Apache將會自動將其修改成"MinSpareServers+1"。

          MaxClients  256
          //限定同一時間客戶端最大接入請求的數(shù)量(單個進(jìn)程并發(fā)線程數(shù)),默認(rèn)為256。任何超過MaxClients限制的請求都將進(jìn)入等候隊列,一旦一個鏈接被釋放,隊列中的請求將得到服務(wù)。要增大這個值,你必須同時增大ServerLimit 。

          MaxRequestsPerChild 10000
          //每個子進(jìn)程在其生存期內(nèi)允許伺服的最大請求數(shù)量,默認(rèn)為10000.到達(dá)MaxRequestsPerChild的限制后,子進(jìn)程將會結(jié)束。如果MaxRequestsPerChild為"0",子進(jìn)程將永遠(yuǎn)不會結(jié)束。

          將MaxRequestsPerChild設(shè)置成非零值有兩個好處:
          1.可以防止(偶然的)內(nèi)存泄漏無限進(jìn)行,從而耗盡內(nèi)存。
          2.給進(jìn)程一個有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時候減少活動進(jìn)程的數(shù)量。

          工作方式:
          一個單獨的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)產(chǎn)生子進(jìn)程,這些子進(jìn)程用于監(jiān)聽請求并作出應(yīng)答。Apache總是試圖保持一些備用的(spare)或者是空閑的子進(jìn)程用于迎接即將到來的請求。這樣客戶端就不需要在得到服務(wù)前等候子進(jìn)程的產(chǎn)生。在Unix系統(tǒng)中,父進(jìn)程通常以root身份運行以便邦定80端口,而Apache產(chǎn)生的子進(jìn)程通常以一個低特權(quán)的用戶運行。User和Group指令用于設(shè)置子進(jìn)程的低特權(quán)用戶。運行子進(jìn)程的用戶必須要對它所服務(wù)的內(nèi)容有讀取的權(quán)限,但是對服務(wù)內(nèi)容之外的其他資源必須擁有盡可能少的權(quán)限。


          2、worker.c模塊(支持混合的多線程多進(jìn)程的多路處理模塊)
              worker MPM 使用多個子進(jìn)程,每個子進(jìn)程有多個線程。每個線程在某個確定的時間只能維持一個連接。通常來說,在一個高流量的HTTP服務(wù)器上,Worker MPM是個比較好的選擇,因為Worker MPM的內(nèi)存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一個線程崩潰,整個進(jìn)程就會連同其所有線程一起"死掉".由于線程共享內(nèi)存空間,所以一個程序在運行時必須被系統(tǒng)識別為"每個線程都是安全的"。

          <IfModule worker.c>
          ServerLimit  50
          ThreadLimit  200
          StartServers  5
          MaxClients  5000
          MinSpareThreads  25
          MaxSpareThreads  500
          ThreadsPerChild  100
          MaxRequestsPerChild 0
          </IfModule>

          ServerLimit 16
          //服務(wù)器允許配置的進(jìn)程數(shù)上限。這個指令和ThreadLimit結(jié)合使用設(shè)置了MaxClients最大允許配置的數(shù)值。任何在重啟期間對這個指令的改變都將被忽略,但對MaxClients的修改卻會生效。

          ThreadLimit 64
          //每個子進(jìn)程可配置的線程數(shù)上限。這個指令設(shè)置了每個子進(jìn)程可配置的線程數(shù)ThreadsPerChild上限。任何在重啟期間對這個指令的改變都將被忽略,但對ThreadsPerChild的修改卻會生效。默認(rèn)值是"64".

          StartServers 3
          //服務(wù)器啟動時建立的子進(jìn)程數(shù),默認(rèn)值是"3"。

          MinSpareThreads 75
          //最小空閑線程數(shù),默認(rèn)值是"75"。這個MPM將基于整個服務(wù)器監(jiān)視空閑線程數(shù)。如果服務(wù)器中總的空閑線程數(shù)太少,子進(jìn)程將產(chǎn)生新的空閑線程。

          MaxSpareThreads 250
          //設(shè)置最大空閑線程數(shù)。默認(rèn)值是"250"。這個MPM將基于整個服務(wù)器監(jiān)視空閑線程數(shù)。如果服務(wù)器中總的空閑線程數(shù)太多,子進(jìn)程將殺死多余的空閑線程。MaxSpareThreads的取值范圍是有限制的。Apache將按照如下限制自動修正你設(shè)置的值:worker要求其大于等于MinSpareThreads加上ThreadsPerChild的和

          MaxClients 400
          //允許同時伺服的最大接入請求數(shù)量(最大線程數(shù)量)。任何超過MaxClients限制的請求都將進(jìn)入等候隊列。默認(rèn)值是"400",16(ServerLimit)乘以25(ThreadsPerChild)的結(jié)果。因此要增加MaxClients的時候,你必須同時增加ServerLimit的值。

          ThreadsPerChild 25
          //每個子進(jìn)程建立的常駐的執(zhí)行線程數(shù)。默認(rèn)值是25。子進(jìn)程在啟動時建立這些線程后就不再建立新的線程了。

          MaxRequestsPerChild  0
          //設(shè)置每個子進(jìn)程在其生存期內(nèi)允許伺服的最大請求數(shù)量。到達(dá)MaxRequestsPerChild的限制后,子進(jìn)程將會結(jié)束。如果MaxRequestsPerChild為"0",子進(jìn)程將永遠(yuǎn)不會結(jié)束。

          將MaxRequestsPerChild設(shè)置成非零值有兩個好處:
          1.可以防止(偶然的)內(nèi)存泄漏無限進(jìn)行,從而耗盡內(nèi)存。
          2.給進(jìn)程一個有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時候減少活動進(jìn)程的數(shù)量。
          注意
          對于KeepAlive鏈接,只有第一個請求會被計數(shù)。事實上,它改變了每個子進(jìn)程限制最大鏈接數(shù)量的行為。

          工作方式:
          每個進(jìn)程可以擁有的線程數(shù)量是固定的。服務(wù)器會根據(jù)負(fù)載情況增加或減少進(jìn)程數(shù)量。一個單獨的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)子進(jìn)程的建立。每個子進(jìn)程可以建立ThreadsPerChild數(shù)量的服務(wù)線程和一個監(jiān)聽線程,該監(jiān)聽線程監(jiān)聽接入請求并將其傳遞給服務(wù)線程處理和應(yīng)答。Apache總是試圖維持一個備用(spare)或是空閑的服務(wù)線程池。這樣,客戶端無須等待新線程或新進(jìn)程的建立即可得到處理。在Unix中,為了能夠綁定80端口,父進(jìn)程一般都是以root身份啟動,隨后,Apache以較低權(quán)限的用戶建立子進(jìn)程和線程。User和Group指令用于設(shè)置Apache子進(jìn)程的權(quán)限。雖然子進(jìn)程必須對其提供的內(nèi)容擁有讀權(quán)限,但應(yīng)該盡可能給予它較少的特權(quán)。另外,除非使用了suexec ,否則,這些指令設(shè)置的權(quán)限將被CGI腳本所繼承。


          公式:
          ThreadLimit >= ThreadsPerChild
          MaxClients  <= ServerLimit * ThreadsPerChild  必須是ThreadsPerChild的倍數(shù)
          MaxSpareThreads >= MinSpareThreads+ThreadsPerChild

          硬限制:

          ServerLimi和ThreadLimit這兩個指令決定了活動子進(jìn)程數(shù)量和每個子進(jìn)程中線程數(shù)量的硬限制。要想改變這個硬限制必須完全停止服務(wù)器然后再啟動服務(wù)器(直接重啟是不行的)。

          Apache在編譯ServerLimit時內(nèi)部有一個硬性的限制,你不能超越這個限制。
          prefork MPM最大為"ServerLimit 200000"
          其它MPM(包括work MPM)最大為"ServerLimit 20000

          Apache在編譯ThreadLimit時內(nèi)部有一個硬性的限制,你不能超越這個限制。
          mpm_winnt是"ThreadLimit 15000"
          其它MPM(包括work prefork)為"ThreadLimit 20000

          注意
          使用ServerLimit和ThreadLimit時要特別當(dāng)心。如果將ServerLimit和ThreadLimit設(shè)置成一個高出實際需要許多的值,將會有過多的共享內(nèi)存被分配。當(dāng)設(shè)置成超過系統(tǒng)的處理能力,Apache可能無法啟動,或者系統(tǒng)將變得不穩(wěn)定。


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          我實話告訴你們,我可是身經(jīng)百戰(zhàn)了.bbs我見的多了,哪個版我沒灌過?你們要知道, 一塌糊 涂的triangle,PIC,SEX版,那比你們不知道厲害到哪里去了,我在那談笑風(fēng)聲.你 們有一好就是無論在哪個版,什么話題都灌,但是灌來灌去的問題,都too simple, sometimes naive!你 們懂不懂呀?啊?所以說灌水啊,關(guān)鍵是要提高自己的知識水平.你 們啊,不要總想著弄個大坑,然后灌上十大,再把我羞辱一番……你們啊,naive!你們這 樣灌是不行地!~那你問我支持 不支持灌水,我說支持,我常來這裡灌,你說支持不支持?
          主站蜘蛛池模板: 阿拉善盟| 调兵山市| 新昌县| 潜江市| 兴和县| 安塞县| 东光县| 富阳市| 汝阳县| 衡东县| 株洲市| 永修县| 博野县| 珲春市| 杭锦后旗| 滦南县| 郴州市| 徐水县| 宜阳县| 马尔康县| 杭州市| 泌阳县| 尖扎县| 左权县| 三门峡市| 自贡市| 清水县| 西贡区| 邢台县| 军事| 宁夏| 朝阳区| 松溪县| 榆树市| 临江市| 彰化县| 徐闻县| 乡城县| 仙游县| 绥中县| 延边|