深入拆解Tomcat & Jetty
李号双
eBay技术主管
立即订阅
6067 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | Java程序员如何快速成长?
免费
模块一 必备基础 (4讲)
01 | Web容器学习路径
02 | HTTP协议必知必会
03 | 你应该知道的Servlet规范和Servlet容器
04 | 实战:纯手工打造和运行一个Servlet
模块二 整体架构 (9讲)
05 | Tomcat系统架构(上): 连接器是如何设计的?
06 | Tomcat系统架构(下):聊聊多层容器的设计
07 | Tomcat如何实现一键式启停?
08 | Tomcat的“高层们”都负责做什么?
09 | 比较:Jetty架构特点之Connector组件
10 | 比较:Jetty架构特点之Handler组件
11 | 总结:从Tomcat和Jetty中提炼组件化设计规范
12 | 实战:优化并提高Tomcat启动速度
13 | 热点问题答疑(1):如何学习源码?
模块三 连接器 (9讲)
14 | NioEndpoint组件:Tomcat如何实现非阻塞I/O?
15 | Nio2Endpoint组件:Tomcat如何实现异步I/O?
16 | AprEndpoint组件:Tomcat APR提高I/O性能的秘密
17 | Executor组件:Tomcat如何扩展Java线程池?
18 | 新特性:Tomcat如何支持WebSocket?
19 | 比较:Jetty的线程策略EatWhatYouKill
20 | 总结:Tomcat和Jetty中的对象池技术
21 | 总结:Tomcat和Jetty的高性能、高并发之道
22 | 热点问题答疑(2):内核如何阻塞与唤醒进程?
模块四 容器 (8讲)
23 | Host容器:Tomcat如何实现热部署和热加载?
24 | Context容器(上):Tomcat如何打破双亲委托机制?
25 | Context容器(中):Tomcat如何隔离Web应用?
26 | Context容器(下):Tomcat如何实现Servlet规范?
27 | 新特性:Tomcat如何支持异步Servlet?
28 | 新特性:Spring Boot如何使用内嵌式的Tomcat和Jetty?
29 | 比较:Jetty如何实现具有上下文信息的责任链?
30 | 热点问题答疑(3):Spring框架中的设计模式
模块五 通用组件 (4讲)
31 | Logger组件:Tomcat的日志框架及实战
32 | Manager组件:Tomcat的Session管理机制解析
33 | Cluster组件:Tomcat的集群通信原理
特别放送 | 如何持续保持对学习的兴趣?
模块六 性能优化 (8讲)
34 | JVM GC原理及调优的基本思路
35 | 如何监控Tomcat的性能?
36 | Tomcat I/O和线程池的并发调优
37 | Tomcat内存溢出的原因分析及调优
38 | Tomcat拒绝连接原因分析及网络优化
39 | Tomcat进程占用CPU过高怎么办?
40 | 谈谈Jetty性能调优的思路
41 | 热点问题答疑(4): Tomcat和Jetty有哪些不同?
结束语 (1讲)
结束语 | 静下心来,品味经典
深入拆解Tomcat & Jetty
登录|注册

36 | Tomcat I/O和线程池的并发调优

李号双 2019-08-03
上一期我们谈到了如何监控 Tomcat 的性能指标,在这个基础上,今天我们接着聊如何对 Tomcat 进行调优。
Tomcat 的调优涉及 I/O 模型和线程池调优、JVM 内存调优以及网络优化等,今天我们来聊聊 I/O 模型和线程池调优,由于 Web 应用程序跑在 Tomcat 的工作线程中,因此 Web 应用对请求的处理时间也直接影响 Tomcat 整体的性能,而 Tomcat 和 Web 应用在运行过程中所用到的资源都来自于操作系统,因此调优需要将服务端看作是一个整体来考虑。
所谓的 I/O 调优指的是选择 NIO、NIO.2 还是 APR,而线程池调优指的是给 Tomcat 的线程池设置合适的参数,使得 Tomcat 能够又快又好地处理请求。

I/O 模型的选择

I/O 调优实际上是连接器类型的选择,一般情况下默认都是 NIO,在绝大多数情况下都是够用的,除非你的 Web 应用用到了 TLS 加密传输,而且对性能要求极高,这个时候可以考虑 APR,因为 APR 通过 OpenSSL 来处理 TLS 握手和加 / 解密。OpenSSL 本身用 C 语言实现,它还对 TLS 通信做了优化,所以性能比 Java 要高。
那你可能会问那什么时候考虑选择 NIO.2?我的建议是如果你的 Tomcat 跑在 Windows 平台上,并且 HTTP 请求的数据量比较大,可以考虑 NIO.2,这是因为 Windows 从操作系统层面实现了真正意义上的异步 I/O,如果传输的数据量比较大,异步 I/O 的效果就能显现出来。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Tomcat & Jetty 》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(13)

  • QQ怪
    猜测请求处理时间过长,应该增大线程池线程数量

    作者回复: 这种情况应该怀疑大量线程被阻塞了,应该看看web应用是不是在访问外部数据库或者外部服务遇到了延迟

    2019-08-03
    1
    4
  • nightmare
    查看调用的服务是不是耗时太长

    作者回复: 对的

    2019-08-03
    3
  • 门窗小二
    老师!第二种I/O时间与CPU时间这两个指标如何查看?
    2019-08-05
    2
  • 张德
    老师请教一个问题 当线程阻塞 查数据库发生了全表扫描的时候 查数据库的线程是谁创建的 和tomcat的线程是不是一个线程。。。
    2019-10-24
  • 妥协
    阅读tomcat源码,有个地方不明白,NioEndpoint在处理感兴趣的IO事件时,在processKey函数中,调用了unreg(sk, attachment, sk.readyOps()); 这个不是在selector上取消了感兴趣感兴趣的事件吗?为何要这么处理??tomcat源码版本8.5.38
    2019-09-30
  • Geek_00d567
    线程阻塞或者下游服务响应时间过长,导致CPU处理变慢,响应时间过长。
    2019-09-16
  • 草戊
    〈因此队列的长度等于新人加入队列的频率乘以平均每个人处理的时间。〉我觉得这句话有问题,举例说明,一分钟五个人加入排队,二分钟处理一个人,则按公式队列长度为十个人。假设过了十分钟,加入排队人数为50人,处理完人数为5人,队列还有45人则对。那么这个队列的长度,实际上指的是?应该是平均每分钟的到达队伍长度。
    利特尔法则为:在一个稳定的系统中,长时间观察到的平均顾客数量L,等于长时间观察到的有效到达速率λ与平均每个顾客在系统中花费的时间之乘积,即L = λW
    2019-08-17
  • 草戊
    刚才没编写完不小心发出去了。〈〉因此队列的长度等于新人加入队列的频率乘以平均每个人处理的时间。
    2019-08-17
  • 草戊
    因此队列的长度等于新人加入队列的频率乘以平均每个人处理的时间。 这句话有问题吧。比如一分钟来五个人,每个人花费2分钟,按公式计算队列长度是10。实际上,十分钟时,总共来了5*10=50人,总共处理了
    2019-08-17
  • 82
    老师好,如果请求数据相对比较大,但实际逻辑处理会很快完成,那么如何调优提高并发值呢?
    2019-08-06
  • 月如钩
    需要排查下外部服务或者数据库连接
    2019-08-05
  • -W.LI-
    提高Tomcat最大线程数压榨CPU,优化程序降低响应时间,目测程序阻塞比较多。
    2019-08-03
  • 许童童
    应该是最大池线程大小设置得过小导致的,具体原因还需要看性能监控和线程池参数配置。
    2019-08-03
收起评论
13
返回
顶部