[转帖]总结:Tomcat的IO模型

总结,tomcat,io,模型 · 浏览次数 : 0

小编点评

**IO 多路复用概述** **Linux** * 使用的是 **epoll** 方法。 * **epoll** 是 **event poll** 的简称,是一种内核中事件通知机制。 * 在 **tomcat** 服务器上,如果希望默认使用 **NIO**,除了自己版本在 **tomcat7** 以上之外,还需要部署在 **linux** 内核版本大于 2.6 的操作系统之上。 **Windows** * 使用的是 **iocp** 方式。 * **iocp** 是 **ioctl** 的简称,是一种用于 I/O 操作的接口。 **Mac** * 使用的是 **kqueue** 方式。 * **kqueue** 是 **kevent** 的简写,是一种用于 I/O 操作的接口。

正文

一、介绍

对于 linux 操作系统,IO 多路复用使用的是 epoll 方式,对于 windows 操作系统中 IO 多路复用使用的是 iocp 方式,对于 mac 操作系统 IO 多路复用使用的是 kqueue 方式。

由于对于 tomcat 服务器来说基本主要部署在 linux 操作系统上,所以我们主要介绍 linux 的 epoll 模型。epoll 是 event poll 的简称,在 linux 内核版本 2.6 开始支持,所以如果你的 tomcat 服务器如果希望默认使用 NIO,除了自己版本在 tomcat7 以上之外,还需要部署在 linux 内核版本大于 2.6 的操作系统之上。

二、BIO

tomcat6 和之前的版本默认都是使用的 BIO 模型。

BIO模型:即阻塞式IO。

在TomcatBIO模型中,主要参与的角色有:AcceptorHandler工作线程池。对应于前文中Api的请求过程,它们的分工如下:

  • Acceptor:Accepter线程专门负责建立网络连接(accept)。新连接创建后,交给Handler工作线程池处理请求。
  • Handlers:针对每个请求的连接,Handler工作线程池都会分配一个线程,执行后面的所有步骤(read、decode、process、encode、send)。

三、NIO

tomcat7之后(包含7),默认使用NIO模型,即非阻塞式IO,实现是基于JDK的java.nio包。

tomcat的NIO模型,相比较于BIO模型,多了个Poller角色:AcceptorPollerHandler工作线程池

  • Acceptor:Accepter线程专门负责建立网络连接(accept)。新连接创建后,不是直接使用Worker线程处理请求,而是先将请求发送给Poller缓冲队列。
  • Poller:在Poller中,维护了一个Selector对象,当Poller从缓冲队列中取出连接后,注册到该Selector中,阻塞等待读写就绪(read等待就绪、send等待就绪)。
  • Handlers:遍历Selector,找出其中就绪的IO操作,并交给Worker线程处理(read内存读、decode、process、encode、send内存写)。

参考:

NIO优化原理和Tomcat线程模型 - SegmentFault 思否

Tomcat NIO(2)-epoll多路复用 - 腾讯云开发者社区-腾讯云

Java面试题:Tomcat中BIO和NIO线程模型工作原理 - 简书

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树NIONIO概述106747 人正在系统学习中

与[转帖]总结:Tomcat的IO模型相似的内容:

[转帖]总结:Tomcat的IO模型

一、介绍 对于 linux 操作系统,IO 多路复用使用的是 epoll 方式,对于 windows 操作系统中 IO 多路复用使用的是 iocp 方式,对于 mac 操作系统 IO 多路复用使用的是 kqueue 方式。 由于对于 tomcat 服务器来说基本主要部署在 linux 操作系统上,所

[转帖]总结:nginx502:Tomcat调优之acceptCount

问题背景:UI页面点击会偶尔返回error,检查调用日志,发现nginx报502报错,因此本文即排查502报错原因。 如下红框可知,访问本机个备机的服务502了,用时3秒左右(可见并不是超时) 先给出原因:是因为tomcat8默认的acceptCount是100,请求量大的时候,会将一些来不及处理的

[转帖]总结:Springboot监控Actuator相关

一、介绍 由于项目中使用的仍然是比较老旧的1.5.6版本,所以本文是基于此版本进行描述。 二、Actuator使用 ActuatorActuator是Spring Boot提供的对应用系统的监控和管理的集成功能,可以查看应用配置的详细信息,例如自动化配置信息、创建的Spring beans信息、系统

[转帖]总结:正则表达式

一、重要点整理 ^ 为匹配输入字符串的开始位置。 [0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。[^…] 排除型字符组。 abc$匹配字母 abc 并以 abc 结尾,$ 为匹配输入字符串的结束位置。 正则表达式由两种字符构成。一种是在正则表达式中具体特殊意义的“元字符

[转帖]总结:协程与线程

一、介绍 本文主要梳理下进程,线程,协程的概念、区别以及使用场景的选择。 二、进程 我们知道,一切的软件都是跑在操作系统上,真正用来干活 (计算) 的是 CPU。早期的操作系统每个程序就是一个进程,知道一个程序运行完,才能进行下一个进程,就是 “单进程时代”。一切的程序只能串行发生。 早期的单进程操

[转帖]总结:记一次K8S容器OOM案例

一、背景 最近遇到个现象,hubble-api-open组件过段时间会内容占满,从而被K8S强制重启。 让我困惑的是,已经设置了-XX:MaxRAMPercentage=75.0,我觉得留有了一定的空间,不应该会占满,所以想深究下原因。 -XX:MaxRAMPercentage是设置JVM的最大堆内

[转帖]总结:Servlet

一、背景 开发了很久的web服务,使用了很多web框架,都忘记web技术最原始的模样了,今天来回顾下。 二、Servlet是什么? Servlet是sun公司提供的一门用于开发动态web资源的技术。我们普通的Java类实现了Servlet接口后,可将我们的服务部署在Web容器中,这样我们的服务就可以

[转帖]总结:SpringBoot启动参数配置

一、背景 由于项目中加了bootstrap.properties文件,且文件中有变量,如spring.cloud.config.profile=${spring.profiles.active},而bootstrap.properties读取的优先级高于application.properties,

[转帖]总结:shell中的if条件判断

一、if 的基本语法 if [ command ];then xxxelif [ command ];then xxxelse xxxfi 二、常见的一些写法案例 1、if [ "x${var}" = "x" ] 其实就是判断${var}是否为空的意思 2、if [ X"$?" == X"0" ]

[转帖]精华总结:10个问题理解 Linux epoll

epoll 是 linux 特有的一个 I/O 事件通知机制。很久以来对 epoll 如何能够高效处理数以百万记的文件描述符很有兴趣。近期学习、研究了 epoll 源码,在这个过程中关于 epoll 数据结构和作者的实现思路产生出不少疑惑,在此总结为了 10 个问题并逐个加以解答和分析。 本文基于的