写点什么

使用 Tomcat Native 提升 Tomcat IO 效率

发布于: 2020 年 12 月 11 日
使用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/libexport LD_LIBRARY_PATH
复制代码


最后添加 APR 的连接:


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


运行即可。


从日志中,我们会发现下面的内容:


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


说明 APR 安装完毕并且已经在被使用了。


本文作者:flydean 程序那些事

本文链接:http://www.flydean.com/tomcat-native-startup/

本文来源:flydean 的博客

欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!


发布于: 2020 年 12 月 11 日阅读数: 29
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
使用Tomcat Native提升Tomcat IO效率