深入拆解 Tomcat & Jetty
李号双
eBay 技术主管
38890 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
深入拆解 Tomcat & Jetty
15
15
1.0x
00:00/00:00
登录|注册

21 | 总结:Tomcat和Jetty的高性能、高并发之道

课后思考
本期精华
Tomcat和Jetty的设计
资源的高效利用原则
衡量高性能的指标
高性能、高并发之道

该思维导图由 AI 生成,仅供参考

高性能程序就是高效的利用 CPU、内存、网络和磁盘等资源,在短时间内处理大量的请求。那如何衡量“短时间和大量”呢?其实就是两个关键指标:响应时间和每秒事务处理量(TPS)。
那什么是资源的高效利用呢? 我觉得有两个原则:
减少资源浪费比如尽量避免线程阻塞,因为一阻塞就会发生线程上下文切换,就需要耗费 CPU 资源;再比如网络通信时数据从内核空间拷贝到 Java 堆内存,需要通过本地内存中转。
当某种资源成为瓶颈时,用另一种资源来换取比如缓存和对象池技术就是用内存换 CPU;数据压缩后再传输就是用 CPU 换网络。
Tomcat 和 Jetty 中用到了大量的高性能、高并发的设计,我总结了几点:I/O 和线程模型、减少系统调用、池化、零拷贝、高效的并发编程。下面我会详细介绍这些设计,希望你也可以将这些技术用到实际的工作中去。

I/O 和线程模型

I/O 模型的本质就是为了缓解 CPU 和外设之间的速度差。当线程发起 I/O 请求时,比如读写网络数据,网卡数据还没准备好,这个线程就会被阻塞,让出 CPU,也就是说发生了线程切换。而线程切换是无用功,并且线程被阻塞后,它持有内存资源并没有释放,阻塞的线程越多,消耗的内存就越大,因此 I/O 模型的目标就是尽量减少线程阻塞。Tomcat 和 Jetty 都已经抛弃了传统的同步阻塞 I/O,采用了非阻塞 I/O 或者异步 I/O,目的是业务线程不需要阻塞在 I/O 等待上。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Tomcat和Jetty的高性能、高并发之道 Tomcat和Jetty在实现高性能、高并发方面采用了一系列精妙的技术手段。它们通过优化I/O和线程模型,减少系统调用,利用池化和零拷贝技术,以及高效的并发编程方式来提高系统资源的利用效率。具体技术包括采用非阻塞I/O或者异步I/O、合理设置线程数、延迟解析策略、缓存和零拷贝技术,以及采用原子变量和CAS操作来代替锁等。这些技术手段旨在减少资源浪费,避免线程阻塞,减少系统调用次数,提高内存和CPU资源利用效率,从而提高系统的响应时间和每秒事务处理量。总的来说,Tomcat和Jetty的技术对于读者了解和应用于实际工作中都具有重要的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Tomcat & Jetty 》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(22)

  • 最新
  • 精选
  • QQ怪
    @正是那朵玫瑰同学,我认为老师所说的耗费cpu资源指的是线程阻塞和等待进行额外的上下文切换,要理解其,先要知道上下文是什么,具体来说,一个线程被剥夺处理器的使用权而被暂停运行,就是“切出”;一个线程被选中占用处理器开始或者继续运行,就是“切入”。在这种切出切入的过程中,操作系统需要保存和恢复相应的进度信息,这个进度信息就是“上下文”了。至于系统开销具体发生在切换过程中的哪些具体环节,总结如下: 操作系统保存和恢复上下文; 调度器进行线程调度; 处理器高速缓存重新加载; 上下文切换也可能导致整个高速缓存区被冲刷,从而带来时间开销。以上情况过多都会耗费cpu资源,而你看到cpu资源利用率下降了是因为cpu已经做完了上下文切换,把线程的上下文保存到内存或者硬盘上去了,但是当你的线程重新唤醒,其cpu是不是又要多一次不必要的上下文切换?

    作者回复: 👍

    2019-06-29
    2
    40
  • -W.LI-
    老师好!那就是get请求没有body。使用get请求把参数放url上少一次系统调用?

    作者回复: 给你的思考点赞,url长度有限制,另外敏感数据不合适放url,否则是可以的。

    2019-06-27
    4
    17
  • 802.11
    standservice这个例子中,虽然没有加在方法上,在方法里面加是解决了粒度的问题,但是加了3次和只在方法上加1次,系统调用层面上哪个更少哪个更多呢

    作者回复: JDK1.6 以后 对锁的实现引入了大量的优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。 其实就是避免每次synchronized操作都引起系统调用和上下文切换

    2019-06-29
    2
    12
  • 不二
    Acceptor 线程组在等待连接建立的过程中,线程还是会阻塞吧?在跟客户端建立连接的这个阻塞有没有优化的方式

    作者回复: 是阻塞的,这里没有很大的必要去优化,因为accept调用仅仅是从操作系统的Tcp已连接队列中取出一个连接,很快的。

    2019-07-18
    10
  • 802.11
    刚才看copyonwrite的相关代码,很多地方用了数组拷贝,想问老师,是不是java api中所有带native关键字的方法都走了系统调用

    作者回复: 不一定,native方法只是表明java调用了c函数,c函数一定都调用了系统API

    2019-06-29
    5
    8
  • ty_young
    老师,请问tomcat的http body延迟解析只是延迟解析或者不用到不解析,但是http的head和body是同时一次都读到内存的吧,能减少一次系统io调用么

    作者回复: 是分开读的

    2019-07-27
    3
    6
  • WL
    老师能不能指点一下在Http11Processor的service()中调用的Http11InputBuffer的parseHeaders()方法是怎么解析header的, 我今天看晕了, 没看懂是怎么将buffer中数据取出解析成header的

    作者回复: 建议你先了解一下“状态机”,这是一种设计模式。

    2019-06-27
    5
  • 锟铻
    Runtime.exec("shell"),这个是不是系统调用

    作者回复: shell是一个c语言程序,运行这个程序的过程中会有系统调用

    2019-07-19
    2
  • Visual C++
    Tomcat类加载机制触发的Too many open files问题 如何解决?

    作者回复: 加大进程可打开的最大文件数限制

    2019-07-04
    2
    1
  • nightmare
    文件读写,socket网络编程,HeapByteBuffer,JNI都会涉及到系统调用
    2019-06-28
    7
收起评论
显示
设置
留言
22
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部