21 | 总结: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
《深入拆解 Tomcat & Jetty 》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(22)
- 最新
- 精选
- QQ怪@正是那朵玫瑰同学,我认为老师所说的耗费cpu资源指的是线程阻塞和等待进行额外的上下文切换,要理解其,先要知道上下文是什么,具体来说,一个线程被剥夺处理器的使用权而被暂停运行,就是“切出”;一个线程被选中占用处理器开始或者继续运行,就是“切入”。在这种切出切入的过程中,操作系统需要保存和恢复相应的进度信息,这个进度信息就是“上下文”了。至于系统开销具体发生在切换过程中的哪些具体环节,总结如下: 操作系统保存和恢复上下文; 调度器进行线程调度; 处理器高速缓存重新加载; 上下文切换也可能导致整个高速缓存区被冲刷,从而带来时间开销。以上情况过多都会耗费cpu资源,而你看到cpu资源利用率下降了是因为cpu已经做完了上下文切换,把线程的上下文保存到内存或者硬盘上去了,但是当你的线程重新唤醒,其cpu是不是又要多一次不必要的上下文切换?
作者回复: 👍
2019-06-29240 - -W.LI-老师好!那就是get请求没有body。使用get请求把参数放url上少一次系统调用?
作者回复: 给你的思考点赞,url长度有限制,另外敏感数据不合适放url,否则是可以的。
2019-06-27417 - 802.11standservice这个例子中,虽然没有加在方法上,在方法里面加是解决了粒度的问题,但是加了3次和只在方法上加1次,系统调用层面上哪个更少哪个更多呢
作者回复: JDK1.6 以后 对锁的实现引入了大量的优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。 其实就是避免每次synchronized操作都引起系统调用和上下文切换
2019-06-29212 - 不二Acceptor 线程组在等待连接建立的过程中,线程还是会阻塞吧?在跟客户端建立连接的这个阻塞有没有优化的方式
作者回复: 是阻塞的,这里没有很大的必要去优化,因为accept调用仅仅是从操作系统的Tcp已连接队列中取出一个连接,很快的。
2019-07-1810 - 802.11刚才看copyonwrite的相关代码,很多地方用了数组拷贝,想问老师,是不是java api中所有带native关键字的方法都走了系统调用
作者回复: 不一定,native方法只是表明java调用了c函数,c函数一定都调用了系统API
2019-06-2958 - ty_young老师,请问tomcat的http body延迟解析只是延迟解析或者不用到不解析,但是http的head和body是同时一次都读到内存的吧,能减少一次系统io调用么
作者回复: 是分开读的
2019-07-2736 - WL老师能不能指点一下在Http11Processor的service()中调用的Http11InputBuffer的parseHeaders()方法是怎么解析header的, 我今天看晕了, 没看懂是怎么将buffer中数据取出解析成header的
作者回复: 建议你先了解一下“状态机”,这是一种设计模式。
2019-06-275 - 锟铻Runtime.exec("shell"),这个是不是系统调用
作者回复: shell是一个c语言程序,运行这个程序的过程中会有系统调用
2019-07-192 - Visual C++Tomcat类加载机制触发的Too many open files问题 如何解决?
作者回复: 加大进程可打开的最大文件数限制
2019-07-0421 - nightmare文件读写,socket网络编程,HeapByteBuffer,JNI都会涉及到系统调用2019-06-287
收起评论