Tomcat - Tomcat 网络通信模型剖析 & 并发参数解读

网友投稿 709 2022-05-28

文章目录

什么是IO

Tomcat 支持四种线程模型

Tomcat 如何使用指定IO模型

Tomcat BIO VS NIO

BIO

NIO

影响 BIO/NIO线程数量的多少的因素

Tomcat connector 并发参数解读

什么是IO

IO是指为数据传输所提供的输入输出流,其输入输出对象可以是:文件、网络服务、内存等。

举个例子,假设应用在从硬盘中读取一个大文件过程中, CPU会与硬盘一样出于高负荷状态么?

CPU 没有太高的增涨 。 通常情况下IO操作是比较耗时的,所以为了高效的使用硬件,应用程序可以用一个专门线程进行IO操作,而另外一个线程则利用CPU的空闲去做其它计算。这种为提高应用执行效率而采用的IO操作方法即为IO模型。

Tomcat 支持四种线程模型

Tomcat 如何使用指定IO模型

配置 server.xml 文件当中的 修改即可。

默认配置 8.0 protocol=“HTTP/1.1” 8.0 之前是 BIO 8.0 之后是NIO

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 8 以前 默认的是 BIO , 8 默认是 NIO

Tomcat BIO VS NIO

在高并发场景下BIO与NIO的线程数的变化

生产环境上,模拟了处理较慢的过程。

为什么差异这么大呢?

我们先看下这两种模型的区别

BIO

源码翻一翻

我们下个Tomcat 7的版本

https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.99/src/

7嘛 ,默认的BIO, 对应的class org.apache.coyote.http11.Http11Protocol.java

Tomcat - Tomcat 网络通信模型剖析 & 并发参数解读

看下 Http11Protocol构造函数

public Http11Protocol() { endpoint = new JIoEndpoint(); cHandler = new Http11ConnectionHandler(this); ((JIoEndpoint) endpoint).setHandler(cHandler); setSoLinger(Constants.DEFAULT_CONNECTION_LINGER); setSoTimeout(Constants.DEFAULT_CONNECTION_TIMEOUT); setTcpNoDelay(Constants.DEFAULT_TCP_NO_DELAY); }

重点 JIoEndpoint ------> Java I/O Endpoint

对应JIoEndpoint 中的

熟悉吧 Socket, 同步阻塞。

继续

这个getExecutor()获取的 就是 那个线程池,用来处理任务的

怎么处理的呢? 继续

NIO

老套路

下载 apache-tomcat-8.5.55-src

Http11NioProtocol的构造函数

重点 NioEndpoint

Acceptor 和 SocketProcessor 大致形同, 主要在于Poller .

先看看Acceptor ,和BIO一样 ,有点不一样的是,Acceptor 交个 Poller处理

进入

添加事件

public class Poller implements Runnable { }

那就看run方法

public void run() { // Loop until destroy() is called 轮询 while (true) { boolean hasEvents = false; try { if (!close) { hasEvents = events(); // > 0 说明有socket需要处理 if (wakeupCounter.getAndSet(-1) > 0) { //if we are here, means we have other stuff to do //do a non blocking select keyCount = selector.selectNow(); } else { keyCount = selector.select(selectorTimeout); } wakeupCounter.set(0); } if (close) { events(); timeout(0, false); try { selector.close(); } catch (IOException ioe) { log.error(sm.getString("endpoint.nio.selectorCloseFail"), ioe); } break; } } catch (Throwable x) { ExceptionUtils.handleThrowable(x); log.error("",x); continue; } //either we timed out or we woke up, process events first if ( keyCount == 0 ) hasEvents = (hasEvents | events()); Iterator iterator = keyCount > 0 ? selector.selectedKeys().iterator() : null; // Walk through the collection of ready keys and dispatch // any active event. while (iterator != null && iterator.hasNext()) { SelectionKey sk = iterator.next(); NioSocketWrapper attachment = (NioSocketWrapper)sk.attachment(); // Attachment may be null if another thread has called // cancelledKey() if (attachment == null) { iterator.remove(); } else { iterator.remove(); processKey(sk, attachment); } }//while //process timeouts timeout(keyCount,hasEvents); }//while getStopLatch().countDown(); }

影响 BIO/NIO线程数量的多少的因素

BIO

线程数量 会受到 客户端阻塞、网络延迟、业务处理慢===>线程数会更多

NIO

线程数量 会受到业务处理慢===>线程数会更多

Tomcat connector 并发参数解读

Java Tomcat 网络

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:企牛网入驻华为云市场,助力业务上云
下一篇:Nginx——配置文件详解
相关文章