把“基础设施优化”这一部分中讲到的一些抽象的概念和方法,用举例子的方式来梳理一遍。总结下的话,就是帮你理清这些问题:
线程到底是如何在 CPU 中执行的?
线程上下文切换为什么会影响性能?
为什么说异步比同步的性能好?
BIO、NIO、AIO 到底有什么区别?
为什么线程数越多反而性能越差?
今天的课程,从一个选择题开始。假设我们有一个服务,服务的业务逻辑和我们每天在做的业务都差不多,根据传入的参数去数据库查询数据,然后执行一些简单的业务逻辑后返回。我们的服务需要能支撑 10,000TPS 的请求数量,那么数据库的连接池设置成多大合适呢?
给你二个选项:
A. 32
B. 2048
我们直接公布答案,选项 A 是性能更好的选择。连接池的大小直接影响的是,同时请求到数据库服务器的并发数量。那我们直觉的第一印象可能是,并发越多总体性能应该越好才对,事实真的是这样吗?下面我们通过一个例子来探究一下这个问题的答案。
说有一个工厂,要新上一个车间,车间里面设置了 8 条流水生产线,每个流水线设置 1 个工位,那需要安排多少个工人才能达到最佳的效率呢?显然是需要 8 个工人是吧?工人少了生产线闲置,工人多了也没有工位让他们去工作,工人闲置,8 个工人对 8 条流水线是效率最优解。这里面的车间,就可以类比为一台计算机,工位就是线程,工人就是 CPU 的核心。通过这个类比,我们就可以得出这样一个结论:一个 8 核的 CPU,8 个线程的情况下效率是最高的。 这时,每个 CPU 核心正好对应一个线程。
这是一个非常理想的情况,它有一个前提就是,流水线上的工人(CPU 核心)一直有事情做,没有任何等待。而现实情况下,我们绝大部分的计算程序都做不到像工厂流水线那么高效。我们开发的程序几乎是请求 / 响应的模型,对应到车间的例子,生产模式不太像流水线,更像是来料加工。工人在工位上等着,来了一件原料,工人开始加工,加工完成后,成品被送走,然后再等待下一件,周而复始。对应到计算机程序中,原料就是请求,工人在工位上加工原料的过程,