阿里巴巴Java性能调优实战:深入了解NIO的优化实现原理

本文详细介绍了Java NIO的优化实现原理,特别是网络I/O模型的优化,包括阻塞式I/O、非阻塞式I/O、I/O复用、信号驱动式I/O和异步I/O。通过对比测试,展示了在高负载场景下NIO相比于BIO的性能优势。此外,文章还探讨了零拷贝技术和不同线程模型在NIO中的应用,如单线程和多线程Reactor模型,以及如何通过调整Tomcat的参数进行性能调优。
摘要由CSDN通过智能技术生成

答疑课堂:深入了解NIO的优化实现原理

综合查看完近期的留言以后,我的第一篇答疑课堂就顺势诞生了。我将继续讲解 I/O 优化,对大家在 08 讲中提到的内容做重点补充,并延伸一些有关 I/O 的知识点,更多结合实 际场景进行分享。话不多说,我们马上切入正题。

Tomcat 中经常被提到的一个调优就是修改线程的 I/O 模型。Tomcat 8.5 版本之前,默认 情况下使用的是 BIO 线程模型,如果在高负载、高并发的场景下,可以通过设置 NIO 线程 模型,来提高系统的网络通信性能。

我们可以通过一个性能对比测试来看看在高负载或高并发的情况下,BIO 和 NIO 通信性能 (这里用页面请求模拟多 I/O 读写操作的请求):

测试结果:Tomcat 在 I/O 读写操作比较多的情况下,使用 NIO 线程模型有明显的优势。

Tomcat 中看似一个简单的配置,其中却包含了大量的优化升级知识点。

下面我们就从底层 的网络 I/O 模型优化出发,再到内存拷贝优化和线程模型优化,深入分析下 Tomcat、Netty 等通信框架是如何通过优化 I/O 来提高系统性能的。

网络 I/O 模型优化

网络通信中,最底层的就是内核中的网络 I/O 模型了。随着技术的发展,操作系统内核的 网络模型衍生出了五种 I/O 模型,《UNIX 网络编程》一书将这五种 I/O 模型分为阻塞式 I/O、非阻塞式 I/O、I/O 复用、信号驱动式 I/O 和异步 I/O。

每一种 I/O 模型的出现,都是基于前一种 I/O 模型的优化升级。

最开始的阻塞式 I/O,它在每一个连接创建时,都需要一个用户线程来处理,并且在 I/O 操作没有就绪或结束时,线程会被挂起,进入阻塞等待状态,阻塞式 I/O 就成为了导致性能 瓶颈的根本原因。

那阻塞到底发生在套接字(socket)通信的哪些环节呢?

在《Unix 网络编程》中,套接字通信可以分为流式套接字(TCP)和数据报套接字 (UDP)。其中 TCP 连接是我们最常用的,一起来了解下 TCP 服务端的工作流程(由于 TCP 的数据传输比较复杂,存在拆包和装包的可能,这里我只假设一次最简单的 TCP 数据 传输)。

 

首先,应用程序通过系统调用 socket 创建一个套接字,它是系统分配给应用程序的一个 文件描述符; 其次,应用程序会通过系统调用 bind,绑定地址和端口号,给套接字命名一个名称; 然后,系统会调用 listen 创建一个队列用于存放客户端进来的连接;

最后,应用服务会通过系统调用 accept 来监听客户端的连接请求。

当有一个客户端连接到服务端之后,服务端就会调用 fork 创建一个子进程,通过系统调用 read 监听客户端发来的消息,再通过 write 向客户端返回信息。

1. 阻塞式 I/O

在整个 socket 通信工作流程中,socket 的默认状态是阻塞的。也就是说,当发出一个不能立即完成的套接字调用时&

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值