Tomcat线程模型及调优

一、Tomcat线程模型

1. BIO

  同步阻塞式I/O操作,表示Tomcat使用的是传统Java I/O操作(即Java.io包及其子包)。Tomcat7以下版本默认情况下是以bio模式运行的,由于每个请求都要创建一个线程来处理,线程开销较大,不能处理高并发的场景,在三种模式中性能也最低。启动tomcat看到如下日志,表示使用的是BIO模式。
  tomcat6默认采用的。每个请求都要创建一个线程来处理,线程开销较大,不能处理高并发的场景。

2. NIO

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

  NIO中Connector中比BIO多了一个Poller:主要用来轮询事件列表中的事件,判断连接是否可读可写。然后生成任务定义器,放入Executor线程

   一群人去银行办理服务,先填表,不去柜台。有一个人专门轮询看是否有人填好了。

3. ARP

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

4. AIO

  异步非阻塞,使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分 调用OS参与并发操作,编程比较复杂,JDK7开始支持。tomcat8.0后支持。

  一群人去办理,自己填单子,填好了自己去柜台,没有专门的人去询问。

  

配置方法:在tomcat conf 下找到server.xml
在<Connector port="8080" protocol="HTTP/1.1"/>标签中配置 
BIO: protocol =" org.apache.coyote.http11.Http11Protocol" NIO: protocol ="org.apache.coyote.http11.Http11NioProtocol"
AIO: protocol ="org.apache.coyote.http11.Http11Nio2Protocol"
APR: protocol ="org.apache.coyote.http11.Http11AprProtocol"

二、Tomcat本身如何调优,涉及哪些参数

1. 架构/结构优化

  动静分离,所谓动静分离就是将所有的静态资源的请求响应处理放在一个独立的服务器上,比如nginx(目前使用最 多的),tomcat只负责jsp和servlet的加载和处理。这样就能在一定程度上降低tomcat的压力。

2. 线程模型选择(IO优化) 

  线程模型在前面刚刚讲过,我们要根据自己的实际情况选择线程模型。这里再次强调一下,tomcat6默认就使用的BIO,而且也只有BIO    tomcat7和tomcat8都开始支持APR模式,但是观察源码就会发现,tomcat7在没有APR配置的情况下会选择BIO。tomcat8在没有检测到APR配置的情况下会选择NIO。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。 NIO是一个基于缓冲区、并能提供非阻塞I/O操作的Java API。适用于连接数目多且连接比较短(轻操作)的架构。 AIO(NIO2)方式使用于连接数目多且连接比较长(重操作)的架构,充分调用OS参与并发操作,编程比较复杂tomcat8

开始支持。

  APR利用JNI调用本地API,大幅度提高了tomcat的IO性能,是tomcat的“大杀器”,但是如果要使用APR就要安装对应 的组件。

3. 并发优化(线程优化)

  开启tomcat线程池,并且调优:

     maxThreads:调整最大线程数量 

  minSpareThreads: 初始最小线程数量

4. Connector本身调优:

enableLookups="false" 关闭dns解析,减少性能损耗 
minProcessors 服务器启动时创建的最少线程数 
maxProcessors 最大可以创建的线程数
acceptCount="1000"  线程池中的线程都被占用,允许放到队列中的请求数

其他优化: 禁用AJP连接器,使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用

原文地址:https://www.cnblogs.com/qmillet/p/12553328.html