Gustafson 定律也试图说明处理器个数、串行化比例和加速比之间的关系,如图2-1所示,但是Gustafson 定律和Amdahl 定律的角度不同。同样,加速比都被定义为优化前的系统耗时除以优化后的系统耗时。
可以看到,由于切入角度的不同,Gustafson 定律的公式和 Amdahl 定律的公式截然不同。从Gustafson 定律中,我们可以更容易发现,如果串行化比例很小,并行化比例很大,那么加速比就是处理器的个数。只要不断地累加处理器,就能获得更快的速度。
帕累托法则它也被称为 80/20 法则、关键少数法则。
这个法则是基于我们生活中的认识产生的,人们在生活中发现很多变量的分布是不均匀的——在很多场景下,大约20%的因素操控着80%的局面。也就是说,所有的变量中,比较重要的只有20%,是所谓的“关键少数”。剩下的多数,却没有那么重要。
一个程序完成后必然会去运行,如果我们统计代码的运行时间,往往会发现程序的80%的时间是在运行大约20%的代码。也就是说,只有少数代码非常频繁地被调用。
所以,如果我们想提高程序的性能,最好找出这些少数代码,并做重点优化,这样就可以用很少的改动大幅度地提升整个程序和系统的性能。
假设我们的性能优化投入永远是按照代码的优先级来投入的,也就是说,总是要先优化最值得优化的代码。那么我们看到,只要投入差不多20%的努力,就能产出80%的性能优化产出,获得最大的投入产出比。
假如先解决20%的最重要的问题,就可以达到总体效果的80%。以后再花费80%的努力,也只能解决剩下的20%的问题。
那么现在,我们就从性能优化的角度,来看看如何参照帕累托法则,来规划我们性能优化工作的投入和产出。我举个例子:
- 第一步要耗时最长的流程
- 第二步要考虑耗时最长的流程是否是核心流程,是否可以去掉或者用更快的算法替代
- 第一步和第二步如此反复
利特尔法则(英语:Little’s law),基于等候理论,由约翰·利特尔在1954年提出。利特尔法则可用于一个稳定的、非占先式的系统中。其内容为:
在一个稳定的系统中,长期的平均顾客人数(L),等于长期的有效抵达率(λ),乘以顾客在这个系统中平均的等待时间(W)
或者,我们可以用一个代数式来表达:
L=λW
此理论同样适用于计算机性能优化中的qps及最佳线程数量的计算
最佳线程数量配置需要的线程数 = qps * latency(单位秒)。依据是little’s law,类似的应用是tcp中的bandwidth-delay product。如果这个数目远大于核心数量,应该考虑用异步接口。
线程数量配置示例单线程QPS运行我们都知道 RT「响应时间」 是由两部分组成 CPU Time Wait Time 。那如果系统里只有一个线程或者一个进程并且进程中只有一个线程的时候,那么最大的 QPS 是多少呢?假设 RT 是 199ms (CPU Time 为 19ms ,Wait Time 是 180ms ),那么 1000s以内系统可以接收的最大请求就是
1000ms/(19ms 180ms)≈5.025。
所以得出单线程的QPS公式:
单线程=1000/单线程QPS=1000ms/RT
最佳线程数
还是上面的那个话题 (CPU Time 为 19ms ,Wait Time 是 180ms ),假设CPU的核数1。假设只有一个线程,这个线程在执行某个请求的时候,CPU真正花在该线程上的时间就是CPU Time,可以看做19ms,那么在整个RT的生命周期中,还有 180ms 的 Wait Time,CPU在做什么呢?抛开系统层面的问题(这里不考虑什么时间片轮循、上下文切换等等),可以认为CPU在这180ms里没做什么,至少对于当前的业务来说,确实没做什么。
- 一核的情况
由于每个请求的接收,CPU只需要工作19ms,所以在180ms的时间内,可以认为系统还可以额外接收180ms/19ms≈9个的请求。由于在同步模型中,一个请求需要一个线程来处理,因此,我们需要额外的9个线程来处理这些请求。这样,总的线程数就是:
(180 19)/19≈10个(180ms 19ms)/19ms≈10个
多线程之后,CPU Time从19ms变成了20ms,这1ms的差值代表多线程之后上下文切换、GC带来的额外开销(对于我们java来说是jvm,其他语言另外计算),这里的1ms只是代表一个概述,你也可以把它看做n。
- 两核的情况
一核的情况下可以有10个线程,那么两核呢?在理想的情况下,可以认为最佳线程数为:2 x ( 180ms 20ms )/20ms = 20个
CPU利用率我们之前说的都是CPU满载下的情况,有时候由于某个瓶颈,导致CPU不得不有效利用,比如两核的CPU,因为某个资源,只能各自使用一半的能效,这样总的CPU利用率就变成了50%,在这样的情况下,最佳线程数应该是:50% x 2 x( 180ms 20ms )/20ms = 10个这个等式转换成公式就是:最佳线程数 = (RT/CPU Time) x CPU 核数 x CPU利用率当然,这不是随便推测的,在收集到的很多的一些著作或者论坛的文档里都有这样的一些实验去论述这个公式或者这个说法是正确的
最大QPS公式推导假设我们知道了最佳线程数,同时我们还知道每个线程的QPS,那么线程数乘以每个线程的QPS 即这台机器在最佳线程数下的QPS。所以我们可以得到下图的推算。
我们可以把分子和分母去约数,如下图。