使用Tomcat Native提升Tomcat IO效率

简介: 使用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
相关文章
|
Linux 应用服务中间件 Apache
The APR based Apache Tomcat Native library which allows optimal performance in production 问题的解决
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:XXXX 出现原因分析: Tomcat建议使用apache的apr,来更好的运
2167 0
|
Java Unix 应用服务中间件
|
安全 应用服务中间件 Java
为tomcat 安装 native 和配置apr
yum install -y apr-devel openssl-devel gcc 安装native cd /lxyy/tomcat7/bin tar zxvf tomcat-native.
1158 0
|
Java 应用服务中间件 Apache
The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path
十二月 14, 2012 7:57:03 下午 org.apache.catalina.core.AprLifecycleListener init信息: The APR based Apache Tomcat Native library which allows optimal performa...
1651 0
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
5月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
3月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
4月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
49 2
|
4月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。