zoukankan      html  css  js  c++  java
  • Tomcat Connector的三种运行模式

    Tomcat Connector(Tomcat连接器)有bio、nio、apr三种运行模式。

    BIO

    bio(blocking I/O)是指阻塞式I/O操作,Tomcat在默认情况下就是以bio模式运行的。这可以从守护线程的信息看出来。 
    守护线程BIO模式

    关于”阻塞式”的理解,我们回忆起org.apache.catalina.core.Catalina类中的await()方法,在执行ServerSocket.accept()方法后Tomcat容器会一直阻塞到有客户端连接才会返回。每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。

    我先后通过两个不同的浏览器页面输入”localhost:8005/request1”和”localhost:8005/request2”,控制台打出如下信息:

    十二月 02, 2016 8:58:57 下午 org.apache.catalina.core.StandardServer await
    警告: StandardServer.await: Invalid command 'GET /request1 HTTP/1.1' received
    十二月 02, 2016 8:59:17 下午 org.apache.catalina.core.StandardServer await
    警告: StandardServer.await: Invalid command '' received
    十二月 02, 2016 8:59:33 下午 org.apache.catalina.core.StandardServer await
    警告: StandardServer.await: Invalid command 'GET /request2 HTTP/1.1' received
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    bio会有如下的缺点: 
    1.当客户端多时,会创建大量的处理线程。每个线程都要占用栈空间和一些CPU时间。 
    2.阻塞可能带来频繁的上下文切换,而大部分的上下文切换是无意义的。 
    就一般而言,bio模式是三种运行模式中性能最低的一种。

    NIO

    nio(non-blocking I/O)是非阻塞I/O操作。nio是一个基于缓冲区并能提供非阻塞I/O操作的Java API,它拥有比bio更好的并发运行性能。要让Tomcat以nio模式来运行也比较简单,我们只需要修改下server.xml文件: 
    修改协议

    这时我们再查看下守护线程,Connector运行模式已经从http-bio-8080变成了http-nio-8080。 
    修改协议后的守护线程

    NIO的工作原理包括: 
    1.由一个专门的线程来处理所有的 I/O 事件、并负责分发。 
    2.事件驱动机制,而不再同步地去监视事件。 
    3.线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的,减少无谓的线程切换。

    NIO采用了双向通道(channel)进行数据传输,而不是单向的流(stream)。在通道上我们可以注册指定的事件,一共有以下四种事件: 
    1.服务端接收客户端连接事件OP_ACCEPT(16) 
    2.客户端连接服务端事件 OP_CONNECT(8) 
    3.读事件 OP_READ(1) 
    4.写事件 OP_WRITE(4) 
    服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道上的事件。以服务端为例,如果服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,BIO这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有感兴趣的事件到达则处理这些事件;如果没有感兴趣的事件到达则处理线程会一直阻塞,直到感兴趣的事件到达为止。

    APR

    apr(Apache portable Run-time libraries/Apache可移植运行库)是Apache HTTP服务器的支持库。在apr模式下,Tomcat将以JNI(Java Native Interface)的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大提高Tomcat对静态文件的处理性能。Tomcat apr是在Tomcat上运行高并发应用的首选模式。

    如果Tomcat不在apr模式下运行,在启动Tomcat的时候,我们可以在日志信息中看到类似如下信息:

    十二月 02, 2016 8:24:09 下午 org.apache.catalina.core.AprLifecycleListener init
    信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: 
    • 1
    • 2

    而要让Tomcat以apr模式运行,对于Tomcat 7.0.30开始向后的版本,只需要再次修改protocol为”org.apache.coyote.http11.Http11AprProtocol”即可。而对于Tomcat 7.0.30之前的版本,还需要以下三个组件的支持: 
    1.APR library[APR库] 
    2.JNI wrappers for APR used by Tomcat (libtcnative)[Windows操作系统上一个名为tcnative-1.dll的动态链接库文件] 
    3.OpenSSL libraries[OpenSSL库]

  • 相关阅读:
    matlab矩阵中如何去掉重复的行;如何找到相同的行,并找到其位置
    Coursera 机器学习 第9章(下) Recommender Systems 学习笔记
    机器学习基石笔记1——在何时可以使用机器学习(1)
    Coursera 机器学习 第9章(上) Anomaly Detection 学习笔记
    matlab安装过程的被要求的配置程序
    jdk环境变量配置
    Coursera 机器学习 第8章(下) Dimensionality Reduction 学习笔记
    Coursera 机器学习 第8章(上) Unsupervised Learning 学习笔记
    Coursera 机器学习 第7章 Support Vector Machines 学习笔记
    linux服务器---squid限制
  • 原文地址:https://www.cnblogs.com/zmc/p/8979511.html
Copyright © 2011-2022 走看看