使用Tomcat Native提升Tomcat IO效率

flydean發表於2020-12-11

簡介

IO有很多種,從最開始的Block IO,到nonblocking IO,再到IO多路複用和非同步IO,一步一步的將IO的效能提升做到極致。

今天我們要介紹一下怎麼使用Tomcat Native來提升Tomcat IO的效率。

Tomcat的連線方式

Tomcat中使用聯結器來處理與外部客戶端的通訊。Connecter主要用來接受外部客戶端的請求,並轉交給處理引擎處理。

在Tomcat中有兩種Connector。一種是 HTTP connector, 一種是AJP connector。

HTTP connector大家應該很好理解,它也是tomcat預設使用的聯結器。

還有一個聯結器叫做AJP,AJP主要是用來和web伺服器進行通訊用的,因為AJP協議的速度要比HTTP的快,所以AJP除了用來和其他webserver進行通訊之外,還可以通過AJP來構建tomcat叢集。

這兩種方式都支援4中協議,分別是BIO,NIO,NIO2和APR。

#以下四種Connector實現都是直接處理來自客戶端Http請求
org.apache.coyote.http11.Http11Protocol : 支援HTTP/1.1 協議的聯結器。

org.apache.coyote.http11.Http11NioProtocol : 支援HTTP/1.1 協議+New IO的聯結器。

org.apache.coyote.http11.Http11Nio2Protocol : 支援HTTP/1.1 協議+New IO2的聯結器。

org.apache.coyote.http11.Http11AprProtocol : 使用APR(Apache portable runtime)技術的聯結器,利用Native


#以下四種實現方法則是與web server打交道
org.apache.coyote.ajp.AjpProtocol:使用AJP協議的聯結器,實現與web server(如Apache httpd)之間的通訊

org.apache.coyote.ajp.AjpNioProtocol:SJP協議+ New IO

org.apache.coyote.ajp.AjpNio2Protocol:SJP協議+ New IO2

org.apache.coyote.ajp.AjpAprProtocol:AJP + APR

講下他們的區別,BIO就是block IO是最最基礎的IO方式, 我們通過這樣來配置:

<Connector  port=”8080”  
protocol=”HTTP/1.1”
  
maxThreads=”150”  
connectionTimeout=”20000”   
redirectPort=”8443” />

Tomcat7以下版本在預設情況下是以bio模式執行的。自Tomcat 8.5 版本開始,Tomcat就移除了對BIO的支援。

New IO是基於java.nio包及其子包的一種IO方式。能提供非阻塞IO方式,比傳統的BIO擁有與更加高效的執行效率。

我們這樣配置New IO:

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

New IO和New IO2有什麼區別呢?

New IO2是tomcat8中引入的IO方式,我們可以這樣配置:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />

apr這種方式就高階了,這個是我們今天要講解的tomcat native的主要作用。

APR和Tomcat Native

apr的全稱是Apache Portable Runtime,它是一個高度可移植的庫,它是Apache HTTP Server 2.x的核心。 APR有許多用途,包括訪問高階IO功能(例如sendfile,epoll和OpenSSL),作業系統級別的功能(生成隨機數,系統狀態等)和本機程式處理(共享記憶體,NT管道和Unix套接字)。

Tomcat可以通過JNI的形式呼叫Apache HTTP伺服器的核心動態連結庫來處理檔案讀取或網路傳輸操作,從而大大地提高Tomcat對靜態檔案的處理效能。

通過使用APR我們可以獲得如下的特性:

  1. Non-blocking I/O和請求連線保持。
  2. 支援OpenSSL和TLS/SSL。

Tomcat Native是一個庫,通過這個庫,Tomcat可以使用APR。

所以使用Tomcat Native的前提是需要安裝好APR library,OpenSSL和JDK。

我們可以通過下面的方式來安裝apr和openssl:

debian based linux系統:

apt-get install libapr1.0-dev libssl-dev

rpm based Linux 系統:

yum install apr-devel openssl-devel

在windows下面,tcnative是以一個dll的形式來提供的,我們直接下載使用就可以了。

但是在linux下面,因為平臺不同,所以在linux下面tcnative是需要自行編譯的。

一般來說我們可以在 bin/tomcat-native.tar.gz 找到tcnative的原始碼包。將其解壓。

先執行configure命令:

./configure --with-apr=/usr/bin/apr-1-config \
            --with-java-home=/home/jfclere/JAVA/jdk1.7.0_80/ \
            --with-ssl=yes \
            --prefix=$CATALINA_HOME

再進行make操作:

make && make install

生成的lib檔案將會被放入$CATALINA_HOME/lib中。

在tomcat中使用APR

安裝好tcnative之後,我們就可以在tomcat中使用APR了。

先檢查一下conf/server.xml中是否有下面的配置:

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

然後我們需要修改 $CATALINA_HOME/bin/setenv.sh 將tc-native 的lib檔案新增到LD_LIBRARY_PATH中。

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib
export LD_LIBRARY_PATH

最後新增APR的連線:

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

執行即可。

從日誌中,我們會發現下面的內容:

org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.x.y.
org.apache.catalina.core.AprLifecycleListener init
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
org.apache.coyote.http11.Http11AprProtocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080

說明APR安裝完畢並且已經在被使用了。

本文作者:flydean程式那些事

本文連結:http://www.flydean.com/tomcat-native-startup/

本文來源:flydean的部落格

歡迎關注我的公眾號:「程式那些事」最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

相關文章