Skip to content

Latest commit

 

History

History
340 lines (237 loc) · 12.4 KB

File metadata and controls

340 lines (237 loc) · 12.4 KB

benchmarking

PlatON vs EOS性能对比测试说明。

准备

服务器

本次测试采用AWS的c5d.4xlarge服务器,Intel(R) Xeon(R) 8124M 16核 3.0GHz,32G内存,300G SSD硬盘。

数量:30台

系统:Ubuntu 18.04.4 LTS

依赖软件

除PlatON和EOS官方要求的常规软件(如git、gcc等)外,本次测试需要安装以下软件:

  1. ansible(2.9.12+,只需在主控节点安装)
  2. nginx(1.14.0,作为PlatON二进制包的下载仓库,只需在主控节点安装)
  3. supervisor(3.3.1,每台部署节点都需要安装,可参考supervisor章节通过ansible脚本批量安装)
  4. jq (jq-1.5-1+)
  5. curl(7.58.0+)

配置集群

  1. scripts 目录下的ansible目录拷贝到主控节点(可以任意指定)的/etc/ansible下,该目录需要赋值相应的用户权限及可执行权限
  2. 编辑 /etc/ansible/inventories/hosts 文件,添加集群信息,如:
[node_mnsh]
18.138.238.82   node-001
...

[producer]
18.138.238.82
...

[generator]
18.141.217.208
...

配置 ansible 密码登录

  1. 主控主机通过ansible脚本向集群机器发送执行命令,需要提前在脚本中配置集群机器的登录信息。注意,目前需要所有集群机器的账户密码保持一致

    编辑 /etc/ansible/inventories/group_vars/all.yml 文件,添加登录信息

ansible_home: /etc/ansible
timezone: UTC
ansible_ssh_user: pchuant		# ssh登录名
ansible_ssh_pass: 123456		# ssh登录密码
ansible_ssh_port: 22
ansible_sudo_pass: 123456		# sudo执行密码
repo_url: http://47.241.16.204	# 主控机器IP信息
app_env: test
app_user: pchuant				# 登录名,需要和ssh登录名保持一致
app_bin_home: /usr/bin
app_home: /opt
log_home: /logbak
log_rotate_number: 20
  1. 登录信息配置好后,初始化系统
# 初始化系统
$ ansible-playbook /etc/ansible/playbooks/common/init.yml
# 测试ansible 密码登录是否配置成功,注意:命令中的[node_mnsh]需要修改为配置的集群名称
$ ansible node_mnsh -m ping

PlatON

部署集群节点

  1. 源码安装PlatON

    本次测试PlatON的代码分支为develop,commitid: aeeca8337208a2c8f7ea418e36b94674beb10db5

    源码编译安装可参考PlatON开发者文档

  2. 发布PlatON

    使用 nginx 作为源仓库,存放platon二进制包

# 配置nginx资源下载转发规则
$ sudo vim /etc/nginx/conf.d/localhost.conf
server {
    listen  80;
    server_name  localhost;
    location /codes {
        alias /opt/codes;
    }
}
$ sudo sed -i '/sites-enabled/ s/^/#/g'  /etc/nginx/nginx.conf 
$ sudo systemctl reload nginx
# 新建包存放目录,20200907为当天日期,可自行修改
$ mkdir -p /opt/codes/test/servers/20200907
# 为/opt 目录赋用户权限,注意:命令中的[pchuant]需要自行修改
$ sudo chown -R pchuant:pchuant /opt
# 将platon重命名platon_1,然后压缩为platon_1.bz2
$ cd /opt/codes/test/servers/20200907
$ bzip2 platon_1
# 下发platon执行文件到各部署节点,并创建软链接/usr/bin/platon,注意:命令中的[node_mnsh]需要修改为配置的集群名称
$ ansible-playbook /etc/ansible/playbooks/platon/deploy_binary.yml
Which host or group would you like to assign [Default: empty]: node_mnsh
Which version would you like to deploy [Default: empty]: 20200907-1
  1. 生成并下发节点公私钥,并创建genesis.json
# 生成公私钥之前,需要先编辑 `/etc/ansible/files/keys/hosts` 文件,添加集群主机信息
# 在 `/etc/ansible/files/keys` 目录下执行脚本
$ ./nodekey.sh getkey

