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