WaykiChain-TPS-性能测试

技术文档网 2021-06-24

测试方法

简介

  1. 节点程序版本
  • 仓库:https://github.com/WaykiChain/WaykiChain
  • 分支:master
  • Commit ID:3663de7a10a277a84831d5c1e076305f46825b1c
  • 编译选项:Release 版本
  1. 节点程序运行环境 节点程序运行在阿里云 ECS Docker 环境,配置如下:
  • CPU:8 核(Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz)
  • 内存:32 G
  • SSD:40 G
  • 宿主机 OS:Ubuntu 14.04.5 LTS
  • Docker:version 18.06.1-ce
  • Docker 容器 OS:Ubuntu 14.04.3 LTS
  1. 测试基于 regtest 网络

  2. 测试原理

  • 节点运行在 regtest 网络,并导入 11 个记账账户私钥
  • 通过 startcommontpstest rpc 触发 TPS 性能测试
  • 由一个专门构造普通转账交易的线程不停地生成交易并放入队列,由另外一个线程从队列取出交易并添加到内存池
  • 矿工线程从内存池取出交易打包,完成出块
  1. 测试结果
startcommontpstest 参数 预期 TPS 实测 TPS
20 65 3250 3238(稳定)
20 100 5000 5589(非稳定值,峰值)

因此,WaykiChain 稳定 TPS 能够达到 3.2K,峰值 TPS 能够达到 5.5K。

1. 源码编译节点程序

节点运行在 regtest 网络,启用挖矿,关闭日志打印,详细配置文件如下所示

rpcuser=wiccuser
rpcpassword=123456
blockminsize=1000
zapwallettxes=0
#debug=INFO
#debug=MINER
logprinttoconsole=0
logtimestamps=1
logprinttofile=0
logprintfileline=1
server=1
listen=1
uiport=4555
rpcport=6968
rpcallowip=0.0.0.0/0
isdbtraversal=1
disablesafemode=1
genblock=1
genblocklimit=1000000
rpcthreads=1
regtest=1

2. 运行节点程序并导入 regtest 网络 11 个记账账户私钥

运行节点程序

./coind -datadir=. &

导入 11 个记账账户私钥

./coind -datadir=./ importprivkey Y5F2GraTdQqMbYrV6MG78Kbg4QE8p4B2DyxMdLMH7HmDNtiNmcbM
./coind -datadir=./ importprivkey Y7HWKeTHFnCxyTMtCEE6tVkqBzXoN1Yjxcx5Rs8j2dsSSvPxvF7p
./coind -datadir=./ importprivkey Y871eB5Xiss2ugKWQRb4nmMhKTnmXAEyUqBimTCupogzoSTVCSU9
./coind -datadir=./ importprivkey Y9cAUsEhfsihbePnCYYCETpN1PVovqTMX4kauKRsZ9ERdz1uumeK
./coind -datadir=./ importprivkey Y4unEjiFk1YJQi1jaT3deY4t9Hm1eSk9usCam35LcN85cUA2QmZ5
./coind -datadir=./ importprivkey Y5XKsR95ymf2pEyuhDPLtuvioHRo6ogDDNnaf4YU91ABvLb68QBU
./coind -datadir=./ importprivkey Y7diE8BXuwTkjSzgdZMnKNhzYGrU8oSk31anJ1mwipSCcnPakzTA
./coind -datadir=./ importprivkey YCjoCrtGEvMPZDLzBoY9GP3r7pqWa5mgzUxqAsVub6xnUVBwQHxE
./coind -datadir=./ importprivkey Y6bKBN4ZKBNHJZpQpqE7y7TC1QpdT32YtAjw4Me9Bvgo47b5ivPY
./coind -datadir=./ importprivkey Y8G5MwTFVsqj1FvkqFDEENzUBn4yu4Ds83HkeSYP9SkjLba7xQFX
./coind -datadir=./ importprivkey YAq1NTUKiYPhV9wq3xBNCxYZfjGPMtZpEPA4sEoXPU1pppdjSAka

导入 0-1 账户私钥

./coind -datadir=./ importprivkey Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13

3. 通过 startcommontpstest 指定测试目标 TPS

通过 ./coind -datadir=. getblockcount 获取并记录 TPS 压测起始区块高度。

如,20 60 表示 每 20 ms 创建 60 个普通转账交易,即,测试目标 TPS 为 3000

./coind -datadir=. startcommontpstest 20 60

4. 停止 TPS 压测

压测时间 2~5 min,通过 ./coind -datadir=. getblockcount 获取并记录 TPS 压测终止区块高度。 停止 TPS 压测

./coind -datadir=. startcommontpstest 0 0

5. 统计 TPS 结果

如下计算结果有效的前提是区块出块间隔稳定为 10s,可以通过 ./coind -datadir=. getblock|grep time 查看连续的区块出块时间间隔是否为 10s。

