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内核设计剖析》

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

欢迎关注:


时间: 2024-08-02 23:57:22

Tomcat的BIO和NIO问题的相关文章

tomcat bio nio apr 模式性能测试与个人看法

11.11活动当天,服务器负载过大,导致部分页面出现了不可访问的状态.那后来主管就要求调优了,下面是tomcat bio.nio.apr模式以及后来自己测试的一些性能结果. 原理方面的资料都是从网上找的,并且把多个地方的整理到了一起,觉得很有意义.(后面对tomcat默认页面测试的数据是自己测出来的),tomcat 的三种模式如果用对了场合,性能绝对有大幅度的提升.当然调优也并不只在这一个方面,还有内存(堆内存.非堆内存.新生代内存)以及线程(最大线程.请求队列.备用线程.压缩.以及禁用dns轮

这里有一份面筋请查收(四)

这里我连续介绍三家公司的面试,一家是只有一面,还有两家是面完一面就没去了,没去主要是当时一周面了6家而且是在不同的城市,就选择性的挑了这两家没去,是在是太累了,6月17日那天嗓子都面哑了. 第一家(2016-06-13 14:00) 这是一家本地电商企业,简称S, 企业规模还真是特别大,面的是互联网金融的职位.总共面试就一面,1个多小时,大概的过程就是被蹂躏..Java基础好像没怎么问,大体上问了一些分布式架构的相关问题. 比如:Kafka, ActiveMQ, RabbitMQ之间的区别以及各

NIO vs. BIO 我该如何选择

本文介绍了NIO和BIO的工作原理,并通过一组性能测试,对NIO和BIO的性能进行对比,为如何选择NIO和BIO提供理论和实践依据. 术语介绍 BIO -- Blocking IO 即阻塞式IO.NIO -- Non-Blocking IO, 即非阻塞式IO或异步IO.性能 -- 所谓的性能是指服务器响应客户端的能力,对于服务器我们通常用并发客户连接数+系统响应时间来衡量服务器性能,例如,我们说这个服务器在10000个并发下响应时间是100ms,就是高性能,而另一个服务器在10个并发下响应时间是

java nio框架netty 与tomcat的关系

问题描述 最近在研究http异步客户端. 看到了一堆名词,servlet3.0,jetty,tomcat,HttpAsyncClient netty,mina nio,nio2.0,iocp等等.略混乱   我的问题就是:netty跟tomcat是同样的概念么? netty官方说是个框架,那他是否还需要web容器支持?如果我客户端使用netty,服务端使用tomcat也是能连上的吧?是不是可以用netty的客户端和服务端 直接替换掉HttpAsyncClient和tomcat?    自己整理的

NIO vs. BIO

性能测试 BIO -- Blocking IO 即阻塞式IO NIO -- Non-Blocking IO, 即非阻塞式IO或异步IO 性能 -- 所谓的性能是指服务器响应客户端的能力,对于服务器我们通常用并发客户连接数+系统响应时间来衡量服务器性能,例如,我们说这个服务器在10000个并发下响应时间是100ms,就是高性能,而另一个服务器在10个并发下响应时间是500ms,性能一般.所以提升性能就是提升服务器的并发处理能力,和缩短系统的响应时间. 测试方法 用同一个Java Socket Cl

Tomcat性能优化

Java性能优化原则:代码运算性能.内存回收.应用配置(影响Java程序主要原因是垃圾回收) 代码层优化:避免过多循环嵌套.调用和复杂逻辑 调优内容: 1.增加最大连接数 2.调整工作模式 3.启用gzip压缩 4.调整JVM内存大小 5.作为Web服务器时,与Apache整合或Nginx 6.合理选择垃圾回收算法 7.尽量使用较新JDK版本 生产配置实例: 1 2 3 4 5 6 7 8 9 10 11 12 13 <Connectorport="8080"protocol=&

Tomcat对keep-alive的实现逻辑

Tomcat的connector实现逻辑蛮复杂的,有很多种状态总记不住,每次遇到网络相关的问题都要翻一遍代码,这次结合一个案例看看tomcat的三种connector的实现方式. 这个案例在毕玄的blog里也提到了,背景是某应用上游有个用c写的模块与server端tomcat进行http通讯,这个应用tomcat配置的connector是apr模式.之前一直运行的很稳定,但一次前端扩容后,导致后端的tomcat全部阻塞在下面的堆栈上: "http-apr-7001-exec-2" #2

tomcat源码分析-Connector初始化与启动

   一个应用应用服务器的性能很大程度上取决于网络通信模块的实现,因而Connector模块对于tomcat来说是重中之重.从tomcat5开始,默认的连接器实现为Coyote实现(orag.apache.tomcat:tomcat-coyote:7.0.57),本文基于coyote实现会回答如下两个问题:     一个http请求是怎么被tomcat监听到的,会有那些处理:     ajp协议干什么用的. 一.Connector配置     通过对Container的初始化分析,我们很自然的会

修改Tomcat Connector运行模式,优化Tomcat运行性能

omcat是一个小型的轻量级应用服务器,也是JavaEE开发人员最常用的服务器之一.不过,许多开发人员不知道的是,Tomcat Connector(Tomcat连接器)有bio.nio.apr三种运行模式,那么这三种运行模式有什么区别呢,我们又如何修改Tomcat Connector的运行模式来提高Tomcat的运行性能呢? 下面,我们先大致了解Tomcat Connector的三种运行模式. bio bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统