前言
最近一些朋友通过书籍找到我,问了一些关于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 进行预定。感谢各位朋友。
=========================
欢迎关注: