Tomcat的BIO和NIO问题

简介: 前言最近一些朋友通过书籍找到我,问了一些关于tomcat中BIO和NIO的问题,这里列一下方便需要的朋友。

前言

最近一些朋友通过书籍找到我,问了一些关于tomcat中BIO和NIO的问题,这里列一下方便需要的朋友。后续也将前面有朋友问的问题整理下。。

只把 Tomcat 的 bio 模式改为 nio 模式,是否能提高服务器的吞吐量?发现在配置一样的情况下,两种模式压出来的吞吐量差不多。

要看你系统是不是整个都异步化了,因为tomcat的nio只是将网络io异步化了,就是接收和读写异步化了,但是网络报文接受完后还是要交给业务线程池,如果你的业务是阻塞或者说较耗时的话是没办法提升你整个的吞吐量的,除非将整个项目都异步化,现在压起来如果你的cpu如果还打满的话就可以继续优化,但如果bio都能打满cpu就说明已经到物理极限了,没啥好优化的了,只能在代码层去优化了。

在做tomcat nio 模式压测时发现并发量大时,一开始接收不了请求,到后面才慢慢恢复,这是什么导致的?

应该不会接收不了,只是接收不过来,nio的接受线程一般是cpu数,一下很多请求可能需要一些时间来接收。

后来又能慢慢稳定,tps能够上去是什么是情况?

因为长连接,接收工作只做一次。

对比与 nio ,bio 一开始能接收的量比 nio 大,怎么解释?

bio接收是线程池里面的线程接收的,也就是说你的线程池如果设为600,就有600个线程能接收,自然就大了,但是nio是只有cpu数个线程负责接收的。

nio 的优势是什么?是不是 nio 模式下 tomcat 默认能保持10000条连接,而 bio 模式则达不到。

简单地说,nio 模式最大化压榨了CPU,把时间片更好利用起来。通俗地说,bio hlod住连接不干活也占用线程,nio hold住连接不干活也没关系,让需要处理的连接执行就行了。

压测时是短连接还是长连接?

一般工具都是长连接的,就像你用了连接池,池里面的连接。基本不会有工具每请求一次都新建立 jdbc 连接,不然一个连接光建立都得毫秒到秒级别。可以用 netstat 看下你的连接情况的。

nio 模式是不是更适合做 tcp 长连接,用少量线程 hold 住大量的连接,节省资源。但 tomcat 现在都是短连接,nio 抗并发并没有比 bio 强?

nio 适合大量长连接,而且大部分只 hold 不处理的场景,如果你能将你的项目异步化的话 nio 肯定比 bio 扛得多。你用 bio 其实压测时是打不满 CPU 的,所以采用 nio 来压榨 CPU,如果你 bio 都能打满 CPU,那就没必要搞 nio 和异步化了,因为物理极限了,没啥好搞的了,只能去优化代码。

bio 模式下将最大线程数不断调大,直到打满 CPU,这种情况和 nio 异步比较,更倾向于哪一种?

达到峰值后会导致接收不了连接,操作系统层的连接队列满了则会拒绝连接。另外一个是,你不可能开很多线程,bio 开太多线程可能会直接卡死,线程切换花销很大,主要是要将阻塞的环节异步出来,这样线程就能高效干活了。nio 模式我个人觉得还是比 bio 高效很多,因为 bio 模式光网络读写就可能塞很长时间了,而 nio 负责网络 io 的异步化,其他异步化要自己考虑。

以下是广告

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

欢迎关注:

这里写图片描述
这里写图片描述

目录
相关文章
|
2月前
|
设计模式
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
|
1月前
|
Java
Netty BIO/NIO/AIO介绍
Netty BIO/NIO/AIO介绍
|
10天前
|
Java Linux 应用服务中间件
【编程进阶知识】高并发场景下Bio与Nio的比较及原理示意图
本文介绍了在Linux系统上使用Tomcat部署Java应用程序时,BIO(阻塞I/O)和NIO(非阻塞I/O)在网络编程中的实现和性能差异。BIO采用传统的线程模型,每个连接请求都会创建一个新线程进行处理,导致在高并发场景下存在严重的性能瓶颈,如阻塞等待和线程创建开销大等问题。而NIO则通过事件驱动机制,利用事件注册、事件轮询器和事件通知,实现了更高效的连接管理和数据传输,避免了阻塞和多级数据复制,显著提升了系统的并发处理能力。
25 0
|
2月前
|
缓存 Java UED
BIO、NIO、AIO有什么区别
【8月更文挑战第16天】BIO、NIO、AIO有什么区别
64 4
|
2月前
|
Java
"揭秘Java IO三大模式:BIO、NIO、AIO背后的秘密!为何AIO成为高并发时代的宠儿,你的选择对了吗?"
【8月更文挑战第19天】在Java的IO编程中,BIO、NIO与AIO代表了三种不同的IO处理机制。BIO采用同步阻塞模型,每个连接需单独线程处理,适用于连接少且稳定的场景。NIO引入了非阻塞性质,利用Channel、Buffer与Selector实现多路复用,提升了效率与吞吐量。AIO则是真正的异步IO,在JDK 7中引入,通过回调或Future机制在IO操作完成后通知应用,适合高并发场景。选择合适的模型对构建高效网络应用至关重要。
60 2
|
3月前
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
144 1
|
4月前
|
Java 视频直播 数据库连接
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
62 2
|
3月前
|
监控 网络协议 Java
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
61 0
|
4月前
|
存储 监控 Java
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
|
4月前
|
Java
谈谈NIO和BIO区别
谈谈NIO和BIO区别
34 0