一、Benchmark 简介
- 基准测试是通过运行特定程序或测试套件,对计算机硬件、软件或系统的性能进行量化评估的过程。其核心目的是用标准化的方法衡量设备在特定任务下的表现,以便进行横向对比或性能优化
- 性能调优的两大利器是Benchmark和profile工具。Benchmark用压力测试挖掘整个系统的性能状况,而profile工具最大限度地呈现系统的运行状态和性能指标,方便用户诊断性能问题和进行调优。
二、Benchmark 的组成
Benchmark的核心由3部分组成:数据集、 工作负载、度量指标。
1、数据集
数据类型分为结构化数据、半结构化数据和非结构化数据。由于大数据环境下的数据类型复杂,负载多样,所以大数据Benchmark需要生成3种类型的数据和对应负载。
- 结构化数据:传统的关系数据模型,可用二维表结构表示。典型场景有电商交易、财务系统、医疗HIS数据库、政务信息化系统等等;
- 半结构化数据:类似XML、HTML之类,自描述,数据结构和内容混杂在一起。典型应用场景有邮件系统、Web搜索引擎存储、教学资源库、档案系统等等,可以考虑使用Hbase等典型的KeyValue存储;
- 非结构化数据:各种文档、图片、视频和音频等。典型的应用有视频网站、图片相册、交通视频监控等等。
2、工作负载
互联网领域数据庞大,用户量大,成为大数据问题产生的天然土壤。对工作负载理解和设计可以从以下几个维度来看
- 密集计算类型:CPU密集型计算、IO密集型计算、网络密集型计算;
- 计算范式:SQL、批处理、流计算、图计算、机器学习;
- 计算延迟:在线计算、离线计算、实时计算;
- 应用领域:搜索引擎、社交网络、电子商务、地理位置、媒体、游戏。
3、度量指标
性能高估的两大利器就是Benchmark和Profile工具。Benchmark用压力测试挖掘整个系统的性能状况,而Profile工具最大限度地呈现系统的运行时状态和性能指标,方便用户诊断性能问题和进行调优。
- 工具的使用
1. 在架构层面:perf、nmon等工具和命令;
2. 在JVM层面:btrace、Jconsole、JVisualVM、JMap、JStack等工具和命令;
3. 在Spark层面:web ui、console log,也可以修改Spark源码打印日志进行性能监控。 - 度量指标
1. 从架构角度度量:浮点型操作密度、整数型操作密度、指令中断、cache命中率、TLB命中;
2. 从Spark系统执行时间和吞吐的角度度量:Job作业执行时间、Job吞吐量、Stage执行时间、Stage吞吐量、Task执行时间、Task吞吐量;
3. 从Spark系统资源利用率的角度度量:CPU在指定时间段的利用率、内存在指定时间段的利用率、磁盘在指定时间段的利用率、网络带宽在指定时间段的利用率;
4. 从扩展性的角度度量:数据量扩展、集群节点数据扩展(scale out)、单机性能扩展(scale up)。
三、Benchimark测试步骤
-
明确测试目标与指标
首先需清晰界定测试对象(如CPU、数据库、网络服务等)及核心目的,例如验证硬件升级后的性能提升、定位系统高负载瓶颈或对比不同方案的效率差异。同时,结合测试领域定义关键性能指标(KPI),如硬件测试关注算力(FLOPS)、存储吞吐量(IOPS),软件测试侧重响应时间、并发事务数(TPS),网络测试则聚焦带宽、延迟等,确保后续步骤围绕可量化的目标展开。 -
选择适配的Benchmark工具
根据测试对象特性匹配专业工具,例如CPU性能测试可选Cinebench、Geekbench,数据库场景采用TPC-C、Sysbench,Web服务器测试使用ApacheBench或JMeter。优先选择开源、社区认可度高的工具,确保其支持目标指标的采集与复现,同时考虑工具对测试环境的兼容性(如操作系统、硬件架构),避免因工具局限性导致结果偏差。 -
搭建稳定的测试环境
搭建纯净且可控的测试环境是基础:硬件层面需固定配置(如锁定CPU频率、禁用节能模式),控制环境温度以避免散热影响;软件层面安装无冗余服务的操作系统,关闭自动更新、杀毒软件等后台进程,统一驱动与依赖库版本(如GPU驱动、数据库引擎版本),确保环境变量在测试周期内保持一致,消除非测试因素的干扰。 -
设计测试数据与场景
依据真实业务场景构建测试数据集,包括数据规模(如10GB数据库数据、百万级用户请求日志)和类型(结构化、半结构化、非结构化)。同时设计多元测试场景:空载测试(基础性能基线)、满载压力测试(极限负载下的稳定性)、混合负载测试(模拟真实业务组合),例如Web系统需覆盖静态资源访问、动态API调用、数据库查询等多场景组合,确保测试覆盖度贴近实际应用。 -
执行预热测试(Warm-Up)
正式测试前运行1-2轮完整流程进行环境预热,让系统进入稳定状态。例如硬件测试中预热缓存、平衡硬件温度,软件测试中初始化连接池、加载基础数据,避免首次运行时因资源初始化(如JVM类加载、磁盘缓存构建)导致的性能波动,确保后续数据反映系统常态化表现。 -
开展多次重复的正式测试
以“单次测试-环境恢复-再次测试”的循环执行至少3次正式测试,复杂场景可重复5-10次。每次测试后等待系统完全复位(如清空内存缓存、释放磁盘IO队列、冷却硬件),测试过程中禁止手动操作或运行非相关程序,通过脚本或自动化工具控制流程,减少人为干预误差,同时记录每轮测试的开始时间、环境资源占用等辅助信息。 -
实时监控辅助性能指标
同步启动系统监控工具(如Linux的top、htop,Windows的资源监视器),实时记录CPU/GPU使用率、频率波动、温度变化,内存带宽、磁盘IOPS、网络吞吐量等底层指标。这些数据可辅助定位测试中异常性能的来源,例如CPU使用率100%但算力未达预期时,可结合频率监控判断是否因过热降频导致。 -
整理与清洗测试数据
测试结束后,剔除因后台进程干扰、环境波动等导致的异常值(如某轮测试响应时间突增50%),对有效数据计算平均值、中位数或百分位数(如95%响应时间)。同时完整记录测试环境参数(硬件型号、软件版本、工具配置),形成可复现的测试日志,确保数据可追溯与验证。 -
多维对比与可视化分析
将整理后的数据与历史基准值、同类型产品性能或不同配置方案进行横向/纵向对比。例如对比不同CPU的Cinebench分数,或同一数据库在开启索引前后的TPS差异;通过折线图、柱状图可视化性能趋势,标注负载阈值下的性能拐点(如并发数超过2000时响应时间骤增),直观呈现系统性能边界与优化空间。 -
定位瓶颈与输出优化建议
结合测试数据与监控指标分析性能瓶颈:若CPU算力不足但内存空闲,可能需优化指令集使用(如开启AVX512);若磁盘吞吐量低但CPU利用率低,可能是接口带宽或队列深度限制。基于分析结果提出具体优化方向,如调整系统参数(数据库连接池大小)、升级硬件(SSD替换HDD)、优化代码逻辑(减少IO密集型操作),并可规划下一轮验证测试以评估优化效果。
四、Benchmaark测试数据的实际用途/意义
- 了解系统性能基准作为参照物(性能问题发生后的测试很难了解系统性能基准)
- 识别系统或环境的配置变更对性能响应带来的影响
- 为系统优化前后的性能提升/下降提供参考指标
- 观察系统的整体性能趋势与拐点发生,及早识别系统性能风险
五、Benchmark的重点
基准测试的工作重点是统计分析:可以从以下几个维度去进行统计:
- 选择合适的测试工具,设定合理的测试方法以及需要确认的系统性能指标;
- 选择不同的测试工具,对测试结果进行对比,选择稳定且能反应系统真是性能表现的结果;
- 多次执行测试,收集大量的测试数据集和指标;
- 从不同维度解读分析数据,生成报告。
六、实战
使用CINEBENCH R23 软件,用于评估 CPU 性能,以下是详细拆解:
- 系统硬件与环境
- Processor(处理器):11th Gen Intel Core i5-1135G7
第十一代英特尔酷睿 i5 移动处理器,定位轻薄本,适合日常办公、轻度创作场景。 - Cores x GHz(核心与频率):4 Cores, 8 Threads @ 2.42 GHz
4 物理核心 + 8 线程(超线程技术),基础频率 2.42GHz ,可动态睿频(短时高性能)。 - OS(操作系统):Windows 10, 64 Bit, China (build 26100)
64 位 Windows 10 中文系统,版本号 26100 ,保障软件兼容性与功能完整。
- 测试功能区
- CPU (Multi Core)(多核测试):模拟多任务、渲染等场景,调用所有核心 / 线程。
- CPU (Single Core)(单核测试):反映单线程性能(如日常软件响应、游戏逻辑运算)。
- MP Ratio(多核效率比):测试后显示 多核分数 / 单核分数 ,体现多核优化程度(理想值接近 核心数×0.8 )。
- 排名对比区
当前选 CPU (Multi Core) 排名,列出不同 CPU 多核性能分数(数值越高越强): - 32C/64T @ 3 GHz, AMD Ryzen Threadripper 2 :32 核 64 线程,线程撕裂者 2 代,专业工作站级,多核分数 30054 。
- 24C/48T @ 2.7 GHz, Intel Xeon W-3265M CPU :24 核 48 线程,至强服务器 CPU ,多核分数 24243 。
- 后续为其他型号 CPU ,涵盖线程撕裂者、至强、酷睿等,分数依次降低。