性能优化无非就是线程,cpu调度,以及内存之间的配合,这三者中任何一个达到极限,都会造成系统整体性能下降,甚至瘫痪。
线程必然要由cpu调度才能活动起来,那么线程的活动也必须有自己的地盘,那么这个地盘就是内存区域。线程数越多,需要cpu的调度能力越强,需要的内存也就越大,那么线程不可能无限增大,总有个极限,当到达极限之后,系统性能将呈现抛物线形的状态急转往下。
所以我们必须不能让cpu等资源达到这个极限值,一般在85%左右就可以了。intel的工程师曾今说过,我们为什么要让cpu达到100%的性能呢,能够让他发挥到80%-85%就已经很完美了。
那么线程模型也是掣肘性能的一个重要因素,NIO优于BIO,reactor模型又是NIO模型的最佳实践,proactor模型又优于reactor模型。这些线程模型都是值得我们去深入研究的。
每种线程模型都有实际的产品落地,比如早期的tomcat就是BIO模型的,后来NIO起来之后,netty,redis等都基于reactor实现了相对不错的性能。proactor模式又落地到tomcat的NIO2通道中。这些都是优秀的线程模型的实现案例。
java领域里面,内存模型的研究的终极目标是如何更有效率的回收垃圾,从jdk迭代的版本我们可以看出jvm工程师在这方面的努力,在【jvm调优-GC篇】里我们着重讲了各种垃圾收集算法以及产品的落地,从最初的串行垃圾收集器到当前性能最好的G1垃圾收集器,这些都凝聚jvm工程师的心血。
在内存领域,各路大牛可谓都是绞尽脑汁的琢磨各种方案,也取得了一些成效,比如“零拷贝”,这个技术用在各大组件中,nginx,netty,kafka等组件里都有他的影子。他的理念就是干脆跨过堆内存,直接走内核,这样就没gc啥事了。
所以我们调优要做到心中有数,你究竟要调什么?究竟是线程模型呢,还是cpu调度呢,还是内存gc回收呢?针对不同的部分都有成熟的方案可选,不要盲目的去调优。