EOS [精解] EOS TPS 多维实测——cleos 方式

pendingauth · 2018年11月17日 · 339 次阅读

本文转载自醒者呆的博客园,作者一面千人,原文链接:https://www.cnblogs.com/Evsward/p/eostps.html

本文主要研究EOS的tps表现,会从插件、cleos、EOSBenchTool以及eosjs四种方式进行分析研究。首先cleos
关键字:eos, tps, cleos, txn_test_gen_plugin, EOSBenchTool, qt, eosjs, C++源码分析

身心准备

  • tps: Transaction per Second. 每秒事务处理量
  • 链环境部署使用Python3脚本 bios-boot-tutorial,使用方法请参考boot-sequence脚本
  • 测试机器的硬件配置:双核cpu + 8G内存
  • eos中一个transaction的结构,展示如下:
{
    "transaction_id": "7943f613f8cde71bc37d76daf3581ceb62ae6d481fa9b3a11ba73d19d909c666",
    "broadcast": false,
    "transaction": {
        "compression": "none",
        "transaction": {
            "expiration": "2018-07-12T09:51:14",
            "ref_block_num": 526,
            "ref_block_prefix": 52869816,
            "net_usage_words": 0,
            "max_cpu_usage_ms": 0,
            "delay_sec": 0,
            "context_free_actions": [],
            "actions": [
                {
                    "account": "eosio.token",
                    "name": "transfer",
                    "authorization": [
                        {
                            "actor": "eosiotestay",
                            "permission": "active"
                        }
                    ],
                    "data": "00bcc95865ea305500fcc95865ea3055010000000000000004535953000000000c7061636b696e672074657374"
                }
            ],
            "transaction_extensions": []
        },
        "signatures": [
            "SIG_K1_KB6ENT2Ns3QmaPSfvxqCkgZTjK5RUDRFwkZ7p9Jv6p1GpnD67jhMUsw1Spfp7yw4hChsubPeiTc2HSt5hc6YdMH5rk5Kfz"
        ]
    }
}

cleos方式

由于我们在研究eos阶段,大量使用到cleos,因此使用cleos来测试tps是我们第一个能想到的手段。这一节我们将加深理解tps的意义,tps的计算方法,讨论单节点与多节点环境对tps的影响。

单节点环境

单节点的搭建这里不再赘述,直接使用脚本执行,

./bios-boot-tutorial.py -k -w -b -s -c -t -S -T --user-limit 1000 -X

注意参数的顺序不能变。

执行成功以后,我们将得到一个拥有1000个stake账户(简单理解为已抵押完可直接投票的账户)的单节点eos环境,最后一个参数-X会让当前环境不断执行随机转账操作(注意:每一笔转账都是一个action,一个action对应一个transaction)

查看日志
修改脚本的stepLog函数,改为:

def stepLog():
    run('tail -f ' + args.nodes_dir + '00-eosio/stderr')

然后在终端执行:

./bios-boot-tutorial.py -l

即可进入同步日志输出的界面。

一、shell方式

环境准备完毕,我们来测试一下当前正在不断进行转账的eos链上的tps表现。这里采用的tps计算方式为:

tps = BlockTxs*2

因为eos是半秒出块,所以两个块的打包交易量之和就是tps,为确保数值可靠性,每个块的打包交易量我们要通过大量区块取平均值的方式。

基于以上思想,可以总结出一个shell命令直接在终端执行即可:

for (( i = 12638; i <= 13638; i++ )); do cleos --wallet-url http://localhost:6666 --url http://localhost:8000 get block $i | grep "executed" | wc -l; done  | awk '{sum+=$1} END {print NR,"blocks average tps =", sum/NR*2}'

取出区块号从200到1200的区块,分别计算每个区块的打包交易量(通过统计其包含的“executed”即可,因为每个交易对应一个“executed”),然后将这些区块交易量进行累加除以数量得到平均值,再乘以2,辅以可视化备注输出即可。

最终结果不是很理想,至少距离官方声称的几千tps有很大差距。

1001 blocks average tps = 39.2727

所以1000个块统计tps为 39.2727

二、python脚本

由于tps的结果不理想,我也有过很多思考,下面我们换一种计算方式来看:

tps = trxs/time

这里通过一种简单的方式来计算tps:即统计共发出了trxs笔交易所耗费的时间,以秒为单位,然后相除即可得到tps。

基于以上思想,由于这部分代码是无法通过一行shell解决的,所以我通过修改bios脚本来解决,

  • 增加内容:
def stepTPS():
    start = time.time()
    numtps = args.num_tps
    i = 0
    while i < numtps :
        print ("on: ",i)
        randomTransfer(0, args.num_senders,1)
        i=i+1
    elapsed = (time.time() - start)
    print ("Time used:",elapsed,"s tps=",numtps/elapsed)
  • 修改randomTransfer函数,增加参数t,用来决定循环次数:
def randomTransfer(b, e, t):
    for j in range(t):
        src = accounts[random.randint(b, e - 1)]['name']
        dest = src
        while dest == src:
            dest = accounts[random.randint(b, e - 1)]['name']
        run(args.cleos + 'transfer -f ' + src + ' ' + dest + ' "0.0001 ' + args.symbol + '"' + ' || true')
  • 增加命令:
('A', 'tps',            stepTPS,                    False,   "calculate the tps"),
  • 增加参数:
parser.add_argument('--num-tps', metavar='', help="Number of tps test trx", type=int, default=1000)
  • 执行A:

注意,在执行前,我们要先停掉单节点环境,将-X去掉,而采用我们的-A来执行随机转账。

./bios-boot-tutorial.py -k -w -b -s -c -t -S -T --user-limit 1000 -X
  • 执行B:
./bios-boot-tutorial.py -A --num-tps 2000

发起2000笔交易,然后使用脚本函数stepTPS进行测试。

  • 结果:
Time used: 26.172592401504517 s tps= 38.20790790072884

结果与shell方式差不多,都是不到40的tps表现。

多节点环境

tps的结果不尽人意,我又转念想到了是否因为单节点出块的原因。因此我搭建了多节点出块加全节点的环境,搭建环境的方法可以参考《【精解】EOS多节点组网:商业场景分析以及节点启动时序》

我仍旧通过以上两种方式,分别是shell方式和Python脚本的方式去测试,最后结果是并无改变,这也证实了eos不具备多线程处理事务的能力。

插曲:我将python脚本的修改提交了EOSIO/eos的官方pr,结果被拒绝合并,原因是“unrelated change”,转念一想,如果合并至源码,用户可以通过这种方式直白地得到eos的tps就是几十个的结论,那绝对是很不好的。

txn_test_gen_plugin插件测试

我对eos的高tps有了深深地怀疑,于是找来了官方的tps测试插件,要亲自感受一下tps的“洗礼”。插件的使用方式很简单,按照官方文档的步骤执行即可,最后我调整参数:

curl --data-binary '[""30, 50]' http:/ /localhost:8888/v1/txn_test_gen/start_generationn

链上日志结果:

通过trxs一列可以看出,每个区块打包的交易量大大提升了,平均tps在2000左右。

插件的测试方法也是bm所推崇的,他说通过cleos无法发挥出真正的eos的性能。那么具体是为什么,我们通过插件的源码txn_test_gen_plugin.cpp进行分析,我将这一部分内容单独成文,请阅读《【源码解读】EOS测试插件:txn_test_gen_plugin.cpp

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册