Skip to content

07 · 性能与验证

当前仓库提供了调优入口和压力测试模块,但没有仅靠代码即可证明的生产 TPS 保证。本章把可验证的旋钮与必须实测的假设分开。

先按链路分段

分段主要瓶颈候选观察点
FacadeEd25519 验签、BizHub 认证缓存、Wallet Node gRPC请求延迟、认证失败、连接池状态
Wallet Node PrepareUTXO 查询/选币、费用与规则缓存、数据库prepare phase metrics、DB/Redis 延迟
Audit + Endorsedriver 验证成本、Auditor worker pool、FSC P2Paudit phase metrics、队列饱和、P2P latency
Broadcast + finalityOrderer、Committer、sidecar、finality queuebroadcast latency、待终局数量、提交延迟
BizHubPostgreSQL、settlement workers、ledger indexerDB 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-stressgo.work 中的独立模块。建议至少分别测:

  1. 仅 Facade 鉴权与只读 API;
  2. PrepareTransfer;
  3. Submit/broadcast;
  4. 端到端 finality;
  5. Auditor indexer 开/关两组;
  6. zkatdlog 与 fabtoken 两套配置;
  7. 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.go
  • cbdc-token/app/auditor/internal/worker/
  • cbdc-token/pkg/token/selector/
  • cbdc-common/observability/