​ 该命令分别在/etc/ansible/files/keys/addr/etc/ansible/files/keys/bls目录中生成集群节点的公私钥和bls公私钥,再根据模板生成创世区块文件(替换初始共识节点列表,这一步可参考部署私有测试网),将生成的 genesis.json 文件上传到 /etc/ansible/files/platon 目录

  1. 添加代表组的变量文件,包括PlatON启动参数,种子节点等

    编辑 /etc/ansible/inventories/group_vars/node_mnsh.yml 文件,注意:node_mnsh.yml文件名需要修改为配置的集群名称,文件中的 “--bootnodes” 必须修改,其他启动参数可根据压测需求自行调整

node_name: platon
node_home: "{{ app_home }}/platon"
node_log_home: "{{ log_home }}/platon"
node_chars: db,debug,platon,net,web3,admin,personal,txpool,txgen
node_bin: "{{ app_bin_home }}/platon"
node_bin_home: "{{ app_bin_home }}"
node_port: 16791
node_rpc_addr: 0.0.0.0
node_rpc_port: 6691
ws_option: --ws --wsaddr 0.0.0.0 --wsport 6791 --wsorigins "*" --wsapi 
node_exec: http://127.0.0.1:6691 -exec platon.blockNumber
node_common_args: --identity platon-{{ inventory_hostname }} {{ node_env_args }} --debug --verbosity 2 --datadir ./data --port {{ node_port }} --rpcaddr {{ node_rpc_addr }} --rpcport {{ node_rpc_port }} --rpc --rpcapi {{ node_chars }}  {{ ws_option }} {{ node_chars }} --nodekey nodekey.txt --cbft.blskey nodeblskey.txt
node_env_args: --bootnodes enode://1eb4c4ddf915ddcc69f7486abee418df54f808afc9bd1143e09bbadb12fc508c56faac8e3ad2a370a226e364eb4183a1095fc9c24e99b9acaa277a9731fc80e8@18.138.238.82:16791
node_extra_args:  --syncmode fast --pprof --txpool.globaltxcount 1300 --txpool.lifetime 180s --txpool.accountslots 500 --txpool.globalslots 40000 --ipcdisable --cache.triedb 1024 --txpool.nolocals --txpool.globalqueue 12000 --txpool.accountqueue 200 --txpool.cacheSize 200
  1. 下发 supervisor 配置文件
# 安装supervisor服务,注意:命令中的[node_mnsh]需要修改为配置的集群名称
$ ansible-playbook /etc/ansible/playbooks/supervisor/install.yml
Which host or group would you like to assign [Default: empty]: node_mnsh
# 下发使用supervisor启动platon的配置文件,注意:命令中的[node_mnsh]需要修改为配置的集群名称
$ ansible-playbook /etc/ansible/playbooks/supervisor/platon.yml
Which host or group would you like to assign [Default: empty]: node_mnsh
# Supervisor 启动,修改过配置文件,则用reload替换start
# 注意:命令中的[node_mnsh]需要修改为配置的集群名称
$ ansible node_mnsh -shell node -a "supervisorctl reload"
  1. 部署集群
# 注意:命令中的[node_mnsh]需要修改为配置的集群名称
$ ansible-playbook /etc/ansible/playbooks/platon/deploy.yml
Which host or group would you like to assign [Default: empty]: node_mnsh
Which node name would you like to deploy [Default: empty]: platon
  1. 清除集群
# 注意:命令中的[node_mnsh]需要修改为配置的集群名称
$ ansible-playbook /etc/ansible/playbooks/platon/clean.yml
Which host or group would you like to assign [Default: empty]: node_mnsh
Which node name would you like to clean [Default: empty]: platon

启动压测

  1. 部署压测脚本

    从集群中选择1~3个节点作为压测插件节点(建议选择非共识节点),登陆节点所在主机,将压测脚本private_keys.json 上传到用户目录下,比如 /home/pchuant/private_keys.json

  2. 执行压测命令

curl -H "Content-Type: application/json"   -X POST --data '{"jsonrpc":"2.0","method":"txgen_start","params":[1,0,0,500,0,100,0,1,"/home/pchuant/private_keys.json",1,5000,15],"id":1}' http://localhost:6691

说明: 前三个参数表示转账、evm合约、wasm合约交易类型,1 开启,0 不开启; 第四个参数表示单位时间内发送交易总数; 第五个参数表示活跃账户发送交易的总数,一般为小于第四个参数值; 第六个参数表示每100毫秒触发一次发送交易命令; 其余命令请参考插件使用说明文档

EOS

代码分支

本次测试EOS的代码分支为master,commitid:0d87dff8bee56179aa01472dd00a089b2aa7b9fa

