12 KiB
FISCO BCOS TPS压力测试指南
文档版本: v2.0
更新日期: 2026-02-10
适用版本: FISCO BCOS 2.x / 3.x
📋 目录
测试工具介绍
🎯 TPSTest.java
本项目提供的 TPSTest.java 是一个完整的TPS压测工具,具有以下特性:
核心功能:
- ✅ 自动连接FISCO BCOS节点
- ✅ 使用 ParallelTransfer 合约进行并行转账测试
- ✅ 支持多线程并发压测
- ✅ 实时监控TPS、成功率
- ✅ 自动生成详细测试报告
- ✅ 支持QPS限流控制
测试原理:
多线程并发 → 发送转账交易 → 统计响应时间 → 计算TPS和延迟
文件位置:
src/main/java/com/org/fisco/TPSTest.java
快速开始
前提条件
-
合约已部署
- 合约地址:在代码第284行设置
- 默认使用:
0x06ac2fe406f1ae06494946ee281d58f1c79c39e4
-
账户已初始化
- 使用
fisco/console/init_accounts.sh脚本初始化账户余额 - 或手动在控制台初始化至少100个账户
- 使用
-
SDK配置正确
- 配置文件:
src/main/resources/config.toml - 确保能连接到你的链节点
- 配置文件:
5分钟快速测试
cd /Users/kiro/IdeaProjects/contract
# 1. 编译项目
./gradlew build
# 2. 直接运行测试
./gradlew run
测试会自动:
- 连接到链节点
- 初始化合约对象
- 生成测试账户
- 开始压测
- 输出测试报告
测试参数配置
🔧 核心参数说明
在 TPSTest.java 的 main 方法中(第277-281行)配置:
tester.setTestParams(
threadCount, // 并发线程数
totalTransactions, // 总交易数
qpsLimit // QPS限制(0表示不限制)
);
参数详解
1. 并发线程数 (threadCount)
作用: 控制同时发送交易的线程数量
推荐值:
| 测试场景 | 推荐值 | 说明 |
|---|---|---|
| 基准测试 | 1 | 测试单笔交易延迟 |
| 初步压测 | 50-100 | 找到基本TPS水平 |
| 寻找峰值 | 100-200 | 逐步增加找峰值 |
| 极限压测 | 200-500 | 测试系统极限 |
⚠️ 注意:
- 并发数过高会导致成功率下降
- 并发数过低无法达到TPS峰值
- 建议从小到大逐步测试
2. 总交易数 (totalTransactions)
作用: 本次测试发送的交易总数
推荐值:
| 测试类型 | 推荐值 | 测试时长(估算) |
|---|---|---|
| 快速验证 | 1,000 | 1-5秒 |
| 基础测试 | 10,000 | 10-30秒 |
| 标准测试 | 50,000 | 1-2分钟 |
| 长期测试 | 100,000+ | 5分钟以上 |
原则:
- ✅ 测试时长至少30秒以上才准确
- ✅ 交易数太少会受启动开销影响
- ✅ 交易数太多会耗时过长
3. QPS限制 (qpsLimit)
作用: 限制每秒发送的交易数
设置建议:
0:不限制,全力压测(推荐)5000:温和测试,适合生产环境验证10000+:根据节点能力设置上限
运行测试
方法1:使用默认参数运行
cd /Users/kiro/IdeaProjects/contract
./gradlew run
方法2:修改参数后运行
编辑 src/main/java/com/org/fisco/TPSTest.java:
// 第277-281行
tester.setTestParams(
100, // 改为你想要的并发数
10000, // 改为你想要的交易总数
0 // 0表示不限速
);
然后运行:
./gradlew build && ./gradlew run
观察实时输出
测试运行时会显示:
========================================
FISCO BCOS TPS压力测试工具
========================================
连接FISCO BCOS节点成功
当前区块高度: 12345
使用已部署的合约地址: 0x06ac...
合约对象初始化完成
生成测试账户列表...
已生成 100 个测试账户
账户列表生成完成,账户余额已通过 init_accounts.sh 脚本初始化
[3/3] 开始压力测试...
测试配置:
- 并发线程数: 100
- 总交易数: 10000
- QPS限制: 无限制
- 预热交易数: 100
正在预热 (100 笔交易)...
预热完成!
开始正式压测...
实时TPS监控 (每5秒更新):
当前进度: 2145/10000 | 实时TPS: 675.64 | 成功率: 99.87%
当前进度: 4523/10000 | 实时TPS: 682.31 | 成功率: 99.91%
...
结果分析
📊 测试报告解读
测试完成后会自动生成报告(同时保存到文件):
========================================
FISCO BCOS TPS测试报告
========================================
测试配置:
开始时间: 2026-02-10 15:30:00
结束时间: 2026-02-10 15:32:15
测试时长: 135.45 秒
并发线程数: 100
QPS限制: 无限制
交易统计:
总交易数: 10000
成功交易: 9987
失败交易: 13
成功率: 99.87%
性能指标:
★ TPS (每秒交易数): 675.64
平均延迟: 148.23 ms
中位数延迟: 125 ms
P95延迟: 287 ms
P99延迟: 456 ms
报告时间: 2026-02-10 15:32:15
========================================
📈 核心指标说明
1. TPS(每秒交易数)
含义: 每秒成功处理的交易数量
评判标准:
| TPS范围 | 评价 | 说明 |
|---|---|---|
| > 1000 | 优秀 ✅ | 性能良好 |
| 500-1000 | 良好 👍 | 基本满足需求 |
| 100-500 | 一般 ⚠️ | 需要优化 |
| < 100 | 较差 ❌ | 存在严重问题 |
影响因素:
- 节点配置(CPU、内存、磁盘)
- 网络延迟
- 并发线程数
- 节点 config.ini 配置
2. 成功率
含义: 成功交易数 / 总交易数
评判标准:
- ✅ ≥ 99%:健康状态
- ⚠️ 95-99%:压力过大,需降低并发
- ❌ < 95%:存在严重问题
低成功率原因:
- 并发数设置过高
- 交易池容量不足
- 节点资源不足
- 账户余额不足
3. 延迟指标
平均延迟: 所有交易的平均响应时间 P95延迟: 95%的交易在此时间内完成 P99延迟: 99%的交易在此时间内完成
评判标准:
| 指标 | 优秀 | 良好 | 一般 | 需优化 |
|---|---|---|---|---|
| 平均延迟 | <100ms | 100-300ms | 300-500ms | >500ms |
| P99延迟 | <500ms | 500-1000ms | 1-2s | >2s |
常见问题排查
❌ 问题1:TPS很低(<100)
可能原因及解决方案:
-
网络延迟过高
# 测试网络延迟 ping -c 10 121.196.226.157- 延迟 > 100ms:考虑在云服务器上直接运行测试
- 延迟 > 50ms:TPS会受明显影响
-
节点配置未优化
SSH到云服务器检查
config.ini:cd ~/fisco/nodes/*/node0 cat config.ini | grep -A 3 "\[tx_execute\]" cat config.ini | grep -A 3 "\[consensus\]"确认配置:
[tx_execute] enable_parallel=true # 必须为true [consensus] max_trans_num_per_block=1000 # 建议≥1000 -
日志级别过低
[log] level=error # 改为error减少IO开销
❌ 问题2:成功率低(<99%)
排查步骤:
-
检查错误日志
测试运行时会输出错误信息:
交易失败 - Status: 18, Message: ... 交易异常: ContractException - ... -
降低并发数
如果成功率 < 99%,说明并发过高:
// 从当前并发数降低50% tester.setTestParams( 50, // 从100降到50 10000, 0 ); -
检查账户余额
cd fisco/console bash start.sh # 在控制台执行 call ParallelTransfer 0x06ac... balanceOf "user_000000"
❌ 问题3:程序运行时资源耗尽
现象: 出现大量线程创建失败错误
原因: 之前的bug(每笔交易创建新合约对象)已修复
确认修复: 检查代码第29行是否有:
private ParallelTransfer contract; // 复用合约对象
❌ 问题4:程序一直不退出
原因: SDK后台线程持续运行
解决: 已在代码第318行添加:
System.exit(0);
如果仍然卡住,按 Ctrl+C 强制终止。
性能优化建议
🎯 找到准确TPS的方法
错误做法 ❌:
- 用最高并发数跑一次就认为是TPS
- 忽略成功率指标
- 测试时间过短(<10秒)
正确做法 ✅:
阶段1:基准测试
tester.setTestParams(1, 100, 0); // 单线程
记录:平均延迟 = X ms
阶段2:二分法找最佳并发
逐步测试,找到成功率≥99%的最大并发数:
| 轮次 | 并发数 | 交易数 | 观察 |
|---|---|---|---|
| 测试1 | 50 | 5000 | 成功率≥99%? |
| 测试2 | 100 | 5000 | 成功率≥99%? |
| 测试3 | 200 | 5000 | 成功率≥99%? |
| 测试4 | 400 | 5000 | 成功率<99%则停止 |
结论: 成功率≥99%的最大并发数 = 最佳并发数
阶段3:峰值测试
tester.setTestParams(
[最佳并发数], // 从阶段2得到
50000, // 大批量测试
0
);
这就是你链的真实TPS!
🔧 节点优化Checklist
云服务器配置
SSH到服务器,编辑 config.ini:
[tx_execute]
enable_parallel=true # ✅ 开启并行
[consensus]
max_trans_num_per_block=1000 # ✅ 每块至少1000笔
[tx_pool]
limit=150000 # ✅ 交易池容量
[log]
level=error # ✅ 降低日志级别
重启节点:
cd ~/fisco/nodes/*/
bash stop_all.sh
bash start_all.sh
系统优化
# 增加文件描述符
ulimit -n 65535
# 检查磁盘类型(必须是SSD)
lsblk -d -o name,rota
# rota=0 表示SSD
📊 并发数与TPS的关系
理论公式:
TPS = 并发数 / 平均延迟(秒)
示例:
- 平均延迟 = 100ms = 0.1秒
- 并发数 = 100
- 理论TPS = 100 / 0.1 = 1000
实际调优:
| 并发数 | TPS | 成功率 | 决策 |
|---|---|---|---|
| 50 | 400 | 100% | ⬆️ 继续增加 |
| 100 | 700 | 99.8% | ⬆️ 可以继续 |
| 200 | 850 | 99.2% | ⬆️ 接近最佳 |
| 400 | 870 | 97% | ❌ 过高,回退 |
最佳并发数 = 200
测试结果记录模板
建议每次测试记录:
测试日期: 2026-02-10
测试轮次: 第X次
测试参数:
- 并发线程数:
- 总交易数:
- QPS限制:
测试环境:
- 节点数量: 4个
- 网络延迟: XXms
- enable_parallel: true/false
- max_trans_num_per_block: XXX
测试结果:
- TPS:
- 成功率:
- 平均延迟:
- P99延迟:
问题记录:
优化措施:
下次改进:
快速参考
常用命令
# 编译运行测试
cd /Users/kiro/IdeaProjects/contract
./gradlew build && ./gradlew run
# 查看最近的测试报告
ls -lt tps_test_report_*.txt | head -5
cat tps_test_report_*.txt
# 测试网络延迟
ping -c 10 121.196.226.157
# 检查节点配置(SSH到服务器)
ssh root@121.196.226.157
cd ~/fisco/nodes/*/node0
cat config.ini | grep -E "enable_parallel|max_trans_num_per_block|limit|level"
推荐测试流程
# 1. 基准测试(修改代码为1线程100笔)
./gradlew run
# 2. 初步压测(修改代码为100线程10000笔)
./gradlew run
# 3. 根据成功率调整并发数
# 成功率≥99% → 增加并发
# 成功率<99% → 减少并发
# 4. 峰值测试(用最佳并发数跑50000笔)
./gradlew run
常见TPS参考值
| 区块链 | 单链TPS | 备注 |
|---|---|---|
| FISCO BCOS v2.x | 500-2000 | enable_parallel=true |
| FISCO BCOS v3.x | 2000-5000 | 性能优化版 |
| Hyperledger Fabric | 1000-3000 | 企业级联盟链 |
| 以太坊 | 15-30 | 公链 |
你的目标: 根据节点配置,达到 500-1000 TPS 即为良好水平。
总结
✅ 正确的测试姿势
- 从小到大测试:1线程 → 50线程 → 100线程 → 200线程
- 关注成功率:必须≥99%,否则降低并发
- 测试足够久:至少30秒以上
- 记录每次结果:对比优化前后差异
⚠️ 常见误区
- ❌ 用最高并发测出来的数字就是TPS
- ❌ 忽略成功率指标
- ❌ 测试时间太短
- ❌ 不检查节点配置
- ❌ 网络延迟过高还在本地测试
🎯 核心原则
准确的TPS = 在成功率≥99%的前提下,能持续达到的最高TPS
祝测试顺利! 🚀
有问题请查看"常见问题排查"章节,或检查测试报告中的错误信息。