性能估计(调优)——公式和模型

来源:互联网 发布:c语言中 t是什么意思 编辑:程序博客网 时间:2024/04/29 18:18

查阅相关资料整理而成。

  1. 《深入Nosql》(《Professional NoSQL》 )作者:(印)蒂瓦里Shashank Tiwari
  2. 《NoSQL数据库笔谈》作者:颜开
  3. 《编程珠玑》中文版 第二版
  4. 其他博客。

一、Amdahl定律和Gustafson定律

Amdahl's law是Amdahl在1967发表的文章《G.M. Validity of the single-processor approach to achieving large scale computing capabilities》提出的,后来逐渐得到了并行计算领域的公认,并广泛应用于计算并行所带来的加速比。该定律用下述公式描述:speedup=1/(s+(1-s)/n),其中,s表示执行程序中不可加速部分的比例,n表示可加速部分的加速比。

  1. 在多核情况下的Amdahl定律。多核的产生,对并行负载的执行效率提高产生了非常积极的作用。在这里,我们可以用Amdahl定律量化,speedup=1/(串行部分比例+(1-串行部分比例)/核的数量)。很明显,随着核的增加,加速比会提高。但实际上,这只是一个理论加速比,因为不同核上执行的线程可能存在同步开销,操作系统也会因多核而产生额外的开销。因此,实际的加速比公式,应该修正为:speedup=1/(串行部分比例+(1-串行部分比例)/核的数量+系统开销)。2.超线程情况下的Amdahl定律。超线程与多核的根本区别是超线程技术中,多个线程分时复用一个执行核,但复制体系结构状态信息(如通用寄存器,L1 cache,中断控制寄存器,分支预测等),用通俗的话来描述,就是一个领导,几套班子,而多核是几个领导,几套班子(不知道比喻是否恰当,呵呵)。很明显,分时复用与独占是有区别的。因此,在超线程情况下,Amdahl定律应该作如下修正:speedup=1/(串行部分比例+((1-串行部分比例)/核的数量)*比例系数k+系统开销),其中k<1,具体数值应根据具体的情况而定。3.Amdahl定律的局限性按照Amdahl定律,如果核的数目为无限大,那么加速比的理论上限值为1/串行部分比例,也即,无论核的数目多大,加速比也不可能增得很大。这确实给并行领域的学者给予了一个沉重打击,整个领域笼罩在一片悲观情绪中。
  2. 令人感到欣喜的是,1988年sandia national lab的Gustafson等人,在用1024个处理器的超立方体结构上做实验时,发现加速比随着处理器的数量呈现行增长。做的三个实验分别是:beam stress analysis using conjugate gradients, baffled surface wave simulation using explicit finite differences,unstable fluid flow using fluxcorrected transport. 他们用计算加速比的定义简单推导:speedup=(s+p*n)/(s+p)=s+p*n=n+(1-n)*s. 这就是著名的Gustafson公式,其中s为串行部分比例,n为核的数目。很明显,我们可以从这个公式看出:加速比随着核的数目而线性增长。应该说,Gustafson定律对多核处理器上并行计算的潜力作出了更加现实和乐观的展望。
  3. 那么,这两个定律对于加速比的计算为什么会产生如此截然不同的结论呢?实际上,Amdahl定律有三个潜在前提:1)最有算法的性能严格受限于CPU资源的可用性。2)串行算法是给定问题的最优解决方案。3)处理核增长的时候,问题的规模不变。任何违背这三个假设的实例都可以打破Amdahl定律,也就是说,Amdahl定律对违背这三个假设的问题来说,是谬误的。Gustafson等人做的那三个实验属于大规模并行处理,违背了第三个假设。违背第一个假设和第二个假设的实例也很多,可以举出来,同学们可与我当面讨论。在这里,可以得出结论,在大规模并行计算中,Amdahl定律是不适用的。4. Amdahl定律和Gustafson 定律的同一性。实际上,Amdahl定律和Gustafson定律是等价的,但等价的前提是,要重新计算公式中的s.在Amdahl定律中,认为s是独立于n 的变量,而实际上在大规模并行处理问题中,s是依赖于n的变量。在这里,假定Amdahl定律中的s为s1,而Gustafson 定律中的s为s2.那么s1与s2实际上可以很简单地推出如下关系:s1=1/(1+(1-s2)*p/s2).将这个式子带入Amdahl定律,就是Gustafson定律的公式了。综上所述,问题的根本就在与s的计算问题。实际上,Gustafson当时并没有意识到这点,他只是按照他的实验推导出了他的公式。
  4. 另一种解读:
