乐趣区

关于tomcat:使用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 大家应该很好了解,它也是 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 的博客

欢送关注我的公众号:「程序那些事」最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

退出移动版