WaykiChain-TPS-性能测试
测试方法
简介
- 节点程序版本
- 仓库:
https://github.com/WaykiChain/WaykiChain
- 分支:
master
- Commit ID:
3663de7a10a277a84831d5c1e076305f46825b1c
- 编译选项:Release 版本
- 节点程序运行环境 节点程序运行在阿里云 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
测试基于 regtest 网络
测试原理
- 节点运行在 regtest 网络,并导入 11 个记账账户私钥
- 通过 startcommontpstest rpc 触发 TPS 性能测试
- 由一个专门构造普通转账交易的线程不停地生成交易并放入队列,由另外一个线程从队列取出交易并添加到内存池
- 矿工线程从内存池取出交易打包,完成出块
- 测试结果
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 才能留下时间将新创建的区块广播出去。
相关文章
- 硅谷互联网公司的开发流程
开发流程包括这么几个阶段: OKR 的设立; 主项目及其子项目的确立; 每个子项目的生命周期; 主项目的生命周期; 收尾、维护、复盘。 第一点,OKR 的设立 所有项目的起始,都应该从 Ro
- RESTful-表述性状态转移风格
REST英文全拼:Representational State Transfer 面向资源编程 资源指的就是一类数据 产品表->就是产品资源 最重要的是如何表示一个资源 地址即
- 稳定性思考
产品功能线 0-1: 当系统从无到有的时候,首要考虑的是研发效率,功能快速迭代,满足快速增长的业务需求 1-10 系统已经搭建起来,此时考虑的是系统的稳定性。 可用性:1.隔离:区分出核心和非核心功能
- Supervisor守护队列发邮件
安装 CentOS: yum -y install supervisor Debien/Ubuntu适用:apt-get install supervisor 配置 修改主配置文件:vim /et
- 安装libsodium,让服务器支持chacha20等加密方式
用chacha20加密方式需要安装libsodium 注意:libsodium从1.0.15开始就废弃了aes-128-ctr yum install wget m2crypto git libsod
随机推荐
- 硅谷互联网公司的开发流程
开发流程包括这么几个阶段: OKR 的设立; 主项目及其子项目的确立; 每个子项目的生命周期; 主项目的生命周期; 收尾、维护、复盘。 第一点,OKR 的设立 所有项目的起始,都应该从 Ro
- RESTful-表述性状态转移风格
REST英文全拼:Representational State Transfer 面向资源编程 资源指的就是一类数据 产品表->就是产品资源 最重要的是如何表示一个资源 地址即
- 稳定性思考
产品功能线 0-1: 当系统从无到有的时候,首要考虑的是研发效率,功能快速迭代,满足快速增长的业务需求 1-10 系统已经搭建起来,此时考虑的是系统的稳定性。 可用性:1.隔离:区分出核心和非核心功能
- Supervisor守护队列发邮件
安装 CentOS: yum -y install supervisor Debien/Ubuntu适用:apt-get install supervisor 配置 修改主配置文件:vim /et
- 安装libsodium,让服务器支持chacha20等加密方式
用chacha20加密方式需要安装libsodium 注意:libsodium从1.0.15开始就废弃了aes-128-ctr yum install wget m2crypto git libsod