亚洲国产成人精品在线播放_日韩第一页在线观看_人人插人人摸精品在线视频_日韩黄色成人电影_国产人成无码视频在线观看_国产91热爆ts人妖系列_免费观看欧美一级_午夜影院操一操黄片_午夜大片免费爽爽爽影院_日本少妇中文三级

Contact Us

Address: 1st Floor,Building 4, 1088th, Huyi highway, Shanghai
TEL:021-31080981
Email:soline@soline.com.cn
P.C.:201802

Apache solution

前言:

項(xiàng)目100人同時(shí)訪問(wèn),導(dǎo)致訪問(wèn)速度變慢

多路處理模塊MPM(Multi-Processing Module)介紹

作為Apache的核心模塊它針對(duì)不同的操作系統(tǒng)提供了多個(gè)不同的MPM模塊,例如:mpm_beosmpm_event、mpm_netwarempmt_os2、mpm_prefork、mpm_winntmpm_worker。 如果條件允許,我們可以根據(jù)實(shí)際需求將指定的MPM模塊編譯進(jìn)我們自己的Apache中(Apache的源碼是開(kāi)放的,允許用戶自行編譯)。不過(guò),如果在編譯時(shí)我們沒(méi)有選擇,Apache將按照如下表格根據(jù)不同的操作系統(tǒng)自行選擇對(duì)應(yīng)的MPM模塊,這也是Apache針對(duì)不同平臺(tái)推薦使用的MPM模塊。

不同操作系統(tǒng)上默認(rèn)的MPM模塊
操作系統(tǒng)MPM模塊描述
Windowsmpm_winntWindows系統(tǒng)
Unix/Linuxmpm_winntUnix/Linux系統(tǒng)
BeOSmpm_beos由Be公司開(kāi)發(fā)的一種多媒體操作系統(tǒng),官方版已停止更新。
Netwarempm_netware由NOVELL公司推出的一種網(wǎng)絡(luò)操作系統(tǒng)
OS/2mpmt_os2一種最初由微軟和IBM共同開(kāi)發(fā)的操作系統(tǒng),現(xiàn)由IBM單獨(dú)開(kāi)發(fā)(微軟放棄OS/2,轉(zhuǎn)而開(kāi)發(fā)Windows)

mpm_event模塊可以看作是mpm_worker模塊的一個(gè)變種,不過(guò)其具有實(shí)驗(yàn)性質(zhì),一般不推薦使用。
當(dāng)然,Apache在其官方網(wǎng)站上也提供了根據(jù)不同操作系統(tǒng)已經(jīng)編譯好對(duì)應(yīng)MPM模塊的成品Apache。你可以點(diǎn)擊此處進(jìn)入Apache官方網(wǎng)站下載。

此外,如果我們想要知道某個(gè)Apache內(nèi)部使用的是何種MPM模塊,我們可以以命令行的方式進(jìn)入Apache安裝目錄\bin,然后鍵入命令httpd -l,即可查看到當(dāng)前Apache內(nèi)部使用的何種MPM模塊。

由于在平常的開(kāi)發(fā)工作中,BeOS、NetWare、OS/2等操作系統(tǒng)并不常見(jiàn),這里我們主要針對(duì)Windows和Unix/Linux操作系統(tǒng)上的MPM模塊進(jìn)行講解。在Windows和Unix/Linux操作系統(tǒng)上,MPM模塊主要有mpm_winnt、mpm_prefork、mpm_worker三種。

mpm_prefork模塊

