tps test
This commit is contained in:
607
doc/FISCO_BCOS_TPS测试指南.md
Normal file
607
doc/FISCO_BCOS_TPS测试指南.md
Normal file
@@ -0,0 +1,607 @@
|
||||
# FISCO BCOS TPS压力测试指南
|
||||
|
||||
> **文档版本**: v2.0
|
||||
> **更新日期**: 2026-02-10
|
||||
> **适用版本**: FISCO BCOS 2.x / 3.x
|
||||
|
||||
---
|
||||
|
||||
## 📋 目录
|
||||
|
||||
1. [测试工具介绍](#测试工具介绍)
|
||||
2. [快速开始](#快速开始)
|
||||
3. [测试参数配置](#测试参数配置)
|
||||
4. [运行测试](#运行测试)
|
||||
5. [结果分析](#结果分析)
|
||||
6. [常见问题排查](#常见问题排查)
|
||||
7. [性能优化建议](#性能优化建议)
|
||||
|
||||
---
|
||||
|
||||
## 测试工具介绍
|
||||
|
||||
### 🎯 TPSTest.java
|
||||
|
||||
本项目提供的 `TPSTest.java` 是一个完整的TPS压测工具,具有以下特性:
|
||||
|
||||
**核心功能:**
|
||||
- ✅ 自动连接FISCO BCOS节点
|
||||
- ✅ 使用 ParallelTransfer 合约进行并行转账测试
|
||||
- ✅ 支持多线程并发压测
|
||||
- ✅ 实时监控TPS、成功率
|
||||
- ✅ 自动生成详细测试报告
|
||||
- ✅ 支持QPS限流控制
|
||||
|
||||
**测试原理:**
|
||||
```
|
||||
多线程并发 → 发送转账交易 → 统计响应时间 → 计算TPS和延迟
|
||||
```
|
||||
|
||||
**文件位置:**
|
||||
```
|
||||
src/main/java/com/org/fisco/TPSTest.java
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 前提条件
|
||||
|
||||
1. **合约已部署**
|
||||
- 合约地址:在代码第284行设置
|
||||
- 默认使用:`0x06ac2fe406f1ae06494946ee281d58f1c79c39e4`
|
||||
|
||||
2. **账户已初始化**
|
||||
- 使用 `fisco/console/init_accounts.sh` 脚本初始化账户余额
|
||||
- 或手动在控制台初始化至少100个账户
|
||||
|
||||
3. **SDK配置正确**
|
||||
- 配置文件:`src/main/resources/config.toml`
|
||||
- 确保能连接到你的链节点
|
||||
|
||||
### 5分钟快速测试
|
||||
|
||||
```bash
|
||||
cd /Users/kiro/IdeaProjects/contract
|
||||
|
||||
# 1. 编译项目
|
||||
./gradlew build
|
||||
|
||||
# 2. 直接运行测试
|
||||
./gradlew run
|
||||
```
|
||||
|
||||
测试会自动:
|
||||
1. 连接到链节点
|
||||
2. 初始化合约对象
|
||||
3. 生成测试账户
|
||||
4. 开始压测
|
||||
5. 输出测试报告
|
||||
|
||||
---
|
||||
|
||||
## 测试参数配置
|
||||
|
||||
### 🔧 核心参数说明
|
||||
|
||||
在 `TPSTest.java` 的 `main` 方法中(第277-281行)配置:
|
||||
|
||||
```java
|
||||
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:使用默认参数运行
|
||||
|
||||
```bash
|
||||
cd /Users/kiro/IdeaProjects/contract
|
||||
./gradlew run
|
||||
```
|
||||
|
||||
### 方法2:修改参数后运行
|
||||
|
||||
编辑 `src/main/java/com/org/fisco/TPSTest.java`:
|
||||
|
||||
```java
|
||||
// 第277-281行
|
||||
tester.setTestParams(
|
||||
100, // 改为你想要的并发数
|
||||
10000, // 改为你想要的交易总数
|
||||
0 // 0表示不限速
|
||||
);
|
||||
```
|
||||
|
||||
然后运行:
|
||||
```bash
|
||||
./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)
|
||||
|
||||
**可能原因及解决方案:**
|
||||
|
||||
1. **网络延迟过高**
|
||||
```bash
|
||||
# 测试网络延迟
|
||||
ping -c 10 121.196.226.157
|
||||
```
|
||||
- 延迟 > 100ms:考虑在云服务器上直接运行测试
|
||||
- 延迟 > 50ms:TPS会受明显影响
|
||||
|
||||
2. **节点配置未优化**
|
||||
|
||||
SSH到云服务器检查 `config.ini`:
|
||||
```bash
|
||||
cd ~/fisco/nodes/*/node0
|
||||
cat config.ini | grep -A 3 "\[tx_execute\]"
|
||||
cat config.ini | grep -A 3 "\[consensus\]"
|
||||
```
|
||||
|
||||
确认配置:
|
||||
```ini
|
||||
[tx_execute]
|
||||
enable_parallel=true # 必须为true
|
||||
|
||||
[consensus]
|
||||
max_trans_num_per_block=1000 # 建议≥1000
|
||||
```
|
||||
|
||||
3. **日志级别过低**
|
||||
```ini
|
||||
[log]
|
||||
level=error # 改为error减少IO开销
|
||||
```
|
||||
|
||||
### ❌ 问题2:成功率低(<99%)
|
||||
|
||||
**排查步骤:**
|
||||
|
||||
1. **检查错误日志**
|
||||
|
||||
测试运行时会输出错误信息:
|
||||
```
|
||||
交易失败 - Status: 18, Message: ...
|
||||
交易异常: ContractException - ...
|
||||
```
|
||||
|
||||
2. **降低并发数**
|
||||
|
||||
如果成功率 < 99%,说明并发过高:
|
||||
```java
|
||||
// 从当前并发数降低50%
|
||||
tester.setTestParams(
|
||||
50, // 从100降到50
|
||||
10000,
|
||||
0
|
||||
);
|
||||
```
|
||||
|
||||
3. **检查账户余额**
|
||||
```bash
|
||||
cd fisco/console
|
||||
bash start.sh
|
||||
# 在控制台执行
|
||||
call ParallelTransfer 0x06ac... balanceOf "user_000000"
|
||||
```
|
||||
|
||||
### ❌ 问题3:程序运行时资源耗尽
|
||||
|
||||
**现象:** 出现大量线程创建失败错误
|
||||
|
||||
**原因:** 之前的bug(每笔交易创建新合约对象)已修复
|
||||
|
||||
**确认修复:** 检查代码第29行是否有:
|
||||
```java
|
||||
private ParallelTransfer contract; // 复用合约对象
|
||||
```
|
||||
|
||||
### ❌ 问题4:程序一直不退出
|
||||
|
||||
**原因:** SDK后台线程持续运行
|
||||
|
||||
**解决:** 已在代码第318行添加:
|
||||
```java
|
||||
System.exit(0);
|
||||
```
|
||||
|
||||
如果仍然卡住,按 `Ctrl+C` 强制终止。
|
||||
|
||||
---
|
||||
|
||||
## 性能优化建议
|
||||
|
||||
### 🎯 找到准确TPS的方法
|
||||
|
||||
**错误做法 ❌:**
|
||||
- 用最高并发数跑一次就认为是TPS
|
||||
- 忽略成功率指标
|
||||
- 测试时间过短(<10秒)
|
||||
|
||||
**正确做法 ✅:**
|
||||
|
||||
#### 阶段1:基准测试
|
||||
```java
|
||||
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:峰值测试
|
||||
```java
|
||||
tester.setTestParams(
|
||||
[最佳并发数], // 从阶段2得到
|
||||
50000, // 大批量测试
|
||||
0
|
||||
);
|
||||
```
|
||||
|
||||
**这就是你链的真实TPS!**
|
||||
|
||||
### 🔧 节点优化Checklist
|
||||
|
||||
#### 云服务器配置
|
||||
|
||||
SSH到服务器,编辑 `config.ini`:
|
||||
|
||||
```ini
|
||||
[tx_execute]
|
||||
enable_parallel=true # ✅ 开启并行
|
||||
|
||||
[consensus]
|
||||
max_trans_num_per_block=1000 # ✅ 每块至少1000笔
|
||||
|
||||
[tx_pool]
|
||||
limit=150000 # ✅ 交易池容量
|
||||
|
||||
[log]
|
||||
level=error # ✅ 降低日志级别
|
||||
```
|
||||
|
||||
重启节点:
|
||||
```bash
|
||||
cd ~/fisco/nodes/*/
|
||||
bash stop_all.sh
|
||||
bash start_all.sh
|
||||
```
|
||||
|
||||
#### 系统优化
|
||||
|
||||
```bash
|
||||
# 增加文件描述符
|
||||
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延迟:
|
||||
|
||||
问题记录:
|
||||
|
||||
|
||||
优化措施:
|
||||
|
||||
|
||||
下次改进:
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 快速参考
|
||||
|
||||
### 常用命令
|
||||
|
||||
```bash
|
||||
# 编译运行测试
|
||||
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"
|
||||
```
|
||||
|
||||
### 推荐测试流程
|
||||
|
||||
```bash
|
||||
# 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. **从小到大测试**:1线程 → 50线程 → 100线程 → 200线程
|
||||
2. **关注成功率**:必须≥99%,否则降低并发
|
||||
3. **测试足够久**:至少30秒以上
|
||||
4. **记录每次结果**:对比优化前后差异
|
||||
|
||||
### ⚠️ 常见误区
|
||||
|
||||
1. ❌ 用最高并发测出来的数字就是TPS
|
||||
2. ❌ 忽略成功率指标
|
||||
3. ❌ 测试时间太短
|
||||
4. ❌ 不检查节点配置
|
||||
5. ❌ 网络延迟过高还在本地测试
|
||||
|
||||
### 🎯 核心原则
|
||||
|
||||
**准确的TPS = 在成功率≥99%的前提下,能持续达到的最高TPS**
|
||||
|
||||
---
|
||||
|
||||
**祝测试顺利!** 🚀
|
||||
|
||||
有问题请查看"常见问题排查"章节,或检查测试报告中的错误信息。
|
||||
742
doc/服务器部署运行指南.md
Normal file
742
doc/服务器部署运行指南.md
Normal file
@@ -0,0 +1,742 @@
|
||||
# 服务器部署运行指南
|
||||
|
||||
> TPS测试工具服务器部署和使用说明
|
||||
|
||||
---
|
||||
|
||||
## 📦 打包部署包
|
||||
|
||||
### 1. 在本地打包
|
||||
|
||||
```bash
|
||||
cd /Users/kiro/IdeaProjects/contract
|
||||
|
||||
# 清理并打包(使用 fatJar 任务)
|
||||
./gradlew clean fatJar
|
||||
|
||||
# 查看生成的 jar 文件
|
||||
ls -lh build/libs/tps-test.jar
|
||||
```
|
||||
|
||||
**输出:** `build/libs/tps-test.jar` (约 25MB,包含所有依赖)
|
||||
|
||||
**注意:** 必须使用 `./gradlew fatJar` 命令打包,这样才会生成包含所有依赖的可执行jar文件。
|
||||
|
||||
### 2. 准备部署文件
|
||||
|
||||
需要上传到服务器的文件:
|
||||
|
||||
```
|
||||
部署包/
|
||||
├── tps-test.jar # 可执行jar(必需)
|
||||
└── config.toml # 链连接配置(必需)
|
||||
```
|
||||
|
||||
从本地复制配置文件:
|
||||
```bash
|
||||
# 复制配置文件到 build 目录
|
||||
cp src/main/resources/config.toml build/libs/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 上传到服务器
|
||||
|
||||
### 方法1:使用 SCP 上传
|
||||
|
||||
```bash
|
||||
# 1. 创建本地部署目录
|
||||
cd /Users/kiro/IdeaProjects/contract
|
||||
mkdir -p deploy
|
||||
cp build/libs/tps-test.jar deploy/
|
||||
cp src/main/resources/config.toml deploy/
|
||||
|
||||
# 2. 上传到服务器
|
||||
scp -r deploy/* root@121.196.226.157:~/tps-test/
|
||||
|
||||
# 如果需要上传到第二台服务器
|
||||
scp -r deploy/* root@8.137.93.11:~/tps-test/
|
||||
```
|
||||
|
||||
### 方法2:使用 rsync 上传(推荐)
|
||||
|
||||
```bash
|
||||
# 自动创建目录并上传
|
||||
rsync -avz --progress \
|
||||
build/libs/tps-test.jar \
|
||||
src/main/resources/config.toml \
|
||||
root@121.196.226.157:~/tps-test/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 服务器端配置
|
||||
|
||||
### 1. SSH 登录到服务器
|
||||
|
||||
```bash
|
||||
ssh root@121.196.226.157
|
||||
```
|
||||
|
||||
### 2. 检查 Java 环境
|
||||
|
||||
```bash
|
||||
# 检查 Java 版本(需要 JDK 11+)
|
||||
java -version
|
||||
|
||||
# 如果没有安装,安装 OpenJDK
|
||||
# Ubuntu/Debian
|
||||
sudo apt update && sudo apt install -y openjdk-11-jdk
|
||||
|
||||
# CentOS/RHEL
|
||||
sudo yum install -y java-11-openjdk
|
||||
```
|
||||
|
||||
### 3. 验证文件
|
||||
|
||||
```bash
|
||||
cd ~/tps-test
|
||||
ls -lh
|
||||
|
||||
# 应该看到:
|
||||
# tps-test.jar (约 30-40MB)
|
||||
# config.toml
|
||||
```
|
||||
|
||||
### 4. 修改配置文件(如需要)
|
||||
|
||||
```bash
|
||||
# 编辑配置文件,确保连接到本地节点
|
||||
vim config.toml
|
||||
```
|
||||
|
||||
**如果在服务器上运行,建议使用本地地址:**
|
||||
```toml
|
||||
[network]
|
||||
peers=["127.0.0.1:20200"] # 使用本地节点,延迟最低
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 运行测试
|
||||
|
||||
### 基本用法
|
||||
|
||||
```bash
|
||||
cd ~/tps-test
|
||||
|
||||
# 查看帮助
|
||||
java -jar tps-test.jar --help
|
||||
|
||||
# 使用默认参数(100线程,10000笔交易)
|
||||
java -jar tps-test.jar -c 0x06ac2fe406f1ae06494946ee281d58f1c79c39e4
|
||||
```
|
||||
|
||||
### 命令行参数说明
|
||||
|
||||
| 参数 | 简写 | 说明 | 默认值 |
|
||||
|------|------|------|--------|
|
||||
| `--threads` | `-t` | 并发线程数 | 100 |
|
||||
| `--transactions` | `-n` | 总交易数 | 10000 |
|
||||
| `--qps` | `-q` | QPS限制,0表示不限 | 0 |
|
||||
| `--contract` | `-c` | **合约地址(必填)** | 无 |
|
||||
| `--accounts` | `-a` | 测试账户数 | 100 |
|
||||
| `--help` | `-h` | 显示帮助 | - |
|
||||
|
||||
### 常用测试场景
|
||||
|
||||
#### 场景1:快速验证(1000笔)
|
||||
|
||||
```bash
|
||||
java -jar tps-test.jar \
|
||||
-t 50 \
|
||||
-n 1000 \
|
||||
-c 0x06ac2fe406f1ae06494946ee281d58f1c79c39e4
|
||||
```
|
||||
|
||||
#### 场景2:标准压测(10000笔)
|
||||
|
||||
```bash
|
||||
java -jar tps-test.jar \
|
||||
-t 100 \
|
||||
-n 10000 \
|
||||
-c 0x06ac2fe406f1ae06494946ee281d58f1c79c39e4
|
||||
```
|
||||
|
||||
#### 场景3:大规模压测(50000笔)
|
||||
|
||||
```bash
|
||||
java -jar tps-test.jar \
|
||||
-t 200 \
|
||||
-n 50000 \
|
||||
-c 0x06ac2fe406f1ae06494946ee281d58f1c79c39e4
|
||||
```
|
||||
|
||||
#### 场景4:极限压测(100000笔)
|
||||
|
||||
```bash
|
||||
java -jar tps-test.jar \
|
||||
-t 500 \
|
||||
-n 100000 \
|
||||
-c 0x06ac2fe406f1ae06494946ee281d58f1c79c39e4
|
||||
```
|
||||
|
||||
#### 场景5:限速测试
|
||||
|
||||
```bash
|
||||
# 限制 QPS 为 5000
|
||||
java -jar tps-test.jar \
|
||||
-t 100 \
|
||||
-n 50000 \
|
||||
-q 5000 \
|
||||
-c 0x06ac2fe406f1ae06494946ee281d58f1c79c39e4
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 后台运行和日志管理
|
||||
|
||||
### 1. 后台运行测试
|
||||
|
||||
```bash
|
||||
# 使用 nohup 后台运行,输出重定向到日志文件
|
||||
nohup java -jar tps-test.jar \
|
||||
-t 200 \
|
||||
-n 100000 \
|
||||
-c 0x06ac2fe406f1ae06494946ee281d58f1c79c39e4 \
|
||||
> tps_test.log 2>&1 &
|
||||
|
||||
# 查看进程
|
||||
ps aux | grep tps-test
|
||||
|
||||
# 实时查看日志
|
||||
tail -f tps_test.log
|
||||
```
|
||||
|
||||
### 2. 使用 screen(推荐)
|
||||
|
||||
```bash
|
||||
# 安装 screen(如果没有)
|
||||
sudo apt install screen # Ubuntu/Debian
|
||||
sudo yum install screen # CentOS/RHEL
|
||||
|
||||
# 创建新会话
|
||||
screen -S tps-test
|
||||
|
||||
# 运行测试
|
||||
java -jar tps-test.jar -t 200 -n 100000 -c 0x06ac...
|
||||
|
||||
# 断开会话(按键):Ctrl+A,然后按 D
|
||||
# 重新连接:screen -r tps-test
|
||||
# 查看所有会话:screen -ls
|
||||
```
|
||||
|
||||
### 3. 查看测试报告
|
||||
|
||||
```bash
|
||||
# 测试完成后,会生成报告文件
|
||||
ls -lt tps_test_report_*.txt | head -5
|
||||
|
||||
# 查看最新报告
|
||||
cat $(ls -t tps_test_report_*.txt | head -1)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 批量测试脚本
|
||||
|
||||
创建一个自动化测试脚本:
|
||||
|
||||
```bash
|
||||
# 创建测试脚本
|
||||
cat > run_tps_tests.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
|
||||
# TPS 自动化测试脚本
|
||||
CONTRACT="0x06ac2fe406f1ae06494946ee281d58f1c79c39e4"
|
||||
JAR="tps-test.jar"
|
||||
|
||||
echo "======================================"
|
||||
echo " FISCO BCOS TPS 自动化测试"
|
||||
echo "======================================"
|
||||
echo ""
|
||||
|
||||
# 测试配置数组(线程数 交易数 描述)
|
||||
tests=(
|
||||
"50:5000:快速验证"
|
||||
"100:10000:基础压测"
|
||||
"200:10000:中等压测"
|
||||
"400:10000:高并发压测"
|
||||
)
|
||||
|
||||
# 循环执行测试
|
||||
for test in "${tests[@]}"; do
|
||||
IFS=':' read -r threads txs desc <<< "$test"
|
||||
|
||||
echo ""
|
||||
echo "======================================"
|
||||
echo "测试: $desc"
|
||||
echo "并发数: $threads, 交易数: $txs"
|
||||
echo "======================================"
|
||||
echo ""
|
||||
|
||||
java -jar $JAR -t $threads -n $txs -c $CONTRACT
|
||||
|
||||
echo ""
|
||||
echo "等待10秒后开始下一轮测试..."
|
||||
sleep 10
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "======================================"
|
||||
echo "所有测试完成!"
|
||||
echo "======================================"
|
||||
|
||||
# 汇总报告
|
||||
echo ""
|
||||
echo "测试报告列表:"
|
||||
ls -lt tps_test_report_*.txt | head -10
|
||||
EOF
|
||||
|
||||
# 给脚本添加执行权限
|
||||
chmod +x run_tps_tests.sh
|
||||
|
||||
# 运行自动化测试
|
||||
./run_tps_tests.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 分阶段找准确TPS的脚本
|
||||
|
||||
基于文档中推荐的测试方法:
|
||||
|
||||
```bash
|
||||
cat > find_optimal_tps.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
|
||||
# 二分法找最佳TPS脚本
|
||||
CONTRACT="0x06ac2fe406f1ae06494946ee281d58f1c79c39e4"
|
||||
JAR="tps-test.jar"
|
||||
|
||||
echo "======================================"
|
||||
echo " 寻找最佳 TPS 配置"
|
||||
echo "======================================"
|
||||
echo ""
|
||||
|
||||
# 阶段1:基准测试
|
||||
echo "[阶段1] 基准测试(单线程)"
|
||||
java -jar $JAR -t 1 -n 100 -c $CONTRACT
|
||||
echo ""
|
||||
read -p "按 Enter 继续..."
|
||||
|
||||
# 阶段2:逐步增加并发
|
||||
threads_list=(50 100 200 400)
|
||||
|
||||
for threads in "${threads_list[@]}"; do
|
||||
echo ""
|
||||
echo "======================================"
|
||||
echo "[阶段2] 测试 $threads 线程"
|
||||
echo "======================================"
|
||||
echo ""
|
||||
|
||||
java -jar $JAR -t $threads -n 5000 -c $CONTRACT
|
||||
|
||||
echo ""
|
||||
read -p "成功率是否 ≥99%?(y/n): " answer
|
||||
|
||||
if [ "$answer" != "y" ]; then
|
||||
echo "成功率低于99%,建议使用上一个并发数"
|
||||
last_good=$((threads / 2))
|
||||
echo "建议最佳并发数: $last_good"
|
||||
|
||||
echo ""
|
||||
read -p "是否用最佳并发数运行峰值测试?(y/n): " peak_test
|
||||
|
||||
if [ "$peak_test" = "y" ]; then
|
||||
echo ""
|
||||
echo "======================================"
|
||||
echo "[阶段3] 峰值测试"
|
||||
echo "======================================"
|
||||
echo ""
|
||||
java -jar $JAR -t $last_good -n 50000 -c $CONTRACT
|
||||
fi
|
||||
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "======================================"
|
||||
echo "测试完成!"
|
||||
echo "======================================"
|
||||
EOF
|
||||
|
||||
chmod +x find_optimal_tps.sh
|
||||
./find_optimal_tps.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 监控和诊断
|
||||
|
||||
### 1. 实时监控测试进程
|
||||
|
||||
```bash
|
||||
# 监控 CPU 和内存
|
||||
top -p $(pgrep -f tps-test.jar)
|
||||
|
||||
# 监控网络连接
|
||||
watch -n 1 'netstat -antp | grep 20200'
|
||||
```
|
||||
|
||||
### 2. 查看节点日志
|
||||
|
||||
```bash
|
||||
# 查看节点日志
|
||||
tail -f ~/fisco/nodes/*/node0/log/log* | grep -E "ERROR|TPS"
|
||||
|
||||
# 查看交易池状态
|
||||
cd ~/fisco/console
|
||||
bash start.sh
|
||||
# 执行:getPendingTxSize
|
||||
```
|
||||
|
||||
### 3. 系统资源监控
|
||||
|
||||
```bash
|
||||
# 整体系统监控
|
||||
htop
|
||||
|
||||
# 磁盘 IO
|
||||
iostat -x 1
|
||||
|
||||
# 网络流量
|
||||
iftop -i eth0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 常见问题
|
||||
|
||||
### 问题1:找不到或无法加载主类
|
||||
|
||||
**错误信息:**
|
||||
```
|
||||
Error: Could not find or load main class com.org.fisco.TPSTest
|
||||
```
|
||||
|
||||
**原因:** jar文件打包不正确,缺少依赖类
|
||||
|
||||
**解决:**
|
||||
```bash
|
||||
# 1. 必须使用 fatJar 任务打包
|
||||
cd /Users/kiro/IdeaProjects/contract
|
||||
./gradlew clean fatJar
|
||||
|
||||
# 2. 验证jar文件可以运行
|
||||
java -jar build/libs/tps-test.jar --help
|
||||
|
||||
# 3. 重新上传到服务器
|
||||
scp build/libs/tps-test.jar root@服务器IP:~/tps-test/
|
||||
```
|
||||
|
||||
**注意:** 不要使用 `./gradlew build`,必须使用 `./gradlew fatJar`
|
||||
|
||||
### 问题2:找不到 config.toml
|
||||
|
||||
**错误信息:**
|
||||
```
|
||||
错误: 找不到配置文件 config.toml
|
||||
```
|
||||
|
||||
**解决:**
|
||||
```bash
|
||||
# 确保 config.toml 在当前目录
|
||||
cd ~/tps-test
|
||||
ls config.toml
|
||||
|
||||
# 或者从 console 复制
|
||||
cp ~/fisco/console/conf/config.toml .
|
||||
```
|
||||
|
||||
### 问题3:连接节点失败
|
||||
|
||||
**错误信息:**
|
||||
```
|
||||
连接FISCO BCOS节点失败
|
||||
```
|
||||
|
||||
**解决:**
|
||||
```bash
|
||||
# 1. 检查节点是否运行
|
||||
ps aux | grep fisco-bcos
|
||||
|
||||
# 2. 检查端口是否监听
|
||||
netstat -tlnp | grep 20200
|
||||
|
||||
# 3. 测试连接
|
||||
telnet 127.0.0.1 20200
|
||||
|
||||
# 4. 修改 config.toml 使用正确的地址
|
||||
vim config.toml
|
||||
```
|
||||
|
||||
### 问题4:内存不足
|
||||
|
||||
**错误信息:**
|
||||
```
|
||||
java.lang.OutOfMemoryError
|
||||
```
|
||||
|
||||
**解决:**
|
||||
```bash
|
||||
# 增加 JVM 内存
|
||||
java -Xmx4g -Xms2g -jar tps-test.jar -t 200 -n 50000 -c 0x06ac...
|
||||
```
|
||||
|
||||
### 问题5:程序卡住不动
|
||||
|
||||
**排查:**
|
||||
```bash
|
||||
# 1. 查看是否有错误日志
|
||||
tail -100 tps_test.log
|
||||
|
||||
# 2. 检查网络连接
|
||||
netstat -antp | grep 20200
|
||||
|
||||
# 3. 检查节点是否正常
|
||||
cd ~/fisco/nodes/*/node0
|
||||
tail -50 log/log*
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 最佳实践
|
||||
|
||||
### 1. 在服务器上测试的优势
|
||||
|
||||
✅ **延迟更低**:本地网络延迟通常 < 1ms
|
||||
✅ **TPS更高**:网络不是瓶颈
|
||||
✅ **结果更准**:排除网络抖动影响
|
||||
|
||||
### 2. 推荐的测试流程
|
||||
|
||||
```bash
|
||||
# 第一步:快速验证
|
||||
java -jar tps-test.jar -t 50 -n 1000 -c 0x06ac...
|
||||
|
||||
# 第二步:基础测试
|
||||
java -jar tps-test.jar -t 100 -n 10000 -c 0x06ac...
|
||||
|
||||
# 第三步:根据成功率调整
|
||||
# 如果成功率 ≥ 99%,增加并发到 200
|
||||
# 如果成功率 < 99%,保持或降低并发
|
||||
|
||||
# 第四步:峰值测试
|
||||
java -jar tps-test.jar -t [最佳并发] -n 50000 -c 0x06ac...
|
||||
```
|
||||
|
||||
### 3. 参数选择建议
|
||||
|
||||
| 节点配置 | 推荐并发数 | 推荐交易数 |
|
||||
|---------|----------|----------|
|
||||
| 2C4G | 50-100 | 10000 |
|
||||
| 4C8G | 100-200 | 50000 |
|
||||
| 8C16G | 200-500 | 100000 |
|
||||
|
||||
---
|
||||
|
||||
## 📝 测试记录模板
|
||||
|
||||
建议每次测试记录:
|
||||
|
||||
```bash
|
||||
# 创建测试记录文件
|
||||
cat > test_record_$(date +%Y%m%d).md << 'EOF'
|
||||
# TPS测试记录
|
||||
|
||||
## 测试日期
|
||||
2026-02-10
|
||||
|
||||
## 测试环境
|
||||
- 服务器: 121.196.226.157
|
||||
- 节点配置: 4C8G SSD
|
||||
- enable_parallel: true
|
||||
- max_trans_num_per_block: 1000
|
||||
|
||||
## 测试结果
|
||||
|
||||
### 测试1
|
||||
- 命令: java -jar tps-test.jar -t 100 -n 10000 -c 0x06ac...
|
||||
- TPS:
|
||||
- 成功率:
|
||||
- 平均延迟:
|
||||
|
||||
### 测试2
|
||||
- 命令:
|
||||
- TPS:
|
||||
- 成功率:
|
||||
- 平均延迟:
|
||||
|
||||
## 结论
|
||||
最佳并发数:
|
||||
峰值TPS:
|
||||
|
||||
## 优化建议
|
||||
|
||||
EOF
|
||||
|
||||
vim test_record_$(date +%Y%m%d).md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 更新部署
|
||||
|
||||
当代码有更新时:
|
||||
|
||||
```bash
|
||||
# 本地重新打包
|
||||
cd /Users/kiro/IdeaProjects/contract
|
||||
./gradlew clean fatJar
|
||||
|
||||
# 验证jar可以运行
|
||||
java -jar build/libs/tps-test.jar --help
|
||||
|
||||
# 上传到服务器(覆盖旧版本)
|
||||
scp build/libs/tps-test.jar root@121.196.226.157:~/tps-test/
|
||||
|
||||
# 服务器上重新运行测试
|
||||
ssh root@121.196.226.157
|
||||
cd ~/tps-test
|
||||
java -jar tps-test.jar -t 100 -n 10000 -c 0x06ac...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📞 快速命令参考
|
||||
|
||||
```bash
|
||||
# 本地打包
|
||||
cd /Users/kiro/IdeaProjects/contract
|
||||
./gradlew clean fatJar
|
||||
|
||||
# 验证打包(本地测试)
|
||||
java -jar build/libs/tps-test.jar --help
|
||||
|
||||
# 上传到服务器
|
||||
scp build/libs/tps-test.jar src/main/resources/config.toml root@121.196.226.157:~/tps-test/
|
||||
|
||||
# SSH到服务器运行
|
||||
ssh root@121.196.226.157
|
||||
cd ~/tps-test
|
||||
|
||||
# 测试帮助
|
||||
java -jar tps-test.jar --help
|
||||
|
||||
# 运行测试
|
||||
java -jar tps-test.jar -t 100 -n 10000 -c 0x06ac2fe406f1ae06494946ee281d58f1c79c39e4
|
||||
|
||||
# 查看报告
|
||||
cat $(ls -t tps_test_report_*.txt | head -1)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎓 完整部署示例
|
||||
|
||||
### 从零开始的完整流程
|
||||
|
||||
```bash
|
||||
# ========================================
|
||||
# 第一步:在本地打包
|
||||
# ========================================
|
||||
cd /Users/kiro/IdeaProjects/contract
|
||||
|
||||
# 清理并打包
|
||||
./gradlew clean fatJar
|
||||
|
||||
# 验证jar文件
|
||||
java -jar build/libs/tps-test.jar --help
|
||||
# 应该显示帮助信息,如果报错说明打包有问题
|
||||
|
||||
|
||||
# ========================================
|
||||
# 第二步:准备部署文件
|
||||
# ========================================
|
||||
mkdir -p deploy
|
||||
cp build/libs/tps-test.jar deploy/
|
||||
cp src/main/resources/config.toml deploy/
|
||||
|
||||
# 查看文件
|
||||
ls -lh deploy/
|
||||
# 应该看到:
|
||||
# tps-test.jar (约 25MB)
|
||||
# config.toml
|
||||
|
||||
|
||||
# ========================================
|
||||
# 第三步:上传到服务器
|
||||
# ========================================
|
||||
# 方式1:使用 scp
|
||||
scp deploy/tps-test.jar deploy/config.toml root@121.196.226.157:~/tps-test/
|
||||
|
||||
# 方式2:使用 rsync(推荐)
|
||||
rsync -avz --progress deploy/* root@121.196.226.157:~/tps-test/
|
||||
|
||||
|
||||
# ========================================
|
||||
# 第四步:SSH到服务器配置
|
||||
# ========================================
|
||||
ssh root@121.196.226.157
|
||||
|
||||
# 进入目录
|
||||
cd ~/tps-test
|
||||
|
||||
# 检查文件
|
||||
ls -lh
|
||||
# 应该看到 tps-test.jar 和 config.toml
|
||||
|
||||
# 检查Java版本(需要JDK 11+)
|
||||
java -version
|
||||
|
||||
# 编辑配置文件,使用本地节点地址
|
||||
vim config.toml
|
||||
# 修改为:peers=["127.0.0.1:20200"]
|
||||
|
||||
# 测试jar文件
|
||||
java -jar tps-test.jar --help
|
||||
# 应该显示帮助信息
|
||||
|
||||
|
||||
# ========================================
|
||||
# 第五步:运行测试
|
||||
# ========================================
|
||||
|
||||
# 快速验证(1000笔)
|
||||
java -jar tps-test.jar -t 50 -n 1000 -c 0x06ac2fe406f1ae06494946ee281d58f1c79c39e4
|
||||
|
||||
# 如果上面的测试成功,运行正式测试
|
||||
java -jar tps-test.jar -t 100 -n 10000 -c 0x06ac2fe406f1ae06494946ee281d58f1c79c39e4
|
||||
|
||||
# 查看生成的报告
|
||||
cat $(ls -t tps_test_report_*.txt | head -1)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 验证清单
|
||||
|
||||
部署后请按此清单验证:
|
||||
|
||||
- [ ] jar文件大小约25MB(太小说明没打包依赖)
|
||||
- [ ] 本地能运行 `java -jar build/libs/tps-test.jar --help`
|
||||
- [ ] 服务器上能显示帮助信息
|
||||
- [ ] config.toml 配置了正确的节点地址
|
||||
- [ ] 能连接到节点(显示区块高度)
|
||||
- [ ] 测试能正常运行并生成报告
|
||||
|
||||
---
|
||||
|
||||
**祝测试顺利!** 🚀
|
||||
Reference in New Issue
Block a user