Apache Http Server:
影響性能的最核心特性:MPM(Multi-Processing Modules,多道處理模塊):
進(jìn)入httpd-2.0.45目錄,運(yùn)行以下代碼:
$ ./configure --help|grep mpm
顯示如下:
--with-mpm=MPM Choose the process model for Apache to use. MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool}
上述操作用來(lái)選擇要使用的進(jìn)程模型,即哪種MPM模塊。prefork就是Unix平臺(tái)上缺省的MPM。查看Httpd.conf
<IfModule mpm_prefork_module> # StartServers 5 # MinSpareServers 5 # MaxSpareServers 10 # MaxClients 150 # MaxRequestsPerChild 0 ServerLimit 2048 //可配置的進(jìn)程數(shù)的上限 ThreadLimit 64 //設(shè)置在每個(gè)子進(jìn)程可配置的線程數(shù)上限 StartServers 8 //初始化進(jìn)程數(shù) MaxClients 2048//設(shè)定的是Apache可以同時(shí)處理的請(qǐng)求,是最重要的參數(shù) MinSpareThreads 64//最小空閑進(jìn)程 MaxSpareThreads 256 //最大空閑進(jìn)程 ThreadsPerChild 64 MaxRequestsPerChild 0 //(默認(rèn)10000)每個(gè)子進(jìn)程可處理的請(qǐng)求書(shū),每個(gè)子進(jìn)程在處理了“MaxRequestsPerChild”個(gè)請(qǐng)求后將自動(dòng)銷(xiāo)毀。0意味著無(wú)限,即子進(jìn)程永不銷(xiāo)毀。 </IfModule>
StartServers
, MinSpareServers
, MaxSpareServers
, MaxClients
指令用于調(diào)節(jié)父進(jìn)程如何產(chǎn)生子進(jìn)程.
MaxClients:設(shè)定的是Apache可以同時(shí)處理的請(qǐng)求數(shù),默認(rèn)值是256。若要提高最大請(qǐng)求數(shù),需要添加ServerLimit數(shù),ServerLimit最大支持20000,注意:ServerLimit需要放置于MaxClient前面.一般設(shè)置小于MaxClients。
MaxRequestsPerChild
指令控制服務(wù)器殺死舊進(jìn)程產(chǎn)生新進(jìn)程的頻率。
MaxSpareServers
指令設(shè)置空閑子進(jìn)程的最大數(shù)量。所謂空閑子進(jìn)程是指沒(méi)有正在處理請(qǐng)求的子進(jìn)程。如果當(dāng)前有超過(guò)MaxSpareServers
數(shù)量的空閑子進(jìn)程,那么父進(jìn)程將殺死多余的子進(jìn)程。
MinSpareServers
指令設(shè)置空閑子進(jìn)程的最小數(shù)量。所謂空閑子進(jìn)程是指沒(méi)有正在處理請(qǐng)求的子進(jìn)程。如果當(dāng)前空閑子進(jìn)程數(shù)少于MinSpareServers
,那么Apache將以最大每秒一個(gè)的速度產(chǎn)生新的子進(jìn)程。
Tomcat性能優(yōu)化:
1 JVM內(nèi)存調(diào)整
當(dāng)應(yīng)用程序需要的內(nèi)存超出堆的最大值時(shí)虛擬機(jī)就會(huì)提示內(nèi)存溢出,并且導(dǎo)致應(yīng)用服務(wù)崩潰。因此一般建議堆的最大值設(shè)置為可用內(nèi)存的最大值的80%。
-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。這兩個(gè)值的大小一般根據(jù)需要進(jìn)行設(shè)置。
說(shuō)明:如果-Xmx不指定或者指定偏小,應(yīng)用可能會(huì)導(dǎo)致java.lang.OutOfMemory錯(cuò)誤,此錯(cuò)誤來(lái)自JVM不是Throwable的,無(wú)法用try...catch捕捉。
PermSize和MaxPermSize指明虛擬機(jī)為java永久生成對(duì)象(Permanate generation)如,class對(duì)象、方法對(duì)象這些可反射(reflective)對(duì)象分配內(nèi)存限制,這些內(nèi)存不包括在Heap(堆內(nèi)存)區(qū)之中。
-XX:PermSize=512MB 最小尺寸,初始分配
-XX:MaxPermSize=512MB 最大允許分配尺寸,按需分配
在Tomcat安裝目錄下的bin/catalina.sh文件下添加
JAVA_OPTS="-Xmx2048M -Xms1024M -XX:PermSize=512M -XX:MaxPermSize=512M"; 設(shè)置了初始堆大小為2014M,最大值為2048M。永久保存區(qū)域初始大小512M,最大允許分配尺寸512內(nèi)存。
2 禁用DNS查詢(xún):
Set to true if you want calls to request.getRemoteHost() to perform DNS lookups in order to return the actual host name of the remote client. Set to false to skip the DNS lookup and return the IP address in String form instead (thereby improving performance). By default, DNS lookups are enabled.
Server.xml中的Connector 節(jié)點(diǎn)中進(jìn)行設(shè)置:修改server.xml文件中的enableLookups參數(shù)值為false
3 調(diào)整線程數(shù)
Server.xml中的Connector 節(jié)點(diǎn)中進(jìn)行設(shè)置如下:
minProcessors 服務(wù)器啟動(dòng)時(shí)創(chuàng)建的處理請(qǐng)求的線程數(shù)
maxProcessors 最大可以創(chuàng)建的處理請(qǐng)求的線程數(shù)
maxThreads:
這個(gè)值表示Tomcat可創(chuàng)建的最大的線程數(shù)。 默認(rèn)為200;If not specified, this attribute is set to 200。
acceptCount :指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí),可以放到處理隊(duì)列中的請(qǐng)求數(shù),超過(guò)這個(gè)數(shù)的請(qǐng)求將不予處理。The default value is 100
connnectionTimeout 網(wǎng)絡(luò)連接超時(shí),單位:毫秒。設(shè)置為0表示永不超時(shí),這樣設(shè)置有隱患的。通常可設(shè)置為30000毫秒。
minSpareThreads Tomcat初始化時(shí)創(chuàng)建的線程數(shù)。 If not specified, the default of 10
is used.
maxSpareThreads 一旦創(chuàng)建的線程超過(guò)這個(gè)值,Tomcat就會(huì)關(guān)閉不再需要的socket線程。 (tomcat5以后已刪除)
<Connector port="80" maxThreads="150" minSpareThreads="25" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/>
總結(jié):
首先要爭(zhēng)取使得操作系統(tǒng)以及網(wǎng)絡(luò)資源達(dá)到最優(yōu),并且最好使用高版本的JDK。對(duì)于有大量靜態(tài)頁(yè)面的系統(tǒng),采用Apache集成Tomcat的方式,把靜態(tài)頁(yè)面交由Apache處理,動(dòng)態(tài)部分交由Tomcat處理,能極大解放Tomcat的處理能力。通過(guò)Apache和Tomcat負(fù)載提供穩(wěn)定高并發(fā)的性能需求。同時(shí)需要對(duì)Tomcat自身進(jìn)行優(yōu)化,包括增大內(nèi)存、調(diào)節(jié)并發(fā)線程數(shù)等。