1. 程式人生 > >Tomcat開啟APR執行模式,優化併發效能

Tomcat開啟APR執行模式,優化併發效能

Tomcat支援三種接收請求的處理方式:BIO、NIO、APR 
1>、BIO模式:阻塞式I/O操作,表示Tomcat使用的是傳統Java I/O操作(即java.io包及其子包)。Tomcat7以下版本預設情況下是以bio模式執行的,由於每個請求都要建立一個執行緒來處理,執行緒開銷較大,不能處理高併發的場景,在三種模式中效能也最低。啟動tomcat看到如下日誌,表示使用的是BIO模式: 
BIO模式 
2>、NIO模式:是Java SE 1.4及後續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。是一個基於緩衝區、並能提供非阻塞I/O操作的Java API,它擁有比傳統I/O操作(bio)更好的併發執行效能。要讓Tomcat以nio模式來執行比較簡單,只需要在Tomcat安裝目錄/conf/server.xml檔案中將如下配置:

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
  • 1
  • 2
  • 3

修改成:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
  • 1
  • 2
  • 3

注意:Tomcat8以上版本,預設使用的就是NIO模式,不需要額外修改 
NIO模式 
3>、apr模式:簡單理解,就是從作業系統級別解決非同步IO問題,大幅度的提高伺服器的處理和響應效能, 也是Tomcat執行高併發應用的首選模式。 
啟用這種模式稍微麻煩一些,需要安裝一些依賴庫,下面以在CentOS7 mini版環境下Tomcat-8.0.35為例,介紹安裝步聚:

APR 1.2+ development headers (libapr1-dev package)
OpenSSL 0.9.7+ development headers (libssl-dev package)
JNI headers from Java compatible JDK 1.4+
GNU development environment (gcc, make)
  • 1
  • 2
  • 3
  • 4
  • 5

啟用apr模式步聚

1、安裝依賴庫

因為apr模式本質是使用JNI技術呼叫作業系統IO介面,需要用到相關API的標頭檔案

yum install apr-devel
yum install openssl-devel
yum install
gcc yum install make
  • 1
  • 2
  • 3
  • 4

注意:openssl庫要求在0.9.7以上版本,APR要求在1.2以上版本,用rpm -qa | grep openssl檢查本機安裝的依賴庫版本是否大於或等於apr要求的版本。

2、安裝apr動態庫

進入tomcat的bin目錄,解壓tomcat-native.tar.gz檔案,並進入tomcat-native-1.2.7-src/native目錄,執行./configure && make && make install 命令,動態庫預設安裝在/usr/local/apr/lib目錄下,如下圖所示: 
安裝成功

3、配置APR本地庫到系統共享庫搜尋路徑中

方式1:

設定LD_LIBRARY_PATH和LD_RUN_PATH環境變數,指向/usr/local/apr/lib目錄,可配置到$HOME/.profile檔案中

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
export LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib
  • 1
  • 2

方式2:

拷貝/usr/local/apr/lib目錄下所有動態庫到/usr/lib或/lib系統共享庫搜尋目錄下即可。

copy /usr/local/apr/lib/libtcnative* /usr/lib/
  • 1

方式3:(推薦)

編輯$TOMCAT_HOME/bin/catalina.sh檔案,在虛擬機器啟動引數JAVA_OPTS中新增java.library.path引數,指定apr庫的路徑

JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"
  • 1

Tomcat8以下版本,需要指定執行模式,將protocol從HTTP/1.1改成org.apache.coyote.http11.Http11AprProtocol

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />
  • 1
  • 2
  • 3

執行Tomcat後,看到如下日誌表示開啟apr模式成功: 
APR模式

如果沒有配置SSL相關引數,並且開啟了SSL,啟動時會發生org.apache.tomcat.jni.Error: 70023: This function has not been implemented on this platform異常: 
未配置ssl異常
如果不想啟用SSL,將server.xml中apr模式下ssl關閉即可:

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  • 1

將SSLEngine的值從on改成off即可:

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
  • 1
Tomcat 6.x版本從6.0.32開始就預設支援apr。
Tomcat 7.x版本從7.0.30開始就預設支援apr。
因此,如果讀者使用的Tomcat版本比較陳舊的話,強烈建議升級到最新的穩定版本。
  • 1
  • 2
  • 3
  • 4

---------------------

@Bean
    public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
        TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
        if (true) {
            tomcatFactory.setProtocol("org.apache.coyote.http11.Http11AprProtocol");
            tomcatFactory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                @Override
                public void customize(Connector connector) {
                    Http11AprProtocol handler = (Http11AprProtocol)connector.getProtocolHandler();
                    handler.setXXX();//對tomcat進行定製
                }
            });
        }
        return tomcatFactory;
    }

---------------------------------------------

需要注意:開啟了apr之後,jvm用到的native記憶體會增大,因此要適當調大Metaspace空間,新增JVM選項:-XX:MetaspaceSize=128m

--------------------------------------------

手動安裝apr的依賴庫:

tar zxvf apr-1.4.5.tar  
cd apr-1.4.5  
./configure --prefix=/usr/local/apr  
make  
make install  

tar -zxvf apr-iconv-1.2.1.tar.gz  
cd apr-iconv-1.2.1  
./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr  
make  
make install

yum install expat-devel

tar zxvf apr-util-1.3.12.tar.gz  
cd apr-util-1.3.12  
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv  
make  
make install 

安裝openssl 1.0.2
./config  --prefix=/usr/local/openssl
修改Makefile:
vi Makefile
將原來的:CFLAG=     -DOPENSSL_THREADS
修改為:  CFLAG= -fPIC -DOPENSSL_THREADS
也就是新增-fPIC
執行執行:
make && make install

tar -zxvf tomcat-native.tar.gz
cd tomcat-native-1.2.12-src
cd native
./configure --with-apr=/usr/local/apr --with-ssl=/usr/local/openssl 
make
make install