Tomcat的三种运行模式

Easter79
• 阅读 781

Tomcat支持三种接收请求的处理方式: BIONIOAPR

BIO模式: 阻塞式I/O操作,表示Tomcat使用的是传统Java I/O操作(即:java.io包及其子包);Tomcat 7以下版本默认情况下是以BIO模式运行的,由于每个请求的都要创建一个线程来处理,因此 线程的开销较大,不能处理高兵的场景,在三种模式中性能也最低效;启动Tomcat看日志如下表示为BIO模式:

NIO模式: 是Java SE 1.4以后续版本提供的一种新的I/O操作方式(即:java.nio包及其子包);是一个基于 缓存区、并提供非阻塞I/O操作的Java API,它拥有比传统的I/O操作(BIO)更好的并发运行性能;

APR模式: 简单理解就是,从操作系统级别解决异步IO问题,大幅度的提高服务器的处理合相应性能,也是Tomcat运行高并发应用的首选模式;

官方对三种运行模式的区别说明如下:

参数

Java Blocking Connector (BIO模式)

Java Nio Blocking Connector(NIO模式)

APR/native Connector(APR模式)

classname

AjpProtocol

AjpNioProtocol

AjpAprProtocol

Tomcat Version

3.x onwards

7.x onwards

5.5.x onwards

Support Polling

NO

YES

YES

Polling Size

N/A

maxConnections

maxConnections

Read Request Headers

Blocking

Sim Blocking

Blocking

Read Request Body

Blocking

Sim Blocking

Blocking

Write Response

Blocking

Sim Blocking

Blocking

Wait for next Request

Blocking

Non Blocking

Non Blocking

Max Connections

maxConnections

maxConnections

maxConnections

特征

模式

默认运行版本

处理方式

BIO运行模式

Tomcat7或以下版本

一个线程处理一个请求;缺点:并发量高是,线程数较多,浪费资源

NIO运行模式

Tomcat8版本

利用Java的异步IO处理,可通过少量的线程处理大量请求;

APR运行模式

Tomcat7 或 8 在win7或以上系统中默认使用

从操作系统层面解决IO阻塞问题;

**
Tomcat启动时,可以通过 catalina.out启动日志查看使用的是哪种运行模式:**

  1. Starting ProtocolHandler ["http-bio-8080"] ## BIO模式

  2. Starting ProtocolHandler ["http-nio-8080"] ## NIO模式

  3. Starting ProtocolHandler ["http-apr-8080"] ## APR模式

Tomcat BIO模式

自Tomcat 8.5 版本开始,Tomcat就移除了对BIO的支持; BIO即阻塞式I/O,是java提供的最基本的I/O方式。在网络通信(此处主要讨论TCP/IP协议)中,需要通过Socket在客户端与服务端建立双向链接以实现通信,主要步骤如下:

  • (1) 服务端监听某个端口是否有链接请求

  • (2) 客户端想服务端发出链接请求

  • (3) 服务端想客户端返回Accept(接受)消息,此时链接成功

  • (4) 客户端和服务端通过send()、write()等方法与对方通信

  • (5) 关闭链接

Tomcat 7以下版本默认情况下是以BIO模式运行的,由于每个请求的都要创建一个线程来处理,因此 线程的开销较大,不能处理高并发的场景,在三种模式中性能也最低效;启动Tomcat看日志如下表示为BIO模式:

Tomcat的三种运行模式

Tomcat NIO模式

重要提示:使用这些功能需要使用APR或NIO HTTP连接器。传统的java.io HTTP连接器和AJP连接器不支持它们

传统的BIO方式是基于流进行读写的,而且是阻塞的,整体性能比较差; 为了提供I/O性能,JDK自1.4版本引入了NIO模式,它弥补了原来BIO方式的不足,在标准的java代码中提供了 高速、面向块的I/O。 通过定义包含数据的类以及以块的形式处理数据,NIO可以在不编写本地代码的情况下利用底层优化,这是BIO所无法做到的;

NIO模式 是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,它拥有比传统I/O操作(bio)更好的并发运行性能。要让Tomcat以nio模式来运行比较简单,只需要在Tomcat安装目录/conf/server.xml文件中将如下配置:

  1. <Connector port="8080" protocol="HTTP/1.1"

  2. connectionTimeout="20000"

  3. redirectPort="8443" />

修改成:

  1. <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"

  2. connectionTimeout="20000"

  3. redirectPort="8443" />

注意: Tomcat8以上版本,默认使用的就是NIO模式;不需要额外修改

Tomcat的三种运行模式

提示: 更改模式时,如果只修改上述文件内容,则只有 ["http-nio-8180"]被修改为NIO模式,若想上图中2处都修改为 NIO模式则还需要修改如下内容:

  1. <Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />

改为:

  1. <Connector port="8109" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443" />

以下属性是特定于NIO连接器 NIO连接器官方详细说明

Tomcat的三种运行模式

Tomcat NIO2模式

NIO2是JDK7新增的文件及网络I/O特性,它继承自NIO 同时添加了众多特性及功能改进,其中最重要的即是对异步I/O(AIO)的支持;

  • 1 . 通道 在AIO中,通道必须实现接口 java.nio.chanels.AsynchronousChannel(继承自java.nio.channels.Channel) JDK7提供了3个通道实现类: java.nio.channels.AsynchronousFileChannel用于文件I/O, java.nio.channels.AsynchronousServerSocketChannel 和 java.nio.channels.AsynchronousSocketChannel用于网络I/O

  • 2 . 缓冲区 AIO仍通过操作缓冲区完成数据的读写操作,这里不再阐述。

  • 3 . Future 和 CompletionHandler AIO操作存在两种操作方式: Future 和 CompletionHandler ; 我们可以使用其中任何一种来完成I/O操作 首先, AIO使用了java并发包的API,无论接收Socket请求还是读写操作,均可以返回一个java.util.concurrent.Future对象来表示I/O处于等待状态; 通过Future的方法,我们可以检测操作是否完成(isDone)、等待完成并取得操作结果(get)等。 当接收请求(accept)结束时,Future.get返回值为AsynchronousSocketChannel; 读写操作时(read/write),Future.get返回值为读写操作结果。

  • 4 . 异步通道组 AIO新引入了异步通道组(Asynchronous Channel Group)的概念,每个异步通道均属于一个指定的异步通道组,同一个通道组内的通道共享一个线程池; 线程池内的线程接收指令来执行I/O事件并将结果分发到CompletionHandler。 异步通道组包括线程池以及所有通道工作线程共享的资源。通道生命周期受所属通道组影响,当通道组关闭后,通道也随之关闭;

Tomcat APR模式

  • APR模式:简单来说,就是从操作系统级别解决异步IP问题,大幅度的提高服务器的处理和响应性能,也是Tomcat运行高并发应用的首选模式;

  • 启动这种模式需要安装一些依赖库,下面进行详细说明:

基于Apache Portable Runtime(APR)的Tomcat本地库

安装要求:

  • APR 1.2+开发头文件(libapr1-dev包)

  • OpenSSL 0.9.7+开发头文件(libssl-dev包)

  • 来自Java兼容JDK 1.4+的JNI头文件

  • GNU开发环境(gcc,make)

apr的安装

下载apr包地址(http://apache.fayea.com/apr/)

  1. ## 下载解压

  2. wget http://apache.fayea.com/apr/apr-1.6.3.tar.gz

  3. wget http://apache.fayea.com/apr/apr-util-1.6.1.tar.gz

  4. tar fxz apr-1.6.3.tar.gz

  5. tar fxz apr-util-1.6.1.tar.gz

  6. ## 安装

  7. cd apr-1.6.3/

  8. ./configure --prefix=/usr/local/apr

  9. make && make install

  10. cd apr-util-1.6.1/

  11. ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr

  12. make && make install

安装tomcat-native

  1. cd /usr/local/tomcat/bin tar -zxvf tomcat-native.tar.gz

  2. cd tomcat-native-1.1.22-src/jni/native

  3. ./configure --with-apr=/usr/local/apr

  4. make && make install

设置apr环境变量

  1. # vim /etc/profile

  2. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib

  3. # 执行 source /etc/profile 立即生效

修改Tomcat配置文件

修改http协议

  1. <Connector port="8080" protocol="HTTP/1.1"

  2. connectionTimeout="20000"

  3. redirectPort="8443" />

修改成:

  1. <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"

  2. connectionTimeout="20000"

  3. redirectPort="8443" />

修改AJP协议

  1. <Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />

改为:

  1. <Connector port="8109" protocol="org.apache.coyote.http11.Http11AprProtocol" redirectPort="8443" />

总结

对于每种协议,Tomcat都提供了对应的I/O方式的实现,而且Tomcat官方还提供了在每种协议下每种I/O实现方案的差异; HTTP协议下的处理方式如下表:

NIO

NIO2

APR

引用版本

≥6.0

≥8.0

≥5.5

轮询支持

轮询队列大小

maxConnections

maxConnections

maxConnections

读请求头

非阻塞

非阻塞

非阻塞

读请求体

阻塞

阻塞

阻塞

写响应

阻塞

阻塞

阻塞

等待新请求

非阻塞

非阻塞

非阻塞

SSL支持

Java SSL/Open SSL

Java SSL/Open SSL

Open SSL

SSL握手

非阻塞

非阻塞

阻塞

最大链接数

maxConnections

maxConnections

maxConnections

本文分享自微信公众号 - 杰哥的IT之旅(Jake_Internet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
tomcat nio
tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态。1)bio默认的模式,性能非常低下,没有经过任何优化处理和支持.2)nio利用java的异步io护理技术,noblocking
Wesley13 Wesley13
3年前
JAVA中的BIO、NIO和AIO
Java中的IO方式主要分为3种:BIO(同步阻塞)、NIO(同步非阻塞)和AIO(异步非阻塞)。BIO同步阻塞模式。在JDK1.4以前,使用Java建立网络连接时,只能采用BIO方式,在服务器端启动一个ServerSocket,然后使用accept等待客户端请求,对于每一个请求,使用一个线程来进行处理用户请求。线程的大部分时间都在等待请求的
Wesley13 Wesley13
3年前
BIO、NIO、AIO 介绍和适用场景分析
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、同步阻塞的BIO在JDK1.4之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个serverSocket,然后在客户端启动socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否
Wesley13 Wesley13
3年前
Java NIO
简介引入NIO的原因1.因为BIO都是阻塞的IO,为了使Java能支持非阻塞I/O,JDK引入了NIO,可以将NIO理解成是NonblockI/O.(也有书说是newIO)2.BIO编程中,每当有一个新的客户端请求过来时,服务器端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接,在并发量
Wesley13 Wesley13
3年前
BIO和NIO
BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 NIO(事件驱动):同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动
Easter79 Easter79
3年前
Tomcat性能优化总结
层级优化!(JAVA\_OPTS参数和主要元素的优化)Tomcat大致元素架构:serverserviceEngineHostContextTomcat有可以使用三种协议:HTTP,AJP,HTTPStomcat默认采用的BIO模型tomcat的运行模式有3种:bio,nio,apr(额外安装),例如:proto
Stella981 Stella981
3年前
Netty面试题
1.BIO、NIO和AIO的区别?BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处
Easter79 Easter79
3年前
Tomcat 的 3中运行方式
Tomcat是一个小型的轻量级应用服务器,也是JavaEE开发人员最常用的服务器之一。不过,许多开发人员不知道的是,TomcatConnector(Tomcat连接器)有bio、nio、apr三种运行模式,那么这三种运行模式有什么区别呢,我们又如何修改TomcatConnector的运行模式来提高Tomcat的运行性能呢?下面
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k