性能度量

参考:The Architecture of Open Source  Applications (Volume II) -- ZeroMQ

消息中间件的性能度量一般有两个指标:

1. 吞吐量(throughput):单位时间内,有多少消息能通过消息中间件

2. 延迟(latency):一个消息,从一端到另一端的耗时

 

显然,这两个指标我们都需要关注。那这两个指标是否存在关系,他们存在什么样的关系呢?直观的想:在测试时,所通过的消息量除以测试的耗时,我们就得到了throughput指标;将测试耗时,除以消息量(个数),我们就得到了latency指标,表面上看这两者似乎存在“倒数”关系。真的是这样吗?

实际上,throughput与latency之间的关系并非如此直白。

aosa8

    以上图为例: 根据我们之前的计算逻辑, throught = 5个消息/6s = 0.83 (msgs/s), latency = 6s/5个消息 = 1.2 (s/msg)。are you sure?? 让我们再来看一看,5个消息,从A到B的耗时分别是:

[msg_1:2s],

[msg_2: 2.5s],

[msg_3: 3s],

[msg_4: 3.5], 

[msg_5: 4s],

    实际的平均耗时(latency)是多少呢? 应该是: (2 + 2.5 + 3 + 3.5 + 4) / 5 = 3 (s/msg),这与我们之前计算出的1.2s/msg有不小的差异。再来看看throughput,整个过程耗费6s,在A方来看,他用了2s就将所有的5个消息都发送出去了, 因此从A的角度来看,他的throughput是5/2 = 2.5 (msgs/s),反过来,从B方来看,从B收到第1条消息,到收完所有的消息,B消耗了6-2 = 4s,因此,从B的角度来看,他的throughput是:5/4 = 1.25 (msgs/sec)。从上面我们看出,实际的latency、throughput与我们最初直观的对throughput以及latency差异不小,显然,是我们对throughput和latency的概念理解出了问题!

    总结一下, 什么是latency,怎样来测量latency?latency只有在确定两点A和B之后,才能测量。没有所谓的单个点A,存在他的latency,同时,每一个流经A和B之间的消息,都有他自己的latency,你可以对每个消息的latency取均值,从而算出平均延迟,但你不能将一条流所有消息的整体耗时除以整条流的消息个数作为每条消息的平均延迟。

    同样的道理,怎样才是正确的评估througput呢?througput只能在某个单点来进行评估(例如点A的througput,点B的througput)。但不能将A,B作为一个整体,去评估出一个所谓的平均吞吐量。throughput是对于一系列的消息而言的,对于单一消息,没有所谓的吞吐量。

 

Make sure you understand the problem you are solving. Even a problem as simple as “make it fast” can take lot of work to understand properly

posted @ 2014-06-10 20:15  一天-lday  阅读(867)  评论(0编辑  收藏  举报