通过 ./coind -datadir=. getblock <height> | grep txnumber 查询指定区块包含的交易数目,以 TPS 压测起始区块 10,终止区块 20 为例,如下所示

root@0c1d475c709b:/WaykiChain# for((i=10;i<21;++i)) do ./coind -datadir=. getblock $i|grep txnum;done
    "txnumber" : 30657,
    "txnumber" : 29463,
    "txnumber" : 32305,
    "txnumber" : 28841,
    "txnumber" : 28747,
    "txnumber" : 29709,
    "txnumber" : 29686,
    "txnumber" : 31433,
    "txnumber" : 28520,
    "txnumber" : 29532,
    "txnumber" : 30000,

计算连续 10 个区块的每个区块包含交易的平均值

root@0c1d475c709b:/WaykiChain# for((i=10;i<21;++i)) do ./coind -datadir=. getblock $i|grep txnum;done|awk -F ":" '{print $2}'|awk -F "," '{print $1}'|awk '{sum+=$1} END {print "Average = ", sum/NR}'
Average =  29899.4

由于 WaykiChain 出块间隔为 10s,因此,此时 TPS = 29899.4 / 10 ≈ 2990

6. 重复测试 3 次,取平均值作为最终结果

删除节点数据目录 regtest,按照测试方法步骤 2~5 连续测试三次,取三次计算结果的平均值作为最终的结果。

补充:TPS 峰值测试方法

1. 修改区块大小限制宏定义

/** The maximum allowed size for a serialized block, in bytes (network rule) */
static const unsigned int MAX_BLOCK_SIZE = 5000000;
/** Default for -blockmaxsize and -blockminsize, which control the range of sizes the mining code will create **/
static const unsigned int DEFAULT_BLOCK_MAX_SIZE = 4750000;

2. 按照“测试方法” 进行测试

通过不断调整 startcommontpstest 参数 period 与 batchSize,观察节点在不同的 TPS 预期值下的表现。 例如,./coind -datadir=. startcommontpstest 20 100,即,TPS 预期值 5000

root@0c1d475c709b:/WaykiChain# for((i=10;i<21;++i)) do ./coind -datadir=. getblock $i|grep txnum;done
    "txnumber" : 11787,
    "txnumber" : 12242,
    "txnumber" : 55888,
    "txnumber" : 55887,
    "txnumber" : 20000,
    "txnumber" : 6924,
    "txnumber" : 55887,
    "txnumber" : 55888,
    "txnumber" : 14469,
    "txnumber" : 6097,
    "txnumber" : 55887,

如果在配置文件中打开 MINER 日志,可以看到如下内容

2019-04-14 02:07:33 [miner.cpp:610]MINER: CreateNewBlock tx count: 51580 spent time: 514 ms
2019-04-14 02:07:39 [miner.cpp:516]MINER: CreatePosTx success, used time:111 ms, miner address=wQquTWgzNzLtjUV4Du57p9YAEGdKvgXs9t
2019-04-14 02:07:46 [miner.cpp:525]MINER: CheckWork used time:7779 ms
2019-04-14 02:07:47 [miner.cpp:610]MINER: CreateNewBlock tx count: 49068 spent time: 356 ms
2019-04-14 02:07:49 [miner.cpp:516]MINER: CreatePosTx success, used time:149 ms, miner address=wNDue1jHcgRSioSDL4o1AzXz3D72gCMkP6
2019-04-14 02:07:56 [miner.cpp:525]MINER: CheckWork used time:7164 ms
2019-04-14 02:07:57 [miner.cpp:610]MINER: CreateNewBlock tx count: 21190 spent time: 962 ms
2019-04-14 02:07:59 [miner.cpp:516]MINER: CreatePosTx success, used time:122 ms, miner address=wQewSbKL5kAfpwnrivSiCcaiFffgNva4uB
2019-04-14 02:08:02 [miner.cpp:525]MINER: CheckWork used time:3009 ms
2019-04-14 02:08:02 [miner.cpp:610]MINER: CreateNewBlock tx count: 15841 spent time: 124 ms
2019-04-14 02:08:09 [miner.cpp:516]MINER: CreatePosTx success, used time:60 ms, miner address=wVTUdfEaeAAVSuXKrmMyqQXH5j5Z9oGmTt
2019-04-14 02:08:12 [miner.cpp:525]MINER: CheckWork used time:3196 ms
2019-04-14 02:08:13 [miner.cpp:610]MINER: CreateNewBlock tx count: 55887 spent time: 569 ms
2019-04-14 02:08:19 [miner.cpp:516]MINER: CreatePosTx success, used time:94 ms, miner address=wSjMDgKWHC2MzrUamhJtyyR2FTtw8oMUfx
2019-04-14 02:08:28 [miner.cpp:525]MINER: CheckWork used time:8949 ms
2019-04-14 02:08:29 [miner.cpp:610]MINER: CreateNewBlock tx count: 55887 spent time: 492 ms
2019-04-14 02:08:29 [miner.cpp:516]MINER: CreatePosTx success, used time:170 ms, miner address=wUt89R4bjD3Ca6Vb7mk18oGsVtSTCxJu2q
2019-04-14 02:08:37 [miner.cpp:525]MINER: CheckWork used time:8403 ms
2019-04-14 02:08:37 [miner.cpp:610]MINER: CreateNewBlock tx count: 11787 spent time: 106 ms
2019-04-14 02:08:39 [miner.cpp:516]MINER: CreatePosTx success, used time:144 ms, miner address=wT75mYY9C8xgqVgXquBmEfRmAXPDpJHU62
2019-04-14 02:08:41 [miner.cpp:525]MINER: CheckWork used time:2026 ms
2019-04-14 02:08:41 [miner.cpp:610]MINER: CreateNewBlock tx count: 12242 spent time: 105 ms
2019-04-14 02:08:49 [miner.cpp:516]MINER: CreatePosTx success, used time:39 ms, miner address=wRQwgYkPNe1oX9Ts3cfuQ4KerqiV2e8gqM
2019-04-14 02:08:51 [miner.cpp:525]MINER: CheckWork used time:2357 ms
2019-04-14 02:08:52 [miner.cpp:610]MINER: CreateNewBlock tx count: 55888 spent time: 702 ms
2019-04-14 02:08:59 [miner.cpp:516]MINER: CreatePosTx success, used time:89 ms, miner address=wSjMDgKWHC2MzrUamhJtyyR2FTtw8oMUfx
2019-04-14 02:09:08 [miner.cpp:525]MINER: CheckWork used time:8919 ms
2019-04-14 02:09:08 [miner.cpp:610]MINER: CreateNewBlock tx count: 55887 spent time: 551 ms
2019-04-14 02:09:09 [miner.cpp:516]MINER: CreatePosTx success, used time:173 ms, miner address=wUt89R4bjD3Ca6Vb7mk18oGsVtSTCxJu2q
2019-04-14 02:09:18 [miner.cpp:525]MINER: CheckWork used time:8814 ms

