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


相关文章
|
13天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
60 1
|
18天前
|
监控 安全 BI
什么是零信任模型?如何实施以保证网络安全?
随着数字化转型,网络边界不断变化,组织需采用新的安全方法。零信任基于“永不信任,永远验证”原则,强调无论内外部,任何用户、设备或网络都不可信任。该模型包括微分段、多因素身份验证、单点登录、最小特权原则、持续监控和审核用户活动、监控设备等核心准则,以实现强大的网络安全态势。
|
23天前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数
|
2月前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
103 2
|
2月前
|
运维 网络协议 算法
7 层 OSI 参考模型:详解网络通信的层次结构
7 层 OSI 参考模型:详解网络通信的层次结构
307 1
|
2月前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
2月前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
102 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
3月前
|
机器学习/深度学习 编解码 算法
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
58 0
|
19天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
59 17
|
30天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。

热门文章

最新文章