tomcat性能優(yōu)化

優(yōu)化內(nèi)存

/bin/catalina.sh添加JAVA_OPTS參數(shù)
jdk1.7

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms512m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=1024M -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:+DisableExplicitGC"

jdk1.8

1.8版本中已經(jīng)沒有PermSize、MaxPermSize

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms512m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=1024M -XX:+DisableExplicitGC"

參數(shù)說明:
-Djava.awt.headless:沒有設(shè)備、鍵盤或鼠標(biāo)的模式。有關(guān)介紹:What is Headless mode in Java
-Dfile.encoding: 設(shè)置字符集
-server:jvm的server工作模式,對應(yīng)的有client工作模式。使用“java -version”可以查看當(dāng)前工作模式
-Xms512m:初始Heap大小,使用的最小內(nèi)存
-Xmx1024m:Java heap最大值,使用的最大內(nèi)存
-XX:NewSize=512m:表示新生代初始內(nèi)存的大小,應(yīng)該小于 -Xms的值
-XX:MaxNewSize=1024M:表示新生代可被分配的內(nèi)存的最大上限,應(yīng)該小于 -Xmx的值
-XX:PermSize=1024m:設(shè)定內(nèi)存的永久保存區(qū)域(注:jdk1.8 was removed)
-XX:MaxPermSize=1024m:設(shè)定最大內(nèi)存的永久保存區(qū)域(注:jdk1.8 was removed)
-XX:+DisableExplicitGC:自動(dòng)將System.gc()調(diào)用轉(zhuǎn)換成一個(gè)空操作,即應(yīng)用中調(diào)用System.gc()會(huì)變成一個(gè)空操作

優(yōu)化連接數(shù)

優(yōu)化線程數(shù)

在conf/server.xml找到Connectorport="8080" protocol="HTTP/1.1",增加maxThreads和acceptCount屬性(使acceptCount大于等于maxThreads),如下:

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

參數(shù)說明:
maxThreads:tomcat可用于請求處理的最大線程數(shù),默認(rèn)是200
minSpareThreads:tomcat初始線程數(shù),即最小空閑線程數(shù)
maxSpareThreads:tomcat最大空閑線程數(shù),超過的會(huì)被關(guān)閉
acceptCount:當(dāng)所有可以使用的處理請求的線程數(shù)都被使用時(shí),可以放到處理隊(duì)列中的請求數(shù),超過這個(gè)數(shù)的請求將不予處理.默認(rèn)100

使用線程池

在conf/server.xml中增加executor節(jié)點(diǎn),然后配置connector的executor屬性,如下:

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

參數(shù)說明:
namePrefix:線程池中線程的命名前綴
maxThreads:線程池的最大線程數(shù)
minSpareThreads:線程池的最小空閑線程數(shù)
maxIdleTime:超過最小空閑線程數(shù)時(shí),多的線程會(huì)等待這個(gè)時(shí)間長度,然后關(guān)閉
threadPriority:線程優(yōu)先級

優(yōu)化運(yùn)行模式(connector for protocol)

  1. BIO

    一個(gè)線程處理一個(gè)請求。缺點(diǎn):并發(fā)量高時(shí),線程數(shù)較多,浪費(fèi)資源。Tomcat7或以下在Linux系統(tǒng)中默認(rèn)使用這種方式。

配置conf/server.xml

```
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" enableLookups="false" redirectPort="8443" URIEncoding="UTF-8" />```
  1. NIO

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

    配置conf/server.xml

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

    
3. apr

    apr=Apache Portable Runtime,從操作系統(tǒng)層面解決io阻塞問題。
    
    - 安裝apr
    
        下載apr: http://www.linuxfromscratch.org/blfs/view/svn/general/apr.html
        
        ```shell
            tar xvf apr-1.5.2.tar.bz2
            cd apr-1.5.2
            ./configure --prefix=/usr --disable-static --with-installbuilddir=/usr/share/apr-1/build &&
            make
            make install
        ```
        > --disable-static: This switch prevents installation of static versions of the libraries
        
    - 安裝tomcat-native

        進(jìn)入tomcat/bin目錄,比如:
    
        ```
        cd /home/vhs/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
        ```
        
    - 配置server.xml
        
        - 對tomcat設(shè)置環(huán)境變量,方法是在bin/catalina.sh文件中增加1行
        
            ` CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib" `
        - 修改conf/server.xml
        
          ```
          <Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" enableLookups="false" redirectPort="8443" URIEncoding="UTF-8" />
        ```

        > tomcat啟動(dòng)遇到錯(cuò)誤:failed to initialize the sslengine。
        > 解決辦法:
        > 修改server.xml中Listener的className=“org.apache.catalina.core.AprLifecycleListener” 的參數(shù)SSLEngine為off。如下:`<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />`
        
        
## 參考
   - [Tomcat7優(yōu)化配置](http://www.linuxprobe.com/tomcat7-configure-optimize.html)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容