mpm_prefork模塊主要應(yīng)用于Unix/Linux平臺(tái)的Apache服務(wù)器,其主要工作方式是:當(dāng)Apache服務(wù)器啟動(dòng)后,mpm_prefork模塊會(huì)預(yù)先創(chuàng)建多個(gè)子進(jìn)程(默認(rèn)為5個(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ù)將超過(guò)預(yù)先創(chuàng)建的子進(jìn)程數(shù)時(shí),mpm_prefork模塊就會(huì)創(chuàng)建新的子進(jìn)程來(lái)處理額外的請(qǐng)求。Apache總是試圖保持一些備用的或者是空閑的子進(jìn)程用于迎接即將到來(lái)的請(qǐng)求。這樣客戶端的請(qǐng)求就不需要在接收后等候子進(jìn)程的產(chǎn)生。

由于在mpm_prefork模塊中,每個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)子進(jìn)程,因此其占用的系統(tǒng)資源相對(duì)其他兩種模塊而言較多。不過(guò)mpm_prefork模塊的優(yōu)點(diǎn)在于它的每個(gè)子進(jìn)程都會(huì)獨(dú)立處理對(duì)應(yīng)的單個(gè)請(qǐng)求,這樣,如果其中一個(gè)請(qǐng)求出現(xiàn)問(wèn)題就不會(huì)影響到其他請(qǐng)求。同時(shí),mpm_prefork模塊可以應(yīng)用于不具備線程安全的第三方模塊(比如PHP的非線程安全版本),且在不支持線程調(diào)試的平臺(tái)上易于調(diào)試。此外,mpm_prefork模塊還具有比mpm_worker模塊更高的穩(wěn)定性。

mpm_worker模塊

mpm_worker模塊也主要應(yīng)用于Unix/Linux平臺(tái)的Apache服務(wù)器,它可以看作是mpm_prefork模塊的改進(jìn)版。mpm_worker模塊的工作方式與mpm_prefork模塊類(lèi)似。不過(guò),由于處理相同請(qǐng)求的情況下,基于進(jìn)程(例如mpm_prefork)比基于線程的處理方式占用的系統(tǒng)資源要多。因此,與mpm_prefork模塊不同的是,mpm_worker模塊會(huì)讓每個(gè)子進(jìn)程創(chuàng)建固定數(shù)量的服務(wù)線程和一個(gè)監(jiān)聽(tīng)線程,并讓每個(gè)服務(wù)線程來(lái)處理客戶端的請(qǐng)求,監(jiān)聽(tīng)線程用于監(jiān)聽(tīng)接入請(qǐng)求并將其傳遞給服務(wù)線程處理和應(yīng)答。Apache總是試圖維持一個(gè)備用或是空閑的服務(wù)線程池。這樣,客戶端無(wú)須等待新線程或新進(jìn)程的建立即可得到處理。

與mpm_prefork模塊相比,mpm_worker模塊可以進(jìn)一步減少系統(tǒng)資源的開(kāi)銷(xiāo)。再加上它也使用了多進(jìn)程,每個(gè)進(jìn)程又有多個(gè)線程,因此它與完全基于線程的處理方式相比,又增加了一定的穩(wěn)定性。

mpm_winnt模塊

mpm_winnt模塊是專(zhuān)門(mén)針對(duì)Windows操作系統(tǒng)而優(yōu)化設(shè)計(jì)的MPM模塊。它只創(chuàng)建一個(gè)單獨(dú)的子進(jìn)程,并在這個(gè)子進(jìn)程中輪流產(chǎn)生多個(gè)線程來(lái)處理請(qǐng)求。

修改MPM模塊配置

在對(duì)Apache的MPM模塊具備一定了解后,我們就可以針對(duì)不同的MPM模塊來(lái)修改Apache的最大并發(fā)連接數(shù)配置了。

  1. 啟用MPM模塊配置文件

    在Apace安裝目錄/conf/extra目錄中有一個(gè)名為httpd-mpm.conf的配置文件。該文件主要用于進(jìn)行MPM模塊的相關(guān)配置。不過(guò),在默認(rèn)情況下,Apache的MPM模塊配置文件并沒(méi)有啟用。因此,我們需要在httpd.conf文件中啟用該配置文件,如下所示:

    # Server-pool management (MPM specific)# Include conf/extra/httpd-mpm.conf (去掉該行前面的注釋符號(hào)"#")
  2. 修改MPM模塊配置文件中的相關(guān)配置

    在啟動(dòng)MPM模塊配置文件后,我們就可以使用文本編輯器打開(kāi)該配置文件,我們可以看到,在該配置文件中有許多<IfModule>配置節(jié)點(diǎn),如下圖所示:
    httpd-mpm.conf文件截圖

此時(shí),我們就需要根據(jù)當(dāng)前Apache服務(wù)器所使用的MPM模塊,來(lái)修改對(duì)應(yīng)節(jié)點(diǎn)下的參數(shù)配置。首先,我們來(lái)看看mpm_winnt模塊下的默認(rèn)配置:

mpm_winnt模塊

#由于mpm_winnt模塊只會(huì)創(chuàng)建1個(gè)子進(jìn)程,因此這里對(duì)單個(gè)子進(jìn)程的參數(shù)設(shè)置就相當(dāng)于對(duì)整個(gè)Apache的參數(shù)設(shè)置。<IfModule mpm_winnt_module>
ThreadsPerChild      150 #推薦設(shè)置:小型網(wǎng)站=1000 中型網(wǎng)站=1000~2000 大型網(wǎng)站=2000~3500MaxRequestsPerChild    0 #推薦設(shè)置:小=10000 中或大=20000~100000</IfModule>123456

對(duì)應(yīng)的配置參數(shù)作用如下:

ThreadsPerChild:每個(gè)子進(jìn)程的最大并發(fā)線程數(shù)。
MaxRequestsPerChild:每個(gè)子進(jìn)程允許處理的請(qǐng)求總數(shù)。如果累計(jì)處理的請(qǐng)求數(shù)超過(guò)該值,該子進(jìn)程將會(huì)結(jié)束(然后根據(jù)需要確定是否創(chuàng)建新的子進(jìn)程),該值設(shè)為0表示不限制請(qǐng)求總數(shù)(子進(jìn)程永不結(jié)束)。
該參數(shù)建議設(shè)為非零的值,可以帶來(lái)以下兩個(gè)好處:
1. 可以防止程序中可能存在的內(nèi)存泄漏無(wú)限進(jìn)行下去,從而耗盡內(nèi)存。
2. 給進(jìn)程一個(gè)有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時(shí)候減少活動(dòng)進(jìn)程的數(shù)量。

注意:在以上涉及到統(tǒng)計(jì)請(qǐng)求數(shù)量的參數(shù)中,對(duì)于KeepAlive的連接,只有第一個(gè)請(qǐng)求會(huì)被計(jì)數(shù)。

接著,我們?cè)賮?lái)看看mpm_perfork模塊和mpm_worker模塊下的默認(rèn)配置:

mpm_perfork模塊

<IfModule mpm_prefork_module>
StartServers          5 #推薦設(shè)置:小=默認(rèn) 中=20~50 大=50~100MinSpareServers       5 #推薦設(shè)置:與StartServers保持一致MaxSpareServers      10 #推薦設(shè)置:小=20 中=30~80 大=80~120 MaxClients          150 #推薦設(shè)置:小=500 中=500~1500 大型=1500~3000MaxRequestsPerChild   0 #推薦設(shè)置:小=10000 中或大=10000~500000</IfModule>1234567

此外,還需額外設(shè)置ServerLimit參數(shù),該參數(shù)最好與MaxClients的值保持一致。

# StartServers:  數(shù)量的服務(wù)器進(jìn)程開(kāi)始# MinSpareServers:  最小數(shù)量的服務(wù)器進(jìn)程,保存?zhèn)溆? MaxSpareServers:  最大數(shù)量的服務(wù)器進(jìn)程,保存?zhèn)溆? MaxRequestWorkers:  最大數(shù)量的服務(wù)器進(jìn)程允許開(kāi)始# MaxConnectionsPerChild:  最大連接數(shù)的一個(gè)服務(wù)器進(jìn)程服務(wù)12345678910

  prefork 控制進(jìn)程在最初建立 “StartServers”個(gè)子進(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)求到 來(lái)時(shí)再產(chǎn)生新的進(jìn)程,從而減小了系統(tǒng)開(kāi)銷(xiāo)以增加性能。MaxSpareServers設(shè)置了最大的空閑進(jìn)程數(shù),如果空閑進(jìn)程數(shù)大于這個(gè) 值,Apache 會(huì)自動(dòng)kill掉一些多余進(jìn)程。這個(gè)值不要設(shè)得過(guò)大,但如果設(shè)的值比MinSpareServers小,Apache會(huì)自動(dòng)把其調(diào)整 為 MinSpareServers+1。如果站點(diǎn)負(fù)載較大,可考慮同時(shí)加大MinSpareServers和MaxSpareServers。

  MaxRequestsPerChild設(shè)置的是每個(gè) 子進(jìn)程可處理的請(qǐng)求數(shù)。每個(gè)子進(jìn)程在處理了“MaxRequestsPerChild”個(gè)請(qǐng)求后將自 動(dòng)銷(xiāo)毀。0意味著無(wú)限,即子進(jìn)程永不銷(xiāo)毀。雖然缺省 設(shè)為0可以使每個(gè)子進(jìn)程處理更多的請(qǐng)求,但如果設(shè)成非零值也有兩點(diǎn)重要的好處:

  1. 可防止意外的內(nèi)存泄 漏。

  2. 在服務(wù)器負(fù)載下降的時(shí)侯會(huì)自動(dòng)減少子進(jìn)程數(shù)。

