使用 Tomcat Native 提升 Tomcat IO 效率

简介

IO 有很多种,从最开始的 Block IO,到nonblocking IO,再到 IO 多路复用和异步 IO,一步一步的将 IO 的性能提升做到极致。

今天我们要介绍一下怎么使用 Tomcat Native 来提升 Tomcat IO 的效率。

Tomcat的连接方式

Tomcat中使用连接器来处理与外部客户端的通信。Connecter主要用来接受外部客户端的请求,并转交给处理引擎处理。

在Tomcat中有两种Connector。一种是 HTTP connector, 一种是AJP connector。

HTTP connector 大家应该很好理解,它也是 tomca t默认使用的连接器。

还有一个连接器叫做 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:AJP协议 +  New IO
org.apache.coyote.ajp.AjpNio2Protocol:AJP协议 +  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” />

Tomcat 7 以下版本在默认情况下是以 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 安装完毕并且已经在被使用了。