从上述数据可以看到,单个区块最多能够打包将近 55888 个交易,等价于 TPS 峰值 5.5K。另外,当 TPS 接近 5.5 K 时,创建区块花费时间接近 10s,已经接近创建区块所能花费时间的极限。因为 WaykiChain 的出块间隔是 10s,因此创建区块时间必须少于 10s 才能留下时间将新创建的区块广播出去。

相关文章

  1. 硅谷互联网公司的开发流程

    开发流程包括这么几个阶段: OKR 的设立; 主项目及其子项目的确立; 每个子项目的生命周期; 主项目的生命周期; 收尾、维护、复盘。 第一点,OKR 的设立 所有项目的起始,都应该从 Ro

  2. RESTful-表述性状态转移风格

    REST英文全拼:Representational State Transfer 面向资源编程 资源指的就是一类数据 产品表-&gt;就是产品资源 最重要的是如何表示一个资源 地址即

  3. 稳定性思考

    产品功能线 0-1: 当系统从无到有的时候,首要考虑的是研发效率,功能快速迭代,满足快速增长的业务需求 1-10 系统已经搭建起来,此时考虑的是系统的稳定性。 可用性:1.隔离:区分出核心和非核心功能

  4. Supervisor守护队列发邮件

    安装 CentOS: yum -y install supervisor Debien/Ubuntu适用:apt-get install supervisor 配置 修改主配置文件:vim /et

  5. 安装libsodium,让服务器支持chacha20等加密方式

    用chacha20加密方式需要安装libsodium 注意:libsodium从1.0.15开始就废弃了aes-128-ctr yum install wget m2crypto git libsod

随机推荐

  1. 硅谷互联网公司的开发流程

    开发流程包括这么几个阶段: OKR 的设立; 主项目及其子项目的确立; 每个子项目的生命周期; 主项目的生命周期; 收尾、维护、复盘。 第一点,OKR 的设立 所有项目的起始,都应该从 Ro

  2. RESTful-表述性状态转移风格

    REST英文全拼:Representational State Transfer 面向资源编程 资源指的就是一类数据 产品表-&gt;就是产品资源 最重要的是如何表示一个资源 地址即

  3. 稳定性思考

    产品功能线 0-1: 当系统从无到有的时候,首要考虑的是研发效率,功能快速迭代,满足快速增长的业务需求 1-10 系统已经搭建起来,此时考虑的是系统的稳定性。 可用性:1.隔离:区分出核心和非核心功能

  4. Supervisor守护队列发邮件

    安装 CentOS: yum -y install supervisor Debien/Ubuntu适用:apt-get install supervisor 配置 修改主配置文件:vim /et

  5. 安装libsodium,让服务器支持chacha20等加密方式

    用chacha20加密方式需要安装libsodium 注意:libsodium从1.0.15开始就废弃了aes-128-ctr yum install wget m2crypto git libsod