惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
博客园_首页
H
Help Net Security
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
B
Blog
I
InfoQ
SecWiki News
SecWiki News
T
Tailwind CSS Blog
Spread Privacy
Spread Privacy
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Vulnerabilities – Threatpost
N
Netflix TechBlog - Medium
P
Palo Alto Networks Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Vercel News
Vercel News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
K
Kaspersky official blog
M
MIT News - Artificial intelligence
S
Schneier on Security
T
Threat Research - Cisco Blogs
F
Fortinet All Blogs
Cyberwarzone
Cyberwarzone
Scott Helme
Scott Helme
aimingoo的专栏
aimingoo的专栏
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
The Cloudflare Blog
Recent Announcements
Recent Announcements
Security Latest
Security Latest
G
GRAHAM CLULEY
IT之家
IT之家
Y
Y Combinator Blog
The Last Watchdog
The Last Watchdog
腾讯CDC
Google DeepMind News
Google DeepMind News
V
V2EX
S
Securelist
TaoSecurity Blog
TaoSecurity Blog
B
Blog RSS Feed
S
SegmentFault 最新的问题
博客园 - 叶小钗
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
Project Zero
Project Zero
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
F
Full Disclosure

博客园 - 航宇

关于table中使用了colspan后导致列宽度失效问题 Tomcat9 easyui-datagrid中文分页乱码,提示按钮中文乱码解决方法 修复tomcat9.0中文乱码 maven项目中更新了核心库后导致一些包提示未定义,如:The import org.json cannot be resolved js代码突然在花括号回车自动多加了一个大括号 SQL0419N 十进制除法运算无效,因为结果将有一个负小数位。 SQLSTATE=42911 android listview里包含组件(checkbox)点击事件和Item的点击事件冲突 jsp页面的html代码显示不出来,提示Uncaught SyntaxError: Unexpected token < hibernate中怎样配置两个联合属性为唯一约束(非联合主键) maven 在clean package时,出现:找不到符号 [ERROR] 符号: 方法 sqlDdlFilter(java.lang.String) 解决办法 如何实现Activiti的分支条件的自定义配置(转) 生成验证码 给area标签添加红色边框 android shape 怎么在底部画横线 ListView点击事件失效(item里面有button按钮控件)解决方法 [IBM][CLI Driver] SQL0270N 函数不受支持(原因码:"75")。 SQLSTATE=42997 ScrollView嵌套Linearlayout显示不全的解决办法 android 可以在程序代码中设置样式:style 基于Zxing的二维码的二维码扫描之横屏扫描
Tomcat Connector的三种运行模式
航宇 · 2018-05-02 · via 博客园 - 航宇

Tomcat Connector(Tomcat连接器)有bio、nio、apr三种运行模式。

BIO

bio(blocking I/O)是指阻塞式I/O操作,Tomcat在默认情况下就是以bio模式运行的。这可以从守护线程的信息看出来。 
守护线程BIO模式

关于”阻塞式”的理解,我们回忆起org.apache.catalina.core.Catalina类中的await()方法,在执行ServerSocket.accept()方法后Tomcat容器会一直阻塞到有客户端连接才会返回。每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。

我先后通过两个不同的浏览器页面输入”localhost:8005/request1”和”localhost:8005/request2”,控制台打出如下信息:

十二月 02, 2016 8:58:57 下午 org.apache.catalina.core.StandardServer await
警告: StandardServer.await: Invalid command 'GET /request1 HTTP/1.1' received
十二月 02, 2016 8:59:17 下午 org.apache.catalina.core.StandardServer await
警告: StandardServer.await: Invalid command '' received
十二月 02, 2016 8:59:33 下午 org.apache.catalina.core.StandardServer await
警告: StandardServer.await: Invalid command 'GET /request2 HTTP/1.1' received
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

bio会有如下的缺点: 
1.当客户端多时,会创建大量的处理线程。每个线程都要占用栈空间和一些CPU时间。 
2.阻塞可能带来频繁的上下文切换,而大部分的上下文切换是无意义的。 
就一般而言,bio模式是三种运行模式中性能最低的一种。

NIO

nio(non-blocking I/O)是非阻塞I/O操作。nio是一个基于缓冲区并能提供非阻塞I/O操作的Java API,它拥有比bio更好的并发运行性能。要让Tomcat以nio模式来运行也比较简单,我们只需要修改下server.xml文件: 
修改协议

这时我们再查看下守护线程,Connector运行模式已经从http-bio-8080变成了http-nio-8080。 
修改协议后的守护线程

NIO的工作原理包括: 
1.由一个专门的线程来处理所有的 I/O 事件、并负责分发。 
2.事件驱动机制,而不再同步地去监视事件。 
3.线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的,减少无谓的线程切换。

NIO采用了双向通道(channel)进行数据传输,而不是单向的流(stream)。在通道上我们可以注册指定的事件,一共有以下四种事件: 
1.服务端接收客户端连接事件OP_ACCEPT(16) 
2.客户端连接服务端事件 OP_CONNECT(8) 
3.读事件 OP_READ(1) 
4.写事件 OP_WRITE(4) 
服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道上的事件。以服务端为例,如果服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,BIO这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有感兴趣的事件到达则处理这些事件;如果没有感兴趣的事件到达则处理线程会一直阻塞,直到感兴趣的事件到达为止。

APR

apr(Apache portable Run-time libraries/Apache可移植运行库)是Apache HTTP服务器的支持库。在apr模式下,Tomcat将以JNI(Java Native Interface)的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大提高Tomcat对静态文件的处理性能。Tomcat apr是在Tomcat上运行高并发应用的首选模式。

如果Tomcat不在apr模式下运行,在启动Tomcat的时候,我们可以在日志信息中看到类似如下信息:

十二月 02, 2016 8:24:09 下午 org.apache.catalina.core.AprLifecycleListener init
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: 
  • 1
  • 2

而要让Tomcat以apr模式运行,对于Tomcat 7.0.30开始向后的版本,只需要再次修改protocol为”org.apache.coyote.http11.Http11AprProtocol”即可。而对于Tomcat 7.0.30之前的版本,还需要以下三个组件的支持: 
1.APR library[APR库] 
2.JNI wrappers for APR used by Tomcat (libtcnative)[Windows操作系统上一个名为tcnative-1.dll的动态链接库文件] 
3.OpenSSL libraries[OpenSSL库]