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

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

20200603133738443.png

什么是IO


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

20200603140109521.png

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


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


Tomcat 支持四种线程模型


image.png


Tomcat 如何使用指定IO模型


配置 server.xml 文件当中的 <Connector protocol="HTTP/1.1"> 修改即可。

默认配置 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的线程数的变化


20200603141506437.png


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

为什么差异这么大呢?

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


BIO


20200603142402882.png


源码翻一翻

我们下个Tomcat 7的版本

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

  <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />


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

看下 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

20200603214208257.png

对应JIoEndpoint 中的


20200603214237851.png


20200603215732487.png

20200603215802968.png

20200603220308708.png


熟悉吧 Socket, 同步阻塞。

继续


20200603220704407.png

20200603220634971.png


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

怎么处理的呢? 继续

2020060322105123.png


NIO



20200603142447748.png


老套路

下载 apache-tomcat-8.5.55-src

Http11NioProtocol的构造函数

20200603222129496.png

重点 NioEndpoint


20200603222242401.png


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

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


20200603222807336.png


进入


20200603222956579.png


添加事件

20200603223019634.png


 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<SelectionKey> 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 并发参数解读


image.png


相关文章
|
2月前
|
网络协议 算法 Java
基于Reactor模型的高性能网络库之Tcpserver组件-上层调度器
TcpServer 是一个用于管理 TCP 连接的类,包含成员变量如事件循环(EventLoop)、连接池(ConnectionMap)和回调函数等。其主要功能包括监听新连接、设置线程池、启动服务器及处理连接事件。通过 Acceptor 接收新连接,并使用轮询算法将连接分配给子事件循环(subloop)进行读写操作。调用链从 start() 开始,经由线程池启动和 Acceptor 监听,最终由 TcpConnection 管理具体连接的事件处理。
56 2
|
2月前
基于Reactor模型的高性能网络库之Tcpconnection组件
TcpConnection 由 subLoop 管理 connfd,负责处理具体连接。它封装了连接套接字,通过 Channel 监听可读、可写、关闭、错误等
75 1
|
2月前
|
JSON 监控 网络协议
干货分享“对接的 API 总是不稳定,网络分层模型” 看电商 API 故障的本质
本文从 OSI 七层网络模型出发,深入剖析电商 API 不稳定的根本原因,涵盖物理层到应用层的典型故障与解决方案,结合阿里、京东等大厂架构,详解如何构建高稳定性的电商 API 通信体系。
|
2月前
基于Reactor模型的高性能网络库之Poller(EpollPoller)组件
封装底层 I/O 多路复用机制(如 epoll)的抽象类 Poller,提供统一接口支持多种实现。Poller 是一个抽象基类,定义了 Channel 管理、事件收集等核心功能,并与 EventLoop 绑定。其子类 EPollPoller 实现了基于 epoll 的具体操作,包括事件等待、Channel 更新和删除等。通过工厂方法可创建默认的 Poller 实例,实现多态调用。
194 60
|
2月前
|
安全 调度
基于Reactor模型的高性能网络库之核心调度器:EventLoop组件
它负责:监听事件(如 I/O 可读写、定时器)、分发事件、执行回调、管理事件源 Channel 等。
168 57
|
2月前
基于Reactor模型的高性能网络库之时间篇
是一个用于表示时间戳(精确到微秒)**的简单封装类
125 57
|
20天前
|
存储 弹性计算 网络协议
阿里云服务器ECS实例规格族是什么?不同规格CPU型号、处理器主频及网络性能参数均不同
阿里云ECS实例规格族是指具有不同性能特点和适用场景的实例类型集合。不同规格族如计算型c9i、通用算力型u1、经济型e等,在CPU型号、主频、网络性能、云盘IOPS等方面存在差异。即使CPU和内存配置相同,性能参数和价格也各不相同,适用于不同业务需求。
|
20天前
|
算法 安全 网络安全
【多智能体系统】遭受DoS攻击的网络物理多智能体系统的弹性模型预测控制MPC研究(Simulink仿真实现)
【多智能体系统】遭受DoS攻击的网络物理多智能体系统的弹性模型预测控制MPC研究(Simulink仿真实现)
|
6月前
|
网络协议 Java 应用服务中间件
框架源码私享笔记(01)Tomcat核心架构功能 | 配置详解
本文首先分享了《活出意义来》一书序言中的感悟,强调成功如同幸福,不是刻意追求就能得到,而是全心投入时的副产品。接着探讨了Tomcat的核心功能与架构解析,包括网络连接器(Connector)和Servlet容器(Container),并介绍了其处理HTTP请求的工作流程。文章还详细解释了Tomcat的server.xml配置文件,涵盖了从顶级容器Server到子组件Connector、Engine、Host、Context等的配置参数及作用,帮助读者理解Tomcat的内部机制和配置方法。
|
4月前
|
Java 应用服务中间件 Maven
在IntelliJ IDEA中如何配置使用Maven以创建Tomcat环境
所以,别担心这些工具看起来有些吓人,实际上这些都是为了帮助你更好的完成工作的工具,就像超市里的各种烹饪工具一样,尽管它们看起来可能很复杂,但只要你学会用,它们会为你烹饪出一道道美妙的食物。这就是学习新技能的乐趣,让我们一起享受这个过程,攀登知识的高峰!
286 27

热门文章

最新文章