1 QPS (吞吐量)
1.1 RT(ResponseTime,响应时间)
服务器端 RT+网络开销 ≈ 客户端 RT。对于网络来讲,常见的优化方式有 CDN、 AND和专线, 分别适用于不同的场景。
服务器端 RT = Thread CPU Time + Thread Wait Time。
单线程 QPS = 1000ms / RT。
多线程情况下,最佳线程数 = ( RT / CPU Time ) x CPU 核数 × CPU 利用率。多线程 QPS = 最佳线程数 × 单线程 QPS = 1000ms / CPU Time x CPU 核数 × CPU 利用率。
以上推理宏观上正确,因为多线程下的 CPU Time(比如高并发下的GC次数增加消耗更多的CPUTime、 线程上下文切换等)和单线程下的 CPUTime是不一样的。尤其是在同步模型下的相同业务逻辑中,单线程时的 CPU Time 肯定会比大量多线程 的 CPU Time小,但是对于异步模型来说切换的开销会变小。
CPU Time 不只是业务逻辑所消耗的 CPU 时间,而是一次请求中所有环节上消耗的 CPU 时 间之和。比如在 Web 应用中,一个请求过来的 HTTP 的解析所消耗的 CPU 时间, 是 CPU Time 的一部分,另外,这个请求中请求 RPC 的 encode和 decode所消耗的 CPU 时间也是 CPU Time 的一部分。
CPU Time 是由哪些因素决定的呢?两个关键字: 数据结构+算法。
影响 CPU 利用率的因素有:
I/O 能力:分磁盘I/O和网络I/O(网络I/O又分带宽或网络链路等)。
数据库连接池(并发能力= PoolWaitTime /RT ( client ) x Poo!Size)。
内存不足,GC 大量占用 CPU,导致给业务逻辑使用的 CPU 利用率下降,而且 GC 时压满足 Amdahl定律锁定义的场景。
共享资源的竞争,比如各种锁策略(读写锁 、 锁分离等),各种阻塞队列,等等 。
所依赖的其他后端服务 QPS 低造成瓶颈 。
线程数或者进程数,乃至编程模型(同步模型、异步模型,某些场景适合同步模型, 某些场景适合异步模型) 。
1.2 相关定律
Amdahl 定律是用来描述可伸缩性的。可伸缩性是指,当增加计算资源的时候,如 CPU、内存、带宽等,QPS 能够相应地进行改进。
Amdahl在自己的论文中指出,可伸缩性是指在一个系统中,基于可并行化和串行化的组件各自所占的比例,当程序获得额外的计算资源(如 CPU 或者内存等)时, 系统理论上能够获得的加速值(QPS 或者其他指标可以翻几倍)。
Gustafson 定律,是 Amdahl 定律的补充 : S(P) = P - α · (P 一 1),其中P是处理器个数,α 是串行时间占总执行时间的比例 。
两个定律有关系吗?有,它们是相辅相成的关系。 前者从串行和并行执行时间的角度来推导,后者从串行和并行的计算量角度来推导, 不管哪个角度,最终的结果是一样的。
当计算资源(处理器数量)增加时,在串行比例不变的情况下,CPU利用率下降。
但计算资源(处理器数量)增加时,串行的比例越大,CPU利用率下降得越多。