因此,可根據(jù)服務(wù)器的負(fù)載來(lái)調(diào)整這個(gè)值。

  MaxRequestWorkers指令集同時(shí)將服務(wù)請(qǐng)求的數(shù)量上的限制。任何連接嘗試在MaxRequestWorkerslimit將通常被排隊(duì),最多若干基于上ListenBacklog指令。

在apache2.3.13以前的版本MaxRequestWorkers被稱(chēng)為MaxClients 。

MaxClients是這些指令中最為重要的一個(gè),設(shè)定的是 Apache可以同 時(shí)處理的請(qǐng)求,是對(duì)Apache性能影響最大的參數(shù)。其缺省值150是遠(yuǎn)遠(yuǎn)不夠的,如果請(qǐng)求總數(shù)已達(dá)到這個(gè)值(可通過(guò) ps -ef|grep http|wc -l來(lái)確認(rèn)),那么后面的請(qǐng)求就要排隊(duì),直到某個(gè)已處理請(qǐng)求完畢。這就是系統(tǒng)資源還剩下很多而HTTP訪問(wèn)卻很 慢的主要原因。雖然理論上這個(gè)值越大,可以 處理的請(qǐng)求就越多,但Apache默認(rèn)的限制不能大于256。

mpm_worker模塊

<IfModule mpm_worker_module>
StartServers          2 #推薦設(shè)置:小=默認(rèn) 中=3~5 大=5~10MaxClients          150 #推薦設(shè)置:小=500 中=500~1500 大型=1500~3000MinSpareThreads      25 #推薦設(shè)置:小=默認(rèn) 中=50~100 大=100~200MaxSpareThreads      75 #推薦設(shè)置:小=默認(rèn) 中=80~160 大=200~400 ThreadsPerChild      25 #推薦設(shè)置:小=默認(rèn) 中=50~100 大型=100~200MaxRequestsPerChild   0 #推薦設(shè)置:小=10000 中或大=10000~50000(此外,如果MaxClients/ThreadsPerChild大于16,還需額外設(shè)置ServerLimit參數(shù),ServerLimit必須大于等于 MaxClients/ThreadsPerChild 的值。)
</IfModule>123456789

對(duì)應(yīng)的配置參數(shù)作用如下:

StartServers 啟動(dòng)Apache時(shí)創(chuàng)建的子進(jìn)程數(shù)。

MinSpareServers 處于空閑狀態(tài)的最小子進(jìn)程數(shù)。
所謂空閑子進(jìn)程是指沒(méi)有正在處理請(qǐng)求的子進(jìn)程。如果當(dāng)前空閑子進(jìn)程數(shù)少于MinSpareServers,那么Apache將以最大每秒一個(gè)的速度產(chǎn)生新的子進(jìn)程。只有在非常繁忙機(jī)器上才需要調(diào)整這個(gè)參數(shù)。此值不宜過(guò)大。

MaxSpareServers 處于空閑狀態(tài)的最大子進(jìn)程數(shù)。
只有在非常繁忙機(jī)器上才需要調(diào)整這個(gè)參數(shù)。此值不宜過(guò)大。如果你將該指令的值設(shè)置為比MinSpareServers小,Apache將會(huì)自動(dòng)將其修改成MinSpareServers+1。

