Tomcat優化總結

1、內存溢出問題html

Linux設置啓動腳本web

[root@LAMP ~]# vi /usr/local/tomcat/bin/catalina.shspring

#___________________________________start數據庫

    225 # Bugzilla 37848: only output this if we have a TTYapache

    226 if [ $have_tty -eq 1 ]; thentomcat

    227   JAVA_OPTS="$JAVA_OPTS  -server -Xms512m -Xmx4096m   -XX:MaxNewSize=256m -XX:MaxPermSize=256m"服務器

    228   echo "Using CATALINA_BASE:   $CATALINA_BASE"網絡

#____________________________________end多線程

解釋app

-Xms:初始值

-Xmx:最大值

-Xmn:最小值

通常「-Xms」是「-Xmx」的1/4,「-XXermSize」是「-XX:MaxPermSize」的1/2。

所以通常建議堆的最大值設置爲可用內存的最大值的80%。

緣由:

發現不少人把問題歸因於:spring,hibernate,tomcat,由於他們動態產生類,致使JVM中的permanent heap溢出。

而後解決方法衆說紛紜,有人說升級 tomcat版本到最新甚至乾脆不用tomcat,還有人懷疑spring的問題,在spring論壇上討論很激烈,由於spring在AOP時使用CBLIB會動態產生不少類。

但問題是爲何這些王牌的開源會出現同一個問題呢,那麼是否是更基礎的緣由呢?

Tomcat在Q&A很隱晦的回答了這一點,咱們知道這個問題,但這個問題是由一個更基礎的問題產生,因而有人對更基礎的JVM作了檢查,發現了問題的關鍵。

原來SUN 的JVM把內存分了不一樣的區,其中一個就是permenter區用來存放用得很是多的類和類描述,原本SUN設計的時候認爲這個區域在JVM啓動的時候就固定了,但他沒有想到如今動態會用得這麼普遍。

並且這個區域有特殊的垃圾收回機制,如今的問題是動態加載類到這個區域後,gc根本沒辦法回收!

2、鏈接池優化

1,配置文件解析

接受關閉Tomcat命令的的端口:

[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml

<Server port="8005"shutdown="SHUTDOWN">

定義數據庫鏈接池:

[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml

<Resource name="UserDatabase" auth="Container"

            type="org.apache.catalina.UserDatabase"

             description="User database that can be updated and saved"

             factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

             pathname="conf/tomcat-users.xml" />

</GlobalNamingResources>

定義配置共享線程池,用於客戶端和服務器端的鏈接控制:

[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml

#___________________________________start

<Executor name="tomcatThreadPool"namePrefix="catalina-exec-"

       minSpareThreads="100"

       maxSpareThreads="500"

       maxThreads="3000"

       acceptCount="100"

       maxIdleTime="60000"

/>

#__________________________________end

配置Engine,注意defaultHost=""中,必需要與host中的一個相同,即指定默認網站。

[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml +99

<Engine name="Catalina" defaultHost="www.00peixun.com">

使用上面配置的數據庫鏈接池

[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml +99

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/>

使用上面配置的共享線程池來控制客戶端的鏈接,優化調度服務器資源。

[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml

#___________________________________start

<Connector port="8080"protocol="HTTP/1.1"

              connectionTimeout="30000"

              redirectPort="8443"

              executor="tomcatThreadPool"

              enableLookups="false"

              useBodyEncodingForURI="true"

/>

#________________________________________end

配置虛擬主機

[root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml

#________________________________________start

<Host name="www.00peixun.com"

           unpackWARs="true" autoDeploy="true"

           xmlValidation="false" xmlNamespaceAware="false">

            <Context path=""docBase="/home/www/game" debug="0"reloadable="false"

    crossContext="true"/>

       <!-- SingleSignOn valve, share authentication between web applications

            Documentation at: /docs/config/valve.html -->

       <!--

       <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

       -->

       <!-- Access log processes all example.

            Documentation at: /docs/config/valve.html -->

       <!--

       <Valve className="org.apache.catalina.valves.AccessLogValve"directory="logs"

              prefix="localhost_access_log." suffix=".txt"pattern="common" resolveHosts="false"/>

       -->

</Host>

#_______________________________________end

一、minSpareThreads="100":設置Tomcat初始化時建立的socket 線程數,而且在一些線程被使用後,會不斷地建立新的線程,以至使空閒線程至少保持minSpareThreads所設置的數目,默認值爲4

二、maxSpareThreads="500":設置Tomcat鏈接器最大空閒socket 線程數,當一些鏈接斷開後,會不斷的釋放出線程,當空與線程超過maxSpareThreads所設置的數目時,會主動關閉超出的線程以節省資源默認值爲50

三、maxThreads="3000":設定處理客戶請求的線程的最大數目,這個值也決定了服務器能夠同時響應客戶請求的最大數目,這個值不會額外影響性能,所以能夠適當加大,但讓太大會碰到流量攻擊哦,默認值爲200.

四、acceptCount="100":設定在監聽端口隊列中的最大客戶請求數,默認值爲10,若是隊列已滿客戶請求將被拒絕。可用線程所有用完時,其餘的鏈接所有放入隊列,隊列裏的最大數目就是acceptCount設定的,超出這個數目將拒絕鏈接

五、connectionTimeout:定義創建客戶鏈接超時的時間,默認這爲20000毫秒。若是爲0,表示不限制創建客戶鏈接的時間。

六、maxIdleTime="60000":超過最小活躍線程數量的線程,若是空閒時間超過這個設置後,會被關閉。默認是1分鐘

七、useBodyEncodingForURI:表示是否用request.setCharacterEncoding參數對URL提交的數據和表單中GET方式提交的數據進行從新編碼,默認值是false.

八、redirectPort:指定轉發端口。

九、connectionTimeout:定義創建客戶鏈接超時的時間,默認這爲20000毫秒。若是爲-1,表示不限制創建客戶鏈接的時間。

十、useBodyEncodingForURI:表示是否用request.setCharacterEncoding參數對URL提交的數據和表單中GET方式提交的數據進行從新編碼,默認值是false.

注意

Tomcat4中能夠經過修改minProcessors和maxProcessors的值來控制....

(minProcessors:服務器啓動時建立的最小處理線程數,即便沒有任何HTTP請求,Tomcat也要保持至少這麼多線程以等待處理;

maxProcessors:同時最大的處理線程數,若是系統中已經有這個數字的線程,那麼更多的鏈接請求將進入排隊。)

Tomcat5中能夠經過修改minSpareThreads和minSpareThreads的值來控制

APR庫使用

Tomcat中使用APR庫,其實就是在Tomcat中使用JNI的方式來讀取文件以及進行網絡傳輸。

能夠大大提高Tomcat對靜態文件的處理性能,同時若是你使用了HTTPS方式傳輸的話,也能夠提高SSL的處理性能。

通常在Windows下,能夠直接下載編譯好的二進制版本的dll庫文件來使Tomcat啓用APR,通常建議拷貝庫文件tcnative- 1.dll到Tomcat的bin目錄下。

而在Linux下,能夠直接解壓和安裝bin目錄下的tomcat_native.tar.gz文件,編譯以前要確保apr庫已經安裝。

怎麼才能判斷Tomcat是否已經啓用了APR庫呢?方法是經過看Tomcat的啓動日誌:

若是沒有啓用APR,則啓動日誌通常有這麼一條:

org.apache.coyote.http11.Http11Protocol start

若是啓用了APR,則這條日誌就會變成:

org.apache.coyote.http11.Http11AprProtocol start

tcnative-1.dll 下載地址:http://tomcat.heanet.ie/native/

(全文完)

相關文章
相關標籤/搜索