Tomcat7優化配置


導讀 Tomcat在使用的過程中會遇到很多報錯,有些是程序的報錯,但還有一部分是tomcat本身的報錯,我們可以通過優化tomcat的初始配置來提高tomcat的性能。Tomcat的優化主要體現在兩方面:內存、並發連接數。

1、內存優化:

優化內存,主要是在bin/catalina.bat或bin/catalina.sh 配置文件中進行。linux上,在catalina.sh中添加:

JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256m -XX:PermSize=128M -XX:MaxPermSize=256M"

其中:

• -server:啟用jdk的server版本。
• -Xms:虛擬機初始化時的最小堆內存。
• -Xmx:虛擬機可使用的最大堆內存。 #-Xms與-Xmx設成一樣的值,避免JVM因為頻繁的GC導致性能大起大落
• -XX:PermSize:設置非堆內存初始值,默認是物理內存的1/64。
• -XX:MaxNewSize:新生代占整個堆內存的最大值。
• -XX:MaxPermSize:Perm(俗稱方法區)占整個堆內存的最大值,也稱內存最大永久保留區域。

1)錯誤提示:java.lang.OutOfMemoryError:Java heap space

Tomcat默認可以使用的內存為128MB,在較大型的應用項目中,這點內存是不夠的,有可能導致系統無法運行。常見的問題是報Tomcat內存溢出錯誤,Outof Memory(系統內存不足)的異常,從而導致客戶端顯示500錯誤,一般調整Tomcat的-Xms和-Xmx即可解決問題,通常將-Xms和-Xmx設置成一樣,堆的最大值設置為物理可用內存的最大值的80%。

set JAVA_OPTS=-Xms512m-Xmx512m

2)錯誤提示:java.lang.OutOfMemoryError: PermGenspace

PermGenspace的全稱是Permanent Generationspace,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGenspace中,它和存放類實例(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGenspace進行清理,所以如果你的應用中有很CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web服務器對JSP進行precompile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那么就會產生此錯誤信息了。解決方法:

setJAVA_OPTS=-XX:PermSize=128M

3)在使用-Xms和-Xmx調整tomcat的堆大小時,還需要考慮垃圾回收機制。如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過3-5 秒。如果垃圾收集成為瓶頸,那么需要指定代的大小,檢查垃圾收集的詳細輸出,研究垃圾收集參數對性能的影響。一般說來,你應該使用物理內存的 80% 作為堆大小。當增加處理器時,記得增加內存,因為分配可以並行進行,而垃圾收集不是並行的。

2、連接數優化:

#優化連接數,主要是在conf/server.xml配置文件中進行修改。

2.1、優化線程數

找到Connectorport="8080" protocol="HTTP/1.1",增加maxThreads和acceptCount屬性(使acceptCount大於等於maxThreads),如下:

<Connectorport="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />

其中:

• maxThreads:tomcat可用於請求處理的最大線程數,默認是200
• minSpareThreads:tomcat初始線程數,即最小空閑線程數
• maxSpareThreads:tomcat最大空閑線程數,超過的會被關閉
• acceptCount:當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理.默認100
2.2、使用線程池

在server.xml中增加executor節點,然后配置connector的executor屬性,如下:

<Executorname="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
<Connectorport="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>

其中:

• namePrefix:線程池中線程的命名前綴
• maxThreads:線程池的最大線程數
• minSpareThreads:線程池的最小空閑線程數
• maxIdleTime:超過最小空閑線程數時,多的線程會等待這個時間長度,然后關閉
• threadPriority:線程優先級

注:當tomcat並發用戶量大的時候,單個jvm進程確實可能打開過多的文件句柄,這時會報java.net.SocketException:Too many open files錯誤。可使用下面步驟檢查:

• ps -ef |grep tomcat 查看tomcat的進程ID,記錄ID號,假設進程ID為10001
• lsof -p 10001|wc -l 查看當前進程id為10001的 文件操作數
• 使用命令:ulimit -a 查看每個用戶允許打開的最大文件數
3、Tomcat Connector三種運行模式(BIO, NIO, APR)
3.1、三種模式比較:

1)BIO:一個線程處理一個請求。缺點:並發量高時,線程數較多,浪費資源。Tomcat7或以下在Linux系統中默認使用這種方式。

2)NIO:利用Java的異步IO處理,可以通過少量的線程處理大量的請求。Tomcat8在Linux系統中默認使用這種方式。Tomcat7必須修改Connector配置來啟動(conf/server.xml配置文件):

<Connectorport="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443"/>

3)APR(Apache Portable Runtime):從操作系統層面解決io阻塞問題。Linux如果安裝了apr和native,Tomcat直接啟動就支持apr。

3.2、apr模式

安裝apr以及tomcat-native

yum -y install apr apr-devel

進入tomcat/bin目錄,比如:

cd /opt/local/tomcat/bin/
tar xzfv tomcat-native.tar.gz
cd tomcat-native-1.1.32-src/jni/native
./configure --with-apr=/usr/bin/apr-1-config
make && make install

#注意最新版本的tomcat自帶tomcat-native.war.gz,不過其版本相對於yum安裝的apr過高,configure的時候會報錯。

解決:yum remove apr apr-devel –y,卸載yum安裝的apr和apr-devel,下載最新版本的apr源碼包,編譯安裝;或者下載低版本的tomcat-native編譯安裝

安裝成功后還需要對tomcat設置環境變量,方法是在catalina.sh文件中增加1行:

CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"

#apr下載地址:http://apr.apache.org/download.cgi

#tomcat-native下載地址:http://tomcat.apache.org/download-native.cgi

修改8080端對應的conf/server.xml

protocol="org.apache.coyote.http11.Http11AprProtocol"

<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
enableLookups="false"
redirectPort="8443"
URIEncoding="UTF-8" />

PS:啟動以后查看日志 顯示如下表示開啟 apr 模式

Sep 19, 2016 3:46:21 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-apr-8081"]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM