阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式

167次阅读
没有评论

共计 4841 个字符,预计需要花费 13 分钟才能阅读完成。

Tomcat 的 Connector 有三种模式:bio,nio.apr;下面来说一下他们各自的特性:

Java BIO、NIO、AIO

同步:自己亲自出马持银行卡到银行取钱(使用同步 IO 时,Java 自己处理 IO 读写)。

异步:委托一小弟拿银行卡到银行取钱,然后给你(使用异步 IO 时,Java 将 IO 读写委托给 OS 处理,需要将数据缓冲区地址和大小传给 OS(银行卡和密码),OS 需要支持异步 IO 操作 API)。

阻塞:ATM 排队取款,你只能等待(使用阻塞 IO 时,Java 调用会一直阻塞到读写完成才返回)。

非阻塞:柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞 IO 时,如果不能读写 Java 调用会马上返回,当 IO 事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成)。

Java 对 BIO、NIO、AIO 的支持:

Java BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

Java NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I / O 请求时才启动一个线程进行处理。

Java AIO(NIO.2):异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的 I / O 请求都是由 OS 先完成了再通知服务器应用去启动线程进行处理

BIO、NIO、AIO 适用场景分析:

BIO 方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择,但程序直观简单易理解。

NIO 方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4 开始支持。

AIO 方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用 OS 参与并发操作,编程比较复杂,JDK7 开始支持。

——————————————————————————–

好,下面来看看 tomcat 的 bio、nio、apr 模式

bio
bio(blocking I/O),顾名思义,即阻塞式 I / O 操作,表示 Tomcat 使用的是传统的 Java I/ O 操作(即 java.io 包及其子包)。Tomcat 在默认情况下,就是以 bio 模式运行的。遗憾的是,就一般而言,bio 模式是三种运行模式中性能最低的一种。我们可以通过 Tomcat Manager 来查看服务器的当前状态。

nio
是 Java SE 1.4 及后续版本提供的一种新的 I / O 操作方式 (即 java.nio 包及其子包)。Java nio 是一个基于缓冲区、并能提供非阻塞 I / O 操作的 Java API,因此 nio 也被看成是 non-blocking I/ O 的缩写。它拥有比传统 I / O 操作(bio) 更好的并发运行性能。

apr
(Apache Portable Runtime/Apache 可移植运行库),是 Apache HTTP 服务器的支持库。你可以简单地理解为,Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高 Tomcat 对静态文件的处理性能。Tomcat apr 也是在 Tomcat 上运行高并发应用的首选模式。

在这之前,我们先把 tomcat 管理界面配置起来,以便等下能更方便的观察我们的 bio、nio、apr 模式

添加 manager/status 用户

vim /usr/local/apache-tomcat-7.0.47/conf/tomcat-users.xml <role rolename=”manager-gui”/> <user username=”tomcat” password=”15715746746″ roles=”manager-gui”/>

配置完重启,通过 ip:port/manager/status 就可以看 tomcat 状态了,里面有服务器的信息及 tomcat 信息。bio server.xml 配置(重启生效)
<Connector port=”8080″ protocol=”HTTP/1.1″ connectionTimeout=”20000″ redirectPort=”8443″ />

nio server.xml 配置(重启生效)
<Connector port=”8080″ protocol=”org.apache.coyote.http11.Http11NioProtocol” connectionTimeout=”20000″ redirectPort=”8443″ />

apr server.xml 配置(重启生效)
<Connector port=”8080″ protocol=”org.apache.coyote.http11.Http11AprProtocol” connectionTimeout=”20000″ redirectPort=”8443″ />

tomcat 支持 apr 步骤

1. 下载相关的工具包

 wget http://mirrors.aliyun.com/apache/apr/apr-1.5.2.tar.gz
 
 wget http://mirrors.aliyun.com/apache/apr/apr-util-1.5.4.tar.gz

 tomcat 的 bin 目录下的 tomcat-native.tar.gz 文件复制到
/usr/local/apr

2. 安装

    #tar zxvf apr-1.5.2.tar.gz
    #cd apr-1.5.2
    #./configure –prefix=/usr/local/apr ;make;make install

    #tar zxvf apr-util-1.5.4.tar.gz
    #cd apr-util-1.5.4 
    #./configure –prefix=/usr/local/apr/apr-util –with-apr=/usr/local/apr;make;make install

    tar zxvf tomcat-native-1.1.20-src.tar.gz
    cd tomcat-native-1.1.20-src/jni/native 
  ./configure –with-apr=/usr/local/apr;make;make install
 

3 设置 Tomcat 整合 APR
    修改 tomcat 的启动 shell(startup.sh),在该文件中加入启动参数:
      CATALINA_OPTS=”$CATALINA_OPTS -Djava.library.path=/usr/local/apr/lib”。
 
 4 判断安装成功:
    如果看到下面的启动日志,表示成功。
    2016 11:11:41 上午 org.apache.coyote.AbstractProtocol start  Starting ProtocolHandler [“http-apr-8280”]

ps : apr 安装目录为啥是 /usr/local/apr,我最早安装在 /opt/apr 目录下,我们生产环境 java 相关的都在这个目录,但最后安装 tomcat-native 时,<span style=”font-family: Arial, Helvetica, sans-serif;”> 他将所有的 jar 都安装到了 /usr/local/apr/lib 目录下,为了前后目录的统一,最后都安装在 /usr/local/apr 目录下 </span> 到这里大致的配置就结束了,建议在做实验之前,先了解清楚 java 的 bio、nio、aio 特性,在 web 服务器上阻塞 IO(BIO)与 NIO 一个比较重要的不同是,客户系统使用 BIO 的时候往往会为每一个 web 请求引入多线程,每个 web 请求一个单独的线程,所以并发量一旦上去了,线程数就上去了,CPU 就忙着线程切换,所以 BIO 不合适高吞吐量、高可伸缩的 web 服务器;而 NIO 则是使用单线程 (单个 CPU) 或者只使用少量的多线程 (多 CPU) 来接受 Socket,而由线程池来处理堵塞在 pipe 或者队列里的请求. 这样的话,只要 OS 可以接受 TCP 的连接,web 服务器就可以处理该请求。大大提高了 web 服务器的可伸缩性。

下面是我自己的一些性能测试表格,通过 jmeter 压测软件(jmeter 软件使用自行百度)在本地测试的(为了数据的有效以及准确性,我没测试 10 分钟,也就是进行一次测试,都会重启 linux 主机及重新打开 jmeter 软件。),当然你也可以选择通过 云主机、自己机房的服务器以及虚拟机等测试,测试当中会涉及到很多点,例如(磁盘 io、带宽、内存、cpu、以及内核配置中的 tcp 各种状态,甚至是各种打开文件限制,都会影响到我们的测试结果)

这里写图片描述

可以看到,随着线程的不断增多,bio 模式性能越来越差,就算是在本地,错误率和响应时间都在明显的增加、而吞吐量、样本数和每秒传输速率都在下降(当然,如果是生产环境,我们肯定通过 nginx web 软件进行反向代理,提供多个 tomcat 节点来提供更稳定的服务。)

而 bio 和 apr 模式基本上没有变化太多,都保持在一个稳定的状态。

Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式

而后来当我进行一些 service 后端程序的测试时,发现 tomcat 性能并没有大幅度的提升,甚至会有下降的趋势。(该接口不是在同网段测试,而是跨越路由器,在网络传输中会有损耗方面,性能跟本地测试也会有所差异)

Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式

总结:
个人觉得在 tomcat bio、nio、apr 模式中,每种都会有各自适用的场合,apr 其实也是 nio 只不过他是操作系统级别的支持,nio 是由 java 本身的 nio 支持的,也不能说哪个好那个不好。就像 tomcat 内存方面的配置,如果内存设置的过大,gc 垃圾回收机制就会变慢;如果内存设置的过小,tomcat 又会出现内存溢出的情况,所以设置在一个合适的范围很重要,不仅不会出错,并且 gc 回收频繁使性能达到一个最优的结果。当然,这也需要根据不同的场合进行不同的测试才能产生最优的结果!

更多 Tomcat 相关教程见以下内容

CentOS 6.6 下安装配置 Tomcat 环境  http://www.linuxidc.com/Linux/2015-08/122234.htm

RedHat Linux 5.5 安装 JDK+Tomcat 并部署 Java 项目  http://www.linuxidc.com/Linux/2015-02/113528.htm 

Tomcat 权威指南(第二版)(中英高清 PDF 版 + 带书签)  http://www.linuxidc.com/Linux/2015-02/113062.htm 

Tomcat 安全配置与性能优化 http://www.linuxidc.com/Linux/2015-02/113060.htm 

Linux 下使用 Xshell 查看 Tomcat 实时日志中文乱码解决方案 http://www.linuxidc.com/Linux/2015-01/112395.htm 

CentOS 64-bit 下安装 JDK 和 Tomcat 并设置 Tomcat 开机启动操作步骤 http://www.linuxidc.com/Linux/2015-01/111485.htm 

CentOS 6.5 下安装 Tomcat  http://www.linuxidc.com/Linux/2015-01/111415.htm 

Tomcat 的详细介绍:请点这里
Tomcat 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-09/134951.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4841字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中