这里,我们都以S(n)表示n核系统对具体程序的加速比,K表示串行部分计算时间比例。
Amdahl 定律的加速比:S(n)=使用1个处理器的串行计算时间/使用n个处理器的并行计算时间
S(n) = 1/(K+(1-K)/n) = n/(1+(n-1)K)
Gustafson定律的加速比:S(n)=使用n个处理器的并行计算量 /使用1个处理器的串行计算量
S(n) = K+(1-K)n
有点冷是不是?
通俗的讲,Amdahl 定律将工作量看作1,有n核也只能分担1-K的工作量;而Gustafson定律则将单核工作量看作1,有n核,就可以增加n(1-K)的工作量。
这里没有考虑引进分布式带来的开销,比如网络和加锁。成本还是要仔细核算的,不是越分布越好。
控制算法的复杂性在常数范围之内。
二、72法则和Little定律  
  1. 72法则:假设以年利率人r%投资一笔钱y年,金融版的72法则指出,如果r×y=72,那么你的投资差不多会翻倍。如以年利率6%投资1000美元12年,可得到2012美元;以年利率8%投资1000美元9年,可得到1999美元。增长率介于5%和10%之间时,72法则估算的误差在1%以内。
    72法则用于估算指数过程的增长非常便利。如果一个盘子里的细菌群以小时3%的速率增长,那么其数量每天会翻倍(一天24小时)。翻倍使程序员回忆起来熟悉的经验法则:由于2的10次方=1024,10次翻倍大约是1000倍,20次翻倍大约是100万倍。
    假设一个指数程序解决规模为n=40的问题需要10秒的时间,并且n每增加1运行时间就增加12%。72法则告诉我们,n每增加6,运行时间就加倍。或者,n每增加60,运行时间就增加为原来的1000倍(翻倍,2的10次方)。于是,当n=100时,程序将运行10000秒。当n增加到160时,运行时间增加到10的7次方秒,大约是4个月时间(一年有3.155×10的7次方秒)。---------------大多数的估算都遵循这样一个浅显的法则:总花费就等于每个部分的花费再乘以总的部分数。但某些时候我们还需要更深入地了解细节。俄亥俄州立大学的Bruce Weide就一条通用得出奇的规则写下如下文字。
    Denning和Buzen引入的"操作分析"(参见Computing Surveys 10第3期,1978年11月,第225~261页)比计算机系统队列网络模型更加通用。他们的展示相当精彩,不过由于文章主题的限制,他们并未深入揭示Little定律的通用性。他们的证明方法与队列和计算机系统都没有关系。想象一个任意的、有某些东西进入和离开的系统。Little定律可以表述为"系统中的东西的平均数目等于这些东西离开系统的平均速度乘以每个东西离开系统所花费的平均时间"。(若系统的总体出入流是平衡的,离开速率也就是进入速率。)
    我在我的计算机体系结构课程中教授这一性能分析方法。不过我尝试强调这一结论是系统论中的一个通用定律,可以被应用于许多不同种类的系统。比如说,你正在排队等待进入一个很受欢迎的夜总会,你可以通过估计人们进入的速率来知道自己还要等待多长时间。应用Little定律,你可以推理:"这个地方差不多能容纳60人,平均在里面呆的时间是3个小时,所以我们以每小时20人的速度进入。而我们前面还有20个人,所以我们还要等上一个小时。看样子我们还不如回家看《编程珠玑》呢。"你应该会这样推理。
    Peter Denning将这一规则简单地总结为:"队列中的平均物件数等于进入速率和平均保存时间的乘积。"他将这一规律应用于他的酒窖:"我在地下室里存了 150箱酒,我每年要喝掉(并买入)25箱。我保存每一箱的时间有多久?Little定律告诉我们,用25箱/年除150箱,也就是每箱保存6年。"
    然后他又把这一定律应用于更加严肃的系统。"可以用Little定律和流平衡的原理推导分时系统中的响应时间公式。设共有N台平均思考时间为Z的终端连接到一台响应时间为R的任意系统中。每一个用户周期都是由终端思考和等待系统响应的阶段组成的,所以整个元系统(包括终端和计算机系统)的响应时间相对于N是固定的。如果切断系统输出到终端的路径,就可以看到一个平均负载为N、平均响应时间为 Z+R,而吞吐量为X(即每个时间单位处理的作业数)的元系统。Little定律告诉我们,N = X×(Z+R),解得R = N/X Z。"
    Denning进一步说明:"Little定律在'强制流定律'和'实用定律'的加强下会更加有用。我们可以用这样的方法计算下列问题的答案:一个巨大的计算机系统包括大容量的磁盘、高速的处理器、一套机密的操作系统和20个思考时间为20秒的终端。通过观察,它的磁盘每处理一个作业就要处理100个数据请求,而磁盘每秒钟可以处理25个请求。那么系统的吞吐量和响应时间各是多少?(我算了算,应该是每秒钟0.25个作业和60秒。)在流平衡的条件下,这些答案就是精确解,而流平衡是很接近实际情况的。任何配置的任何系统,只要磁盘和终端的参数相同,就必然具有相同的吞吐量和响应时间。惊讶吗?尤其是那些对于系统流和拥塞的基础定律的作用缺乏认识的人,一定会感到吃惊。"
  2. Little定律:考虑一个带有输入/输出的任意系统,Little定律指出:系统中物体的平均数量等于物体离开系统的平均速率和每个物体在系统中停留的平均时间的乘积。(如果物体离开和进入系统的总体出入流是平衡的,那么离开速率也就是进入速率。)
    例如,假设你正排队等待进入一个火爆的夜总会,你可以通过估计人们进入的速率来了解自己还要等待多长时间。依据Little定律,可以推论:“这个地方可以容纳60人,每个人在里面逗留的时间大约是3小时,因此进入夜总会的速率大概是每小时20人。现在队伍中我们前面还有20人,也就意味着我们需要等大约1小时.”
    Peter Denning简明扼要地将这条法则表述为:队列中物体的平均数量为进入速率与平均停留时间的乘积。
    如,在地下室有150箱酒,每年喝掉25箱并买入25箱,那么每箱酒的保存时间是多长?Little定律告诉我们是:150/25=6年。--------------------计算机系统性能的重要估计法则:little's law.
    1. 引语:
    性能估算是一个优秀的程序员应该具备的基本素质。
    在排队理论中,little‘s law是一个重要而通用的估算公式,它对于我们估算我们所开发的系统的性能,特别是当我们开发服务器端的并发软件系统时,有很重要的指导意义。
    2. little‘s law 估计公式。
    在一个稳定的系统中,平均的客户数(访问该系统的客户)等于客户到达该系统的平均速率乘以客户在该系统中花费的平均时间,即:  这是一个粗略的估算公式。但对于估算开发的系统的性能非常有用,特别是当我们开发服务器端的应用时,用这个公式来估算系统所承担的压力,是非常有用的。所谓稳定的系统,指的是:
    ’客户到达该系统的平均速率 == 客户离开该系统的平均速率 ‘ 成立。
    3. 例子。
    假定:我们所开发的并发服务器,并发的访问速率是: 1000客户/分钟,每个客户在该服务器上将花费平均0.5分钟,根据little's law规则,在任何时刻,服务器将承担 1000×0.5=500 个客户量的业务处理。假定过了一段时间,由于客户群的增大,并发的访问速率提升为 2000客户/分钟。在这样的情况下,我们该如何改进我们系统的性能?
    根据little's law规则,有两种方案:
    第一:提高服务器并发处理的业务量,即提高到2000×0.5=1000。 或者,
    第二:减少服务器平均处理客户请求的时间,即减少到: 2000×0.25=500。
    4. little‘s law 的生活应用。
    假设你排队参观某个风景点,该 风景点固定的容纳人数是:60人。每个人在该 风景点停留的平均时间是:3小时。假设在你的前面还排有20个人,问:你估计你大概等多少时间才能进入该 风景点
    (答案:一个小时)
    5. 参考资料:
    Programming Peals.