MaxClients 允許同時(shí)連接的最大請(qǐng)求數(shù)量。
任何超過(guò)MaxClients限制的請(qǐng)求都將進(jìn)入等待隊(duì)列,直到達(dá)到ListenBacklog指令限制的最大值為止。

mpm_prefork

MaxClients表示可以用于處理客戶端請(qǐng)求的最大子進(jìn)程數(shù)量,默認(rèn)值是256。要增大這個(gè)值,你必須同時(shí)增大ServerLimit。

對(duì)于線程型或者混合型的MPM(也就是mpm_beosmpm_worker),MaxClients表示可以用于處理客戶端請(qǐng)求的最大線程數(shù)量。線程型的mpm_beos的默認(rèn)值是50。對(duì)于混合型的MPM默認(rèn)值是16(ServerLimit)乘以25(ThreadsPerChild)的結(jié)果。因此要將MaxClients增加到超過(guò)16個(gè)進(jìn)程才能提供的時(shí)候,你必須同時(shí)增加ServerLimit的值。

MinSpareThreads 處于空閑狀態(tài)的最小線程數(shù)。 不同的MPM對(duì)這個(gè)指令的處理是不一樣的:

mpm_worker的默認(rèn)值是75。這個(gè)MPM將基于整個(gè)服務(wù)器監(jiān)視空閑線程數(shù)。如果服務(wù)器中總的空閑線程數(shù)太少,子進(jìn)程將產(chǎn)生新的空閑線程。mpm_netware的默認(rèn)值是10。既然這個(gè)MPM只運(yùn)行單獨(dú)一個(gè)子進(jìn)程,此MPM當(dāng)然亦基于整個(gè)服務(wù)器監(jiān)視空閑線程數(shù)。mpm_beos和mpmt_os2的工作方式與mpm_netware差不多,mpm_beos的默認(rèn)值是1;mpmt_os2的默認(rèn)值是5。

MaxSpareThreads 處于空閑狀態(tài)的最大線程數(shù)。 不同的MPM對(duì)這個(gè)指令的處理是不一樣的:


注: mpm_worker的默認(rèn)值是250。這個(gè)MPM將基于整個(gè)服務(wù)器監(jiān)視空閑線程數(shù)。如果服務(wù)器中總的空閑線程數(shù)太多,子進(jìn)程將殺死多余的空閑線程。mpm_netware的默認(rèn)值是100。既然這個(gè)MPM只運(yùn)行單獨(dú)一個(gè)子進(jìn)程,此MPM當(dāng)然亦基于整個(gè)服務(wù)器監(jiān)視空閑線程數(shù)。mpm_beos和mpmt_os2的工作方式與mpm_netware差不多,mpm_beos的默認(rèn)值是50;mpmt_os2的默認(rèn)值是10。

*ServerLimit表示Apache允許創(chuàng)建的最大進(jìn)程數(shù)。 值得注意的是,Apache在編譯時(shí)內(nèi)部有一個(gè)硬限制ServerLimit 20000(對(duì)于mpm_prefork模塊為ServerLimit 200000)。你不能超越這個(gè)限制。
使用這個(gè)指令時(shí)要特別當(dāng)心。如果將ServerLimit設(shè)置成一個(gè)高出實(shí)際需要許多的值,將會(huì)有過(guò)多的共享內(nèi)存被分配。如果將ServerLimit和MaxClients設(shè)置成超過(guò)系統(tǒng)的處理能力,Apache可能無(wú)法啟動(dòng),或者系統(tǒng)將變得不穩(wěn)定。

*在配置相關(guān)參數(shù)時(shí),請(qǐng)先保證服務(wù)器具備足夠的硬件性能(例如:CPU、內(nèi)存等)。 如果發(fā)現(xiàn)自啟動(dòng)后,隨著服務(wù)器的運(yùn)行時(shí)間增加,服務(wù)器的內(nèi)存占用也隨之增加,可能是程序中出現(xiàn)內(nèi)存泄露,請(qǐng)向下調(diào)整參數(shù)MaxRequestsPerChild的值以降低內(nèi)存泄露帶來(lái)的影響。


上一篇:Nginx solution

下一篇:Tomcat solution