编译和安装

  1. clone代码

    本步骤请按官方指导完成,参考

  2. 替换插件文件

    请将plugin/eosio/txn_test_gen_plugin.cpp覆盖到eos/plugins/txn_test_gen_plugin

  3. build&&install

    安装官网指导,完成eos的编译和安装,EOS默认安装在~/eosio/2.0, 以下操作中以此目录为默认路径,如果指定了其他路径请自行调整。

  4. 将安装好的EOS2.0同步到集群所有节点

    对于集群内的节点,可以在其中一台主机上编译并安装, 安装完成后将~/eosio/2.0和本仓库的scripts\eosio\bin目录打包压缩,然后通过scp分发到集群内的其他节点,可以通过ansible对集群内的所有节点进行解压:

ansible 集群名 -m shell -a "tar -zxvf ~/eosio.tar.gz -C ~"
  1. 添加环境变量

    为操作方便,可以将~/eosio/2.0/bin添加到系统PATH 编辑~/.bashrc

export EOSHOME=$HOME/eosio
export PATH=$PATH:$EOSHOME/2.0/bin

​ 然后执行以下命令使环境变量生效

source ~/.bashrc

注:以上步骤需要在所有集群内节点执行

部署

  1. 生成hostsinfo

    编辑/etc/ansible/files/keys/config/hosts文件,添加需要部署EOS节点的IP(注意第一个IP将被默认设置未天使节点,即eosio节点),然后执行脚本:

./genhostsinfo.sh

脚本中使用了默认的eosio公私钥,如果不想用默认值,请修改脚本替换

​ 执行完成后,将在当前路径生成hostsinfo文件。

  1. 分发配置文件到集群

    在确保已经执行上述初始化环境步骤(主要是ansible配置scp免密)后,执行以下脚本:

./updatecfg.sh

​ 脚本将自动分发配置文件到各主机上

  1. 创建钱包

    执行以下命令:

cleos wallet create -n bench --to-console

注:成功后输出密码,注意保存。 -n 后是钱包名,自己取。

  1. 编辑unlock.sh

    将上述步骤创建的钱包名及密码更新到$HOME/eosio/bin/unlock.sh脚本中。

  2. 在天使节点上初始化

    初始化的步骤很简单,只需要在天使节点的$HOME/eosio/bin目录下执行:

 ./init.sh

启动集群

​ 执行以下命令:

ansible-playbook /etc/ansible/playbooks/eosio/start_producer.yml

​ 提示输入需要启动producer(超级节点)的集群 ​ 完成后,执行以下命令以启动generator集群

ansible-playbook /etc/ansible/playbooks/eosio/start_generator.yml

启动压测

  1. 创建测试账户

    由于generator启动后需要加载独立的测试账户,在generator节点中需要执行以下命令以生成测试账户:

$HOME/eosio/bin/creategenAccount.sh
  1. 质押和委托

    节点注册producer和vote都需要私钥签名交易,所以在执行脚本前请手动将各个节点producer的私钥导入天使节点的钱包(bench)

cleos wallet import -n single --private-key  producer的私钥

​ 导入成功后,在天使节点执行以下命令使超级节点(producer)成为共识节点

$HOME/eosio/bin/systeminit.sh
  1. 准备合约

    本次压测所需要的合约在/benchmarking/contracts/eosio/eosio.contracts,如果需要修改合约内容,请按官方指导对合约重新进行编译。 在进行压测前,需要将待测合约的编译好(需有.abi文件和.wasm文件),本例中将合约放到~/eosio//home/jht/eosio/eosio.contracts,如果不使用此路径,需要自己修改/etc/ansible/files/keys/config/generator.ini,将txn-test-gen-is-abiserializertxn-test-gen-token-abiserializer做适应修改。

    特别注意,天使节点(即第一个节点)必须用源码的方式编译eos和contracts,否则链初始化时会报找不到合约内容的错。

  2. 启动压测

    在generator节点中执行以下命令:

curl --data-binary '["", 0, 20, 20]' http://127.0.0.1:6666/v1/txn_test_gen/start_generation

说明:第一个参数为salt可以填空, 第二个参数是交易类型, 0为普通转账,2为KV合约压测,第三个参数为时间间隔,单位是毫秒,第四个参数是每个线程在单位间隔内产生交易的数量,上例中的效果为:每20ms每个线程产生20笔转账交易,线程数在$HOME/eosio/config/generator.ini中配置