对于参数的了解
在讨论有关最大 tps 的问题之前,我们首先要了解Fabric出块的四个参数之间是如何工作的。
从结论上,Fabric会优先于 PreferredMaxBytes,AbsoluteMaxBytes,MaxMessageCount 这三个参数,最后是 BatchTimeout。
避免落入 batch timeout
我们以如下配置 Probe 发起对于Fabric的性能测试。
BatchTimeout:20
MaxMessageCount:320
AbsoluteMaxBytes:20
PreferredMaxBytes:20480
得到结果如下:
Chaincode | BatchTimeout | MaxMessageCount | AbsoluteMaxBytes | PreferredMaxBytes | TPS |
---|---|---|---|---|---|
sample | 20 | 320 | 20 | 20480 | 414.187180 |
从 tape 的 log 中,我们可以发现最后一个块实际上很大程度的影响了 fabric 的 tps。
Time 5.89s Block 33 Tx 320
Time 5.98s Block 34 Tx 320
Time 6.04s Block 35 Tx 320
Time 6.09s Block 36 Tx 320
Time 24.14s Block 37 Tx 80
time=”2020-12-11T09:27:48Z” level=info msg=”Completed processing transactions.”
tx: 10000, duration: 24.143673413s, tps: 414.187180
因此,这个发现表明,
推论一:我们最好不要依赖一个过大的 batchtimeout 值来触发 fabric 出块。
PreferredMaxBytes,AbsoluteMaxBytes,MaxMessageCount 的关系
那么,PreferredMaxBytes,AbsoluteMaxBytes,MaxMessageCount 三个参数之间如何相互影响?
我们以如下配置 Probe 发起对于Fabric的性能测试。
BatchTimeout:20
MaxMessageCount:10,20,40
AbsoluteMaxBytes:20
PreferredMaxBytes:4
得到结果如下:
Chaincode BatchTimeout MaxMessageCount AbsoluteMaxBytes PreferredMaxBytes TPS
sample 20 10 20 4 156.155258
sample 20 20 20 4 156.811844
sample 20 40 20 4 157.936309
从 tape 的 log 中,我们可以发现无论如何配置 MaxMessageCount,我们的块中永远只有 1 笔交易。
Time 63.75s Block 10000 Tx 1
Time 63.75s Block 10001 Tx 1
Time 63.76s Block 10002 Tx 1
Time 63.76s Block 10003 Tx 1
Time 63.77s Block 10004 Tx 1
Time 63.77s Block 10005 Tx 1
time=”2020-12-11T09:43:16Z” level=info msg=”Completed processing transactions.”
tx: 10000, duration: 1m3.770693352s, tps: 156.811844
4k 大小的 PreferredMaxBytes 在测试中只能支持一个 1tx
基于我们的测试,一笔交易的大小约为 4kb。因此我们调整 PreferredMaxBytes 并且再次观察。
BatchTimeout:20
MaxMessageCount:320,640
AbsoluteMaxBytes:20
PreferredMaxBytes:512
tape log(512k 约等于 135 tx,即 3.8k/block)
Time 6.33s Block 67 Tx 135
Time 6.37s Block 68 Tx 135
Time 6.39s Block 69 Tx 135
Time 6.43s Block 70 Tx 135
Time 6.48s Block 71 Tx 135
Time 6.51s Block 72 Tx 135
Time 6.56s Block 73 Tx 135
Time 6.59s Block 74 Tx 135
Time 6.62s Block 75 Tx 135
Time 6.67s Block 76 Tx 135
Time 6.70s Block 77 Tx 135
Time 6.75s Block 78 Tx 135
Time 6.78s Block 79 Tx 135
符合预期,因此我们可以简单的得出一个推论,这三个参数实际上都是限制 block 中有多少笔交易的参数。
推论二:在 tx 大小恒定的情况下。(或者我们可以以均值取代等方式)块内交易数目为 PreferredMaxBytes/tx size,MaxMessageCount, AbsoluteMaxBytes/tx size 中的最小值。
Fabric TPS 的上限是什么?
硬件上限
我们说任何性能的理论上限是整个网络的上限,也就是整组设备中某个设备 I/O,或其他的最小值。
也就是说,无论我们如何优化这四个参数,我们也无法将 fabric 的 tps 上限超过网络中某块网卡的最大承载能力。
参数失效
因此,为了追求最大的TPS我们需要尽可能的让Fabric某些控制参数失效。来达到这一目的,数学证明如下:
数学表达
从上文中我们将 PreferredMaxBytes,AbsoluteMaxBytes,MaxMessageCount 视为控制一个块内有多少交易。
即:
block size = min(PreferredMaxBytes,MaxMessageCount * tx size, AbsoluteMaxBytes)
或:
tx size = min(PreferredMaxBytes / tx size,MaxMessageCount, AbsoluteMaxBytes / tx size)
推论三: Fabric 网络的 TPS,可以表达为 kb/s 或者 tx/s,如下:
tps(kb/s) = min(PreferredMaxBytes,MaxMessageCount * tx size, AbsoluteMaxBytes)/batchtimout
或者
tps = min(PreferredMaxBytes / tx size,MaxMessageCount, AbsoluteMaxBytes / tx size)/batchtimout
如何实现
现实上来说,业务一般会限制 BatchTimeout 或者 MaxMessageCount。或者我们可以从这两个参数入手。
在如下示例中,
基于 BatchTimeout
在同样的 BatchTimeout 下,调整 MaxMessageCount,基于
tps = min(PreferredMaxBytes / tx size,MaxMessageCount, AbsoluteMaxBytes / tx size)/batchtimout
不断的调整 MaxMessageCount 直到上限。
我们以如下 来配置 Probe 发起对于Fabric的性能测试。
得到结果如下:
Chaincode BatchTimeout MaxMessageCount AbsoluteMaxBytes PreferredMaxBytes TPS calculation tps
sample 0.5 40 500 512000 853.662773 80
sample 0.5 160 500 512000 1073.833629 320
sample 0.5 320 500 512000 1168.482934 640
sample 0.5 640 500 512000 1180.903770 720
sample 0.5 720 500 512000 1282.712621 1440
sample 0.5 1280 500 512000 1258.385389 20480
sample 0.5 2048 500 512000 1258.623620 4096
基于 MaxMessageCount
在同样的 MaxMessageCount 下,调整 BatchTimeout,基于
tps = min(PreferredMaxBytes / tx size,MaxMessageCount, AbsoluteMaxBytes / tx size)/batchtimout
不断的调整 BatchTimeout 直到上限。
我们以如下 来配置 Probe 发起对于 Fabric 的性能测试。
得到结果如下:
Chaincode BatchTimeout MaxMessageCount AbsoluteMaxBytes PreferredMaxBytes TPS
sample 0.2 128000 500 512000 1156.604634
sample 0.5 128000 500 512000 1227.426704
sample 1 128000 500 512000 1291.886710
sample 2 128000 500 512000 1310.490079
sample 5 128000 500 512000 1295.549652
sample 10 128000 500 512000 1184.683782
后记
本文基于 Probe,Tape 以及 test-network,基于 fabric 2.2 版本 image,在 mac 上单机进行的测试。