Tomcat容器的I/O分析与调优

随着计算机编程的发展,I/O的常见处理方式一般包括同步阻塞I/O、同步非阻塞I/O、异步非阻塞I/O、I/O多路复用等。

(1)同步阻塞I/O:这是一种最传统的I/O模型,也是最早和使用的最频繁和最简单的I/O模型。当在用户态调用I/O读取操作时,如果此时操作系统内核(Kernel)还没有准备好待读取的数据或者数据还没处理完毕,用户态会一直阻塞等待,直到有数据返回,这时候就是在同步阻塞的情况下进行I/O等待。当操作系统内核准备好数据后,用户态需要继续等待操作系统内核把数据从内核态拷贝到用户态之后才可以使用。总共会发生两次同步阻塞的I/O等待:用户态等待操作系统内核准备好可读的数据,以及等待操作系统内核把数据拷贝到用户态,如图4-1-5所示。

(2)同步非阻塞I/O:对比同步阻塞I/O,同步非阻塞I/O是不需要操作系统内核把数据准备完毕才会有返回,而是不管数据是否处理好了或者数据是否准备好了都会立即返回。如果操作系统内核返回数据还未处理完毕,用户态线程会轮询不断地发起I/O请求,直到操作系统内核把数据处理完成或者准备完毕。然后用户态开始等待操作系统内核把数据拷贝到用户态,这一步和同步阻塞I/O是一样的,如图4-1-6所示。

(3)异步非阻塞I/O:对比同步非阻塞I/O,异步非阻塞I/O处理模式在发出读取数据请求后,就不需要做任何等待了,此时用户线程就可以继续去执行别的操作。在操作系统内核把数据处理完毕,并且把数据从内核拷贝到用户态后,会主动通知用户线程数据已经拷贝完成,在收到此通知后,用户线程再去读取数据即可。如图4-1-7所示,从中我们可以看到中间处理过程不会存在任何的阻塞等待,处理完成后,操作系统内核会以异步的形式进行通知。所以这种处理方式相比前面的两种I/O处理方式会更加的高效。

图4-1-7

(4)I/O多路复用:在传统的I/O处理方式中,每来一个I/O请求就需要开启一个进程或者线程来处理,如果是在高并发的调用方式中,就需要开启大量的进程和线程来进行I/O处理,而大量的进程或者线程必然会需要大量的服务器硬件资源来支撑。I/O多路复用的处理方式很好地解决了这个问题,只需要开启单个进程或者线程,通过记录I/O流的状态来同时管理多个I/O,就可以有效地节省服务器资源,以及减少线程过多时带来的服务器CPU的中断和切换,从而提高资源的有效利用,也可以提高服务器的吞吐能力。

在Tomcat Server中,Connector的实现模式可以是I/O阻塞的方式,也可以是I/O非阻塞的方式,可以通过在server.xml中指定Connector的I/O处理方式。在默认情况下,Tomcat Server的Connector 指定的protocol为"HTTP/1.1",这种方式就是I/O阻塞的处理方式。我们可以把它修改为protocol="org.apache.coyote.http11.Http11NioProtocol",Http11NioProtocol是一种非阻塞的I/O处理模式,如下所示:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"

    connectionTimeout="30000"

    URIEncoding="UTF-8"

    enableLookups="false"

    redirectPort="443" />

Tomcat Server Connector中已经支持的常用I/O处理模式,如表4-3所示。

在Tomcat Server中,NIO一般适用于并发连接数非常大且连接时间又很短的系统架构中。而NIO2一般适用于并发连接数非常多且连接时间又很长的系统架构中。

本文节选自《软件性能测试、分析与调优实践之路(第2版)》,获作者和出版社授权发布。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值