Time:2023-04-04 Click:81
1. 基本概念
2. 常用工具
3. 性能调优的常见情况
这 3 块内容涵盖的内容非常多,每一个内容都有很多书籍和文章介绍,详细的内容不会出现在本文中。
1. 需要明确指标,一般指两类指标: 技术指标、业务指标。技术指标一般是 TPS,响应时间,资源利用率,对应到区块链一般是指每秒可以处理多少笔交易?这些交易的响应时间或者统计结果是多少?在这种情况下系统使用的资源处于什么状态?期望满足的业务指标,应该来源于生产环境统计,以 cosmos-sdk 的生产应用 cosmos-hub 为例,其现阶段出块时间大约 6 秒,每个区块中的交易数大多数小于 10 。期望的业务指标设定为 TPS 为 100 是较为合理的。(这么低的 TPS 其实是与 cosmos-hub 的目标有关,因为其主要关注点在链的互操作性)。
2. 测试模型: 是真实场景的抽象,描述业务模型是什么样的。以 cosmos-hub 为例大致就是,分布在全球的区块链节点,在验证者节点约 500 个,活跃验证者节点约为 200 的情况下处理交易。测试时可以按比例抽象实际情况。
3. 测试方案: 包括测试环境,测试数据,测试模型,性能指标等。对比区块链系统的测试,就是确定测试架构,准备好如 1000 个用户,每个用户余额 1000 stake 这样的内容。
4. 需要有监控: 监控的对象有压力机、区块链节点、其他如负载均衡服务器等。云原生时代的监控一般是 Kubernetes Prometheus Grafana。
5. 需要测试条件:硬件环境,测试执行策略等。例如: 4 C 8 G, 前 60 秒,每秒增加 10 个线程。
6. 需要有场景:指性能场景,正式化的描述是: 在既定的环境、既定的数据、既定的执行策略、既定的监控之下,执行性能脚本,同时观察系统各层级的性能状态参数变化,并实时判断分析场景是否符合预期。性能场景,有时被称为测试用例其实是不对的。
7. 要有结果报告:报告内容当然就是实际的指标数据。
1. 基准性能场景:做单交易/接口的容量(业务量),为混合容量做准备。
2. (混合)容量性能场景:混合容量测试是因为线上真实场景就是由不同的业务组成的,所以由这些业务按照不同并发比例发起梯度压测就是混合容量测试场景。
3. 稳定性性能场景:核心就是时长,在长时间的运行之下,观察系统的性能表现。这个时长的设置,应该来源于运维周期。
4. 异常性能场景:在强压力之下,模拟异常。
1. RT, Response Time
2. HPS, Hits Per Second
3. TPS, Transactions Per Second, 这里的 Transactions 在传统的应用中一般称为”事务“,在区块链领域指”交易“
4. QPS, Queries Per Second
5. PV, Page View
6. Throughput
7. IOPS, Input/Output Operations Per Second
比较重要的指标有资源使用率、吞吐量、响应时间,服务提供方比较关心前两者,用户更更新后者。关于这些指标的一般情况引用 Performance TestingMethodology(http://hosteddocs.ittoolbox.com/questnolg 22106 java.pdf)中的经典图来说明,实际情况可能不同。图中定义了 3 线 3 区域 3 状态,这个图值得多看看,能够大致理解指标简的关系。
1. 3 线: Utilization,Throughput,Response Time
2. 3 区域: Light Load, Heavy Load, Buckle Zone
3. 3 状态: Resource Saturated, Throughput Falling, End Users Effected
1. 一般需要在什么时候做性能测试。
a. 项目上线前,估计系统承载能力
b. 项目重构后,评估效果
2. 如果一个项目得到性能报告就终止,这样就只是性能验证。做完全面的性能测试,同时将系统调优到最优状态,才算是一个完整的性能项目了。性能调优耗时长,还可能需要开发参与,代价高。
区块链性能测试
区块链的性能测试的指标最重要的是 TPS 与延迟,a16z的文章Why blockchain performance is hard to measure 对此做了很有洞察的讨论,说明了为什么这两个指标很难测量和比较。其主要内容有以下方面:
1. 起点是用户点击提交还是交易到达内存池?
2. 终点是交易被第 1 个区块确认?还是被第 6 个区块确认(POW 区块链是这样认为的)?又或者是最终用户收到接口响应的时间?
3. 有些区块链系统对交易会等待一定延迟和到达一定数量才开始处理。这样比较幸运的就是最后加入的交易,其处理延迟最短。
4. 对于上诉问题的一种折中方案是,即准确评估整个系统需要考虑延时的分布,而不是将其延迟看做单一数字。
5. 有些区块链系统的交易处理是有优先级的,fee 高的交易很快确认,fee 低的相对慢些。fee 的不同对交易的延时和 TPS 的统计是有影响的。
另外一个实际的问题是,用户其实不关心一个区块链的 TPS 是多少,用户只关心如何少用 fee 并尽快完成交易。从这个角度来讲,TPS 只对系统服务提供商有意义。
压力工具一般用Jmeter或者特定应用专用测试工具如下:
1. hyperbench/hyperbench
2. hyperledger/caliper: A blockchain benchmark framework to measure performance of multiple blockchain solutions
3. https://github.com/xuperchain/xbench
4. …
使用 Jmeter 应该是更贴近使用场景,更通用。一般与区块链节点进行交互的方式有(一般命令行交互最终也是调用下面的接口之一)
1. gRPC 协议
2. HTTP 协议 (REST 接口)
Jmeter 支持的 Sampler 支持有 HTTP,对 gRPC 协议的支持需要借助插件jmeter-grpc-request
docker-compose 中可以限制容器使用的资源,如内存和 CPU 算力,甚至绑定 CPU 核心,对这些资源的监控可以使用cadvisor。
为了验证 CPU 限制是否准确,可以用stress-ng压满核心,看统计结果是否与限制值一致。
还可能遇到的问题是系统不稳定,可以表现为 CPU 使用率/TPS 不稳定。
如果在 LightLoad 区域选择一定的并发压力,TPS 波动较大的话,可能就是系统设计得不好,需要找到原因和优化了。
如果是 CPU 使用率不稳定(趋势稳定,但波动大),从 CPU 指令执行层面来看为 CPU 处于 idle 状态的时长参差不齐。这种情况下的原因并不在于有 CPU 有 idle,而是在于处于 idle 的时间段有长有短。需要借助 Linux 系统工具、程序对应的 profilling 工具来观测,找到原因。
找到原因后,如果能够通过调整操作系统参数或者应用系统参数优化性能是比较快捷的,如果需要修改代码,则会涉及系统架构优化,会有涉及和编码工作,调优周期会很长。
下一篇文章将分享使用 cosmos-sdk 中的 SimApp 来进行性能测试以及在性能调优方面的方法。