三、消息成本模型

Message Cost Model
The third equation is the Message Cost Model. The Message Cost Model breaks down the cost of sending a message from one end to the other in terms of its fi xed and variable costs. Simply put, the Message Cost Model equation is as follows:
C = a + bN
C is the cost of sending the message from one end, say A, to the other, say B
a is the upfront cost for sending the message
b is the cost per byte of the message
N is the number of bytes of the message
This equation is simple to understand and there are two key takeaways from this model:
Transfer of a message irrespective of its size involves an upfront fi xed cost. In terms of messages, the overhead around connection establishment, handshake, and setup are quite common.
The cost of a message transfer is directly and linearly co-related to the message size.The Message Cost Model provides some interesting insights into costs associated with transmission of messages across a network. On a gigabit Ethernet, a is about 300 micro-seconds, which is 0.3 milliseconds, and b is 1 second per 125 MB. 1 Gigabit is 1000 Mb or 125 MB. A gigabit Ethernet implies a transmission rate of 125 MBps. A cost of 1 second per 125 MB is the same as 1 ms per 125 KB because 1000 ms make up a second and 1000 KB make up an MB. This means 100 messages of 10 KB each take 100 multiplied by (0.3 + 10/125) ms, which is 38 ms, whereas 10
messages of 100 KB take only 10 multiplied by (0.3 + 100/125) ms, which is 11 ms. Therefore, a way to optimize message cost is to send as big a packet as possible each time, thereby amortizing the upfront cost over a much larger size.