主题
07 · 性能与验证
当前仓库提供了调优入口和压力测试模块,但没有仅靠代码即可证明的生产 TPS 保证。本章把可验证的旋钮与必须实测的假设分开。
先按链路分段
| 分段 | 主要瓶颈候选 | 观察点 |
|---|---|---|
| Facade | Ed25519 验签、BizHub 认证缓存、Wallet Node gRPC | 请求延迟、认证失败、连接池状态 |
| Wallet Node Prepare | UTXO 查询/选币、费用与规则缓存、数据库 | prepare phase metrics、DB/Redis 延迟 |
| Audit + Endorse | driver 验证成本、Auditor worker pool、FSC P2P | audit phase metrics、队列饱和、P2P latency |
| Broadcast + finality | Orderer、Committer、sidecar、finality queue | broadcast latency、待终局数量、提交延迟 |
| BizHub | PostgreSQL、settlement workers、ledger indexer | DB pool、worker backlog、AppendBatch latency |
Token driver 会改变热点
开发控制器配置使用 zkatdlog,模块自带配置使用 fabtoken。zkatdlog 包含隐私证明与验证路径;fabtoken 主要是透明 token 与签名验证。性能文档必须记录压测所加载的配置文件、driver 和公共参数,否则结果不可比较。
Token Selector
Wallet Node 支持:
memory:本进程维护索引,部署简单,但重启冷启动和大 UTXO 集合需要重点测试;distributed:通过 Redis 协调选币,适合多实例,但增加网络和 Redis 延迟。
distributed selector 只解决选币协调,不会共享 PendingTransactionStore。两阶段转账在多副本下仍需要实例亲和或额外共享状态。
Wallet Node 并发与异步终局
批量余额查询在业务代码中使用有界并发;实际限制以 app/walletnode/internal/biz/wallet_biz.go 为准。不要把无限并发当作扩容手段。
Submit 在 broadcast 后返回,selector 交由 FinalityWorker。这降低了请求延迟,但需要同时监控:
- finality 注册失败或队列饱和;
- in-flight 数量与驻留时间;
- 广播结果不确定的数量;
- 节点重启对进程内状态的影响。
Auditor
Auditor 为审计 responder 使用有界 worker pool,大小与超时来自 biz.cbdc.auditWorkerPool。当队列满时,提高副本数之前应先确认:
- Auditor 身份与公共参数是否允许该扩容方式;
- 请求是否能稳定路由到正确实例;
- AuditDB/TokenDB 是否共享或分片;
- driver 的 CPU 与数据库占比。
FinalityCaptureWorker 是另一条独立链路:它从 block source 批量读取交易并写 BizHub。其 batch、flush、queue、timeout 和 retry 参数位于 Auditor 配置及 internal/worker/finality_capture_worker.go。默认可关闭,压测时应明确是否启用。
BizHub 与 PostgreSQL
BizHub 使用显式迁移和 Ent repository。主要压力来自:
- settlement worker 的轮询与外部 RTGS I/O;
- ledger indexer 的批量 upsert 与 cursor 同事务推进;
- management/runtime RPC 的并发查询;
- 多副本共享
cbdc_biz时的锁与连接数。
连接池值应按实际配置、PgBouncer/数据库上限和副本数共同计算,不能沿用旧文档中的固定连接数。
Central 使用独立 cbdc_central,其负载与 BizHub 应分别观测。
P2P 与 TLS
FSC P2P 当前走 WebSocket + TLS,并设置 maxSubConns。增加该值只扩大连接容量,不等于提升单连接吞吐。应同时观察握手失败、证书 SAN、对端 resolver 更新和文件描述符限制。
压测工具
cbdc-stress 是 go.work 中的独立模块。建议至少分别测:
- 仅 Facade 鉴权与只读 API;
- PrepareTransfer;
- Submit/broadcast;
- 端到端 finality;
- Auditor indexer 开/关两组;
- zkatdlog 与 fabtoken 两套配置;
- memory 与 distributed selector。
报告应包含 p50/p95/p99、错误率、finality lag、DB/Redis 资源、节点 CPU/内存,以及完整 commit、配置路径和拓扑。
不应直接宣称的数字
仓库中的配置注释、历史容量计划或单机局部 benchmark 不能单独证明 5k、50k 或 100k TPS。生产容量需要在目标硬件、证书/KMS、网络、数据库和实际 driver 上重复验证。
代码入口
cbdc-stress/cbdc-token/app/walletnode/internal/biz/cbdc-token/app/walletnode/internal/worker/finality_worker.gocbdc-token/app/auditor/internal/worker/cbdc-token/pkg/token/selector/cbdc-common/observability/