{"content":{"title":"以太坊兼容链性能测试3—开展测试","body":"## 项目简介\r\n\r\n项目地址：https://github.com/sunchengzhu/eth-jmeter\r\n\r\n相关文章：[以太坊兼容链性能测试1—准备工作](https://learnblockchain.cn/article/6390)、[以太坊兼容链性能测试2—性能数据统计](https://learnblockchain.cn/article/6391)\r\n\r\n### 功能\r\n\r\n1. 使用jmeter开展rpc接口的压测，包含`eth_getBalance`、`eth_getBlockByNumber`、`eth_call`、`eth_sendRawTransaction`，其他接口有需要可以根据现有的代码改造。\r\n1. 根据助记词生成指定数量的账户循环发送交易和查询余额，用[jmeter的Concurrency Thread Group插件](https://jmeter-plugins.org/wiki/ConcurrencyThreadGroup/)控制测试时间和线程数。\r\n\r\n### 设计\r\n\r\n通过两个workflow开展压测，[query.yml](https://github.com/sunchengzhu/eth-jmeter/blob/main/.github/workflows/query.yml)是非交易接口`eth_getBalance`、`eth_getBlockByNumber`、`eth_call`的压测，而[tx.yml](https://github.com/sunchengzhu/eth-jmeter/blob/main/.github/workflows/tx.yml)则是原生转账和调用uniswap `swapExactTokensForETH`的交易接口`eth_sendRawTransaction`两个场景的压测。tx.yml会多一步触发[eth_performace的ethStats.yml](https://github.com/sunchengzhu/eth-performance/blob/main/.github/workflows/ethStats.yml)，统计交易性能数据。\r\n\r\n#### 查询\r\n\r\nquery.yml的接口是实时返回的，可以直接在客户端这边统计性能数据，我设置了[5s秒打印一次summary](https://github.com/sunchengzhu/eth-jmeter/blob/af87f984ddc3b43f3b70e1978731a2af9f959573/pom.xml#L68)，summary数据格式如下：\r\n\r\n```\r\n[INFO] summary +   4099 in 00:00:06 =  683.9/s Avg:   176 Min:   160 Max:   498 Err:     0 (0.00%) Active: 120 Started: 120 Finished: 0 \r\n```\r\n\r\nquery.yml如果有error能直接在控制台打印出来，并体现在summary的Err数中：\r\n\r\n<img src=\"https://typora-1304641378.cos.ap-shanghai.myqcloud.com/images/image-20230816215300025.png\" alt=\"image-20230816215300025\" style=\"zoom:80%;\" />  \r\n\r\n#### 交易\r\n\r\n交易从同一助记词生成的一批账户发起（账户充值见前面的文章），账户数量通过下方的size配置，从第一个账户到最后一个账户按序签名并发送交易，在jmeter设置的执行时间内不断循环这个过程。\r\n\r\n<img src=\"https://typora-1304641378.cos.ap-shanghai.myqcloud.com/images/image-20231107172145909.png\" alt=\"image-20231107172145909\" style=\"zoom:80%;\" />\r\n\r\n助记词的具体值mnemonicValue在Run workflow时由用户自己传入，以保护其不被泄漏。gasPriceValue等则配置在tx.yml中，[不同环境设置其相应的值](https://github.com/sunchengzhu/eth-jmeter/blob/2661ab7c8b90256bfb9e469db1de3323ccc8a865/.github/workflows/tx.yml#L48-L53)。\r\n\r\n![image-20231107173931633](https://typora-1304641378.cos.ap-shanghai.myqcloud.com/images/image-20231107173931633.png)\r\n\r\n\r\n\r\n## 使用tx.yml\r\n\r\n1. fork到自己的仓库（需要fork项目到自己的仓库以使用Actions）\r\n\r\n2. 设置GitHub个人访问令牌，跟[性能数据统计](https://learnblockchain.cn/article/6391)中的步骤一样，这里不再赘述。\r\n\r\n3. tx.yml新增fantom_testnet环境使用[准备工作](https://learnblockchain.cn/article/6390)中得到的数据，这边[已经配置完了](https://github.com/sunchengzhu/eth-jmeter/blob/af87f984ddc3b43f3b70e1978731a2af9f959573/.github/workflows/tx.yml#L48-L53)。\r\n\r\n4. 选择fantom_testnet环境，输入助记词`strike gather blush lens excite ridge flock random empty remember text universe`（这个助记词的账户有钱）和你自己的Gist ID触发workflow\r\n\r\n5. 可以在eth-performance的ethStats中看到交易性能数据\r\n\r\n6. 以上用了默认的jmeter线程配置，可以再建一个test分支，通过`mvn jmeter:gui`加载并修改jmx文件不断调整线程数，达到链的性能瓶颈。\r\n\r\n   <img src=\"https://typora-1304641378.cos.ap-shanghai.myqcloud.com/images/image-20230816221940890.png\" alt=\"image-20230816221940890\" style=\"zoom:80%;\" />  \r\n\r\n   \r\n\r\n## 使用query.yml\r\n\r\n1. tx.yml新增fantom_testnet环境使用准备工作中得到的数据，这边[已经配置完了](https://github.com/sunchengzhu/eth-jmeter/blob/af87f984ddc3b43f3b70e1978731a2af9f959573/.github/workflows/query.yml#L46-L48)。\r\n2. 选择fantom_testnet环境，只有getBalance.jmx需要用到助记词，别的不需要直接点Run workflow就行。"},"author":{"user":"https://learnblockchain.cn/people/5160","address":null},"history":"QmPjkaQ8mAfcrMGM381QewoisrGsshGoSWw44Dxtwwwgwo","timestamp":1699350504,"version":1}