ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ARM架构存储性能测试实战:Vdbench部署、调优与结果分析

ARM架构存储性能测试实战:Vdbench部署、调优与结果分析 1. 项目概述为什么要在ARM系统上折腾存储性能测试最近几年ARM架构的服务器和终端设备越来越多了从云服务商的ARM实例到各种边缘计算盒子再到我们手里的苹果M系列MacARM已经不再是手机和平板的专属。作为一名长期和存储打交道的工程师我最近就遇到了一个典型场景客户采购了一批基于ARM架构的边缘服务器打算部署一套分布式存储系统用于处理物联网产生的时序数据。在交付前我们需要对这套存储系统的性能基线进行摸底。这时候一个老牌但依然强悍的工具——Vdbench就进入了我的视野。Vdbench是Oracle出品的一款免费、开源的存储性能基准测试工具功能非常全面能模拟复杂的I/O负载。但问题来了我们团队和网上能找到的绝大多数Vdbench使用经验都基于x86环境。在ARM系统上从环境准备、编译安装到参数调优会不会有“坑”性能表现和x86环境下的测试结果又该如何对标这正是我写这篇长文的初衷。我将结合最近在飞腾、鲲鹏ARM服务器上的实战经历手把手带你完成从零开始在ARM Linux系统上部署、配置并运行Vdbench进行存储性能测试的全过程。无论你是运维工程师、性能测试人员还是对ARM生态感兴趣的开发者这篇文章都能给你提供一份可直接“抄作业”的详细指南。2. ARM测试环境搭建与Vdbench部署要点2.1 ARM测试平台的选择与系统准备首先得把测试的“舞台”搭好。ARM平台现在选择很多大体分三类云服务ARM实例比如AWS的Graviton、阿里云的倚天、华为云的鲲鹏实例。优点是开箱即用环境纯净适合快速验证和云端基准测试。物理ARM服务器如搭载飞腾、鲲鹏、Ampere Altra处理器的服务器。这是最贴近生产环境的测试能排除虚拟化层的干扰获得最真实的性能数据。开发板或边缘设备如树莓派、瑞芯微RK系列开发板。这类设备性能有限主要用来验证软件在资源受限的边缘场景下的兼容性和基本功能。我这次测试用的是国产飞腾FT-2000/64的物理服务器操作系统是CentOS 7.6的ARM版本。这里有一个关键点务必确认你的操作系统是ARM架构aarch64的。打开终端输入uname -m或arch命令如果返回aarch64那就对了。如果还是x86_64那说明你跑错了环境。注意很多Linux发行版都提供ARM版本如Ubuntu、CentOS、openEuler、麒麟等。建议选择你目标生产环境一致或接近的系统版本避免因内核或库文件差异导致后续问题。系统准备好后先进行基础更新并安装必要的编译工具这是为后续手动编译Vdbench做准备# 更新系统包 sudo yum update -y # 安装编译依赖JavaVdbench基于Java、gcc、make等 sudo yum install -y java-1.8.0-openjdk-devel gcc make glibc-devel # 验证Java安装确保版本为1.8或以上 java -version如果你的系统是Ubuntu或Debian系则将yum替换为apt-get即可。2.2 Vdbench在ARM系统上的获取与编译Vdbench的官方下载页面通常只提供预编译的JAR包和x86平台的二进制文件如vdbench主脚本和misc目录下的本地库。在ARM平台上我们需要手动编译其中的本地库组件。第一步下载Vdbench从Oracle官网或可靠的镜像站下载最新版本的Vdbench例如vdbench50407.zip。将其通过SCP或SFTP工具上传到你的ARM服务器上或者直接在服务器上用wget下载。第二步解压并定位关键源码unzip vdbench50407.zip -d vdbench cd vdbench解压后关键目录结构如下vdbench主脚本是入口。vdbench.jar核心Java程序。misc/存放需要编译的本地C源码特别是misc/source/目录下的*.c文件。第三步编译ARM架构的本地库这是ARM平台部署的核心步骤。Vdbench的部分功能如异步I/O依赖本地库来提升性能。# 进入源码目录 cd misc/source # 执行编译脚本。对于ARM(aarch64)通常使用内置的 build_linux 或 build 脚本但需要检查。 # 首先查看有哪些编译脚本 ls build*通常你会看到build_linux或build_linux64。我们需要针对ARM进行交叉编译或本地编译。幸运的是Vdbench的build脚本通常能自动检测架构。直接运行./build_linux或者如果脚本不支持自动检测你可能需要手动修改编译参数。打开build_linux脚本找到类似gcc或cc的编译命令确保没有指定-m64针对x86_64等架构标志或者将其改为适用于ARM的选项但通常留空让gcc自动处理即可。然后保存并再次运行。编译成功后会在misc/目录下生成新的二进制文件如libasync.so等。你可以通过file命令验证file ../libasync.so输出应显示为ELF 64-bit LSB shared object, ARM aarch64, ...这证明编译成功生成了ARM版本。第四步验证安装返回Vdbench主目录运行一个最简单的测试命令检查环境是否就绪cd ../../ ./vdbench -t如果看到输出中包含Executing: 1 threads, 1 file/thread等字样并且没有报找不到库或Java类的错误那么恭喜你Vdbench已经在你的ARM系统上成功安家了。3. Vdbench核心测试模型与参数深度解析Vdbench的强大之处在于其高度可配置的测试模型。一个完整的测试由多个“工作负载Workload”定义而每个工作负载的核心是几个关键参数文件。在ARM平台上测试理解这些参数的意义尤为重要因为ARM的CPU调度、内存访问模式可能与x86存在差异直接影响测试结果的解读。3.1 测试参数文件构成与核心逻辑一个典型的Vdbench测试需要至少两个参数文件hd(主机定义) 和fwd(文件系统工作负载定义)。复杂测试还会包含rd(运行定义)、sd(存储定义) 等。1.hd主机定义文件这个文件告诉Vdbench测试客户端即运行vdbench命令的机器的信息。在分布式测试中可以定义多个客户端。对于单机ARM测试一个简单的hd.arm文件如下hddefault,vdbench/path/to/your/vdbench,userroot,shellssh hdarm_host,system192.168.1.100vdbench指定Vdbench安装在目标主机上的绝对路径。这是ARM环境下容易出错的地方务必确保路径正确且该路径下的二进制文件是ARM版本。shellssh如果做多机测试需要配置SSH免密登录。单机测试可省略或使用shellvdbench。2.fwd文件系统工作负载定义文件这是测试的“剧本”定义了I/O模式。下面是一个用于测试顺序写的fwd_seq_write.f文件示例fsdfsd1,anchor/mnt/test_volume,depth2,width100,files1000,size1g fwdfwd1,fsdfsd1,hostarm_host,operationwrite,fileiosequential,fileselectsequential,threads16 rdrd1,fwdfwd1,fwdratemax,formatrestart,elapsed300,interval5我们来逐行拆解并说明在ARM环境下的考量fsd(文件系统数据定义)anchor/mnt/test_volume测试目录。务必确保该目录挂载了你想要测试的目标存储设备如本地NVMe SSD、外接磁盘阵列或网络共享存储。在ARM服务器上特别注意磁盘的IO调度器设置如mq-deadlinevskyber可以使用cat /sys/block/sdX/queue/scheduler查看和调整。depth2,width100,files1000,size1g这定义了一个文件树。创建2级子目录depth每级100个目录width总共100*10010,000个目录在每个目录中创建1000个文件每个文件1GB。总数据量高达10PB在ARM平台上尤其是内存有限的边缘设备切勿盲目设置过大否则文件创建阶段就可能耗尽内存或填满存储。应根据测试目标合理设置size和files。fwd(文件系统工作负载定义)operationwrite测试写操作。也可以是read、rw混合读写。fileiosequential顺序I/O。这是测试存储最大吞吐量的典型模式。与之相对的是random随机I/O用于测试IOPS。fileselectsequential按顺序选择文件。对于顺序I/O这个设置是合理的。对于随机I/O则应设为random。threads16并发线程数。这是性能测试的关键杠杆。在ARM多核服务器上如64核的飞腾你可以设置较高的线程数以压满CPU和存储带宽。但要注意线程数并非越多越好超过某个点后上下文切换开销会降低性能。建议从CPU核心数开始测试逐步增加。rd(运行定义)fwdratemax以最大速率运行。也可以指定一个具体值如fwdrate1000每秒1000个I/O操作用于限流测试。elapsed300测试运行时间单位秒。300秒5分钟是获得稳定结果的常用时长。interval5结果汇报间隔单位秒。每隔5秒输出一次实时性能数据。3.2 ARM平台特有的参数调优考量在ARM平台上运行Vdbench除了通用参数还需要关注以下几点JVM堆内存设置Vdbench是Java程序默认JVM堆内存可能不足尤其是在处理大量文件元数据时。可以通过修改vdbench脚本或在命令行指定./vdbench -f my_test.f -j “-Xms4g -Xmx8g”这将JVM初始堆内存设为4GB最大堆内存设为8GB。根据你的ARM服务器物理内存大小调整避免内存不足导致Full GC频繁影响测试。CPU亲和性pinning在NUMA架构的ARM服务器上如多路鲲鹏920将Vdbench进程及其线程绑定到特定的CPU核心和内存节点可以减少跨NUMA节点的内存访问延迟从而获得更稳定、更高的性能。这可以通过taskset命令实现taskset -c 0-31 ./vdbench -f my_test.f这将Vdbench绑定到0-31号逻辑CPU上运行。你需要根据服务器的lscpu输出信息来规划绑定策略。存储块大小blocksize在fwd定义中可以加入blocksize128k参数。不同的blocksize对性能影响巨大。大块如128K、1M利于测试顺序吞吐量MB/s小块如4K、8K利于测试随机IOPS。ARM处理器的大小端通常为小端与x86一致一般不影响块设备I/O但某些自研存储栈可能需要验证。4. 实战执行测试与结果分析解读4.1 执行测试命令与实时监控参数文件准备就绪后就可以开始测试了。进入Vdbench目录执行./vdbench -f fwd_seq_write.f -o results/output_dir-f指定工作负载定义文件。-o指定输出目录Vdbench会将详细的日志、结果文件包括一个重要的summary.html保存于此。测试开始后控制台会每隔interval秒输出一次实时统计信息包括MB/sec吞吐量。IO/sec每秒I/O操作数IOPS。Avg resp time平均响应时间毫秒。resp max最大响应时间。在ARM平台测试时建议同时监控系统资源以判断瓶颈所在# 监控整体CPU、内存、IO新窗口 top # 监控磁盘使用率、await、%util新窗口 iostat -xmt 2 # 监控网络如果测试网络存储如NFS、iSCSI sar -n DEV 2通过对比Vdbench的输出和系统监控数据你可以判断性能瓶颈是在存储介质本身还是在ARM CPU处理能力、内存带宽或是网络链路上。4.2 结果文件深度解读与性能报告生成测试结束后进入-o指定的输出目录。最重要的文件是summary.html用浏览器打开它可以看到格式美观的测试摘要。但作为工程师我们更需要关注纯文本的flatfile.html或直接解析日志。Vdbench会生成一个详细的.log文件。我通常关注这几个关键部分聚合性能数据在日志末尾附近查找avg_2-...这样的行。它提供了整个测试周期的平均性能。例如avg_2-16_rate: 1256.3 MB/sec, 10050.4 IO/sec, avg resp time: 1.59 ms这表示平均吞吐量1256.3 MB/s平均IOPS 10050平均响应时间1.59毫秒。响应时间分布Vdbench会统计响应时间在不同区间的分布如 2ms, 2-4ms, 4-10ms, ...。这对于评估存储的延迟稳定性至关重要。在ARM服务器上如果发现高延迟如100ms的I/O比例异常高可能需要检查驱动、固件或内核参数如vm.dirty_ratio,vm.swappiness。CPU使用率统计日志中会记录system和userCPU时间。在ARM平台上计算(systemuser)/elapsed_time可以得到平均CPU利用率。如果CPU利用率持续接近100%而磁盘%util不高说明测试受限于ARM CPU的处理能力而非存储带宽。此时可以尝试减少threads数或者检查是否有其他进程干扰。生成可视化图表虽然Vdbench自带的summary.html有图表但比较简单。我们可以利用输出的interval统计数据在日志中或单独的.csv文件里用gnuplot或Python的matplotlib绘制更专业的趋势图比如“吞吐量随时间变化曲线”、“响应时间CDF累积分布函数图”。这对于向客户或团队展示测试结果非常有说服力。5. ARM平台常见问题排查与性能优化锦囊在ARM平台上跑Vdbench我踩过不少坑。这里把常见问题和优化技巧记录下来希望能帮你省点时间。5.1 编译与运行类问题问题1执行./build_linux编译失败报错“找不到jni.h”或“无法识别JavaHome”。原因编译本地库需要JDK的开发头文件而不仅仅是JRE。解决确保安装了java-1.8.0-openjdk-devel或对应版本的openjdk-11-jdk。可以通过find /usr -name jni.h来确认头文件位置。如果安装了多个Java版本可能需要通过update-alternatives --config java设置默认JDK或者手动在build_linux脚本中设置JAVA_HOME环境变量。问题2运行./vdbench -t时报错 “Cannot find/load libasync.so” 或类似动态库错误。原因misc目录下的本地库不是ARM版本或者路径不对。解决确认misc/目录下是否有libasync.so等文件。用file misc/libasync.so检查其架构必须是ARM aarch64。如果架构不对回到misc/source/目录确保build_linux脚本正确执行并生成了ARM库。有时需要手动清理旧文件rm ../*.so后再编译。检查vdbench脚本中misc目录的路径是否正确通常脚本会自动定位。问题3测试过程中Vdbench进程意外退出或Java报OutOfMemoryError。原因JVM堆内存不足尤其是在测试定义了大量文件files参数很大时文件句柄和元数据会消耗大量堆内存。解决增加JVM堆内存如前所述使用-j “-Xms4g -Xmx8g”参数。减少fsd定义中的files数量或depth/width。检查系统可用内存free -h。确保有足够的物理内存。5.2 性能瓶颈分析与优化现象1吞吐量MB/s远低于预期且iostat显示磁盘%util很低但ARM CPU某个核心使用率100%。分析单线程瓶颈。Vdbench的某个环节可能是日志记录、结果收集没有充分利用多核。优化增加fwd中的threads数量这是最直接的方法。如果测试的是文件系统尝试使用directioyes参数在fwd中绕过操作系统页缓存减少CPU消耗。但注意这会使测试更接近裸设备性能延迟可能变高。检查是否因blocksize设置过小如4K导致单位I/O的CPU开销占比过高。可以尝试增大blocksize看吞吐量是否线性增长。现象2IOPS上不去但吞吐量尚可且磁盘await等待时间很高。分析存储设备本身尤其是机械硬盘或低端SSD的随机处理能力是瓶颈或者测试模式fileiorandom对ARM平台的CPU缓存不友好。优化确认测试的是随机IOPSfileiorandom, fileselectrandom。对于SSD检查其NVMe驱动是否是最新版以及PCIe链路速度和宽度是否正常lspci -vvv | grep -i nvme。在ARM平台可以尝试调整内核的I/O调度器。对于NVMe SSD通常建议设置为none无调度器使用多队列echo none /sys/block/nvme0n1/queue/scheduler考虑使用fwd的xfersize参数将多个小I/O合并为一个大I/O提交可能提升效率但这改变了测试模型。现象3测试结果波动很大间隔输出中性能数据忽高忽低。分析系统后台有干扰进程或存储设备如SMR硬盘、正在做GC的SSD自身性能不稳定也可能是ARM服务器的电源管理或CPU频率缩放导致。优化测试前尽量关闭不必要的后台服务。对于CPU将频率调控器设置为performance模式sudo cpupower frequency-set -g performance延长测试时间elapsed比如从300秒增加到1800秒30分钟用更长时间的平均值来抵消波动。在rd定义中使用warmup30参数让测试先“热身”30秒不记录数据使缓存和系统状态稳定后再开始正式测试和记录。5.3 一份ARM平台Vdbench测试检查清单在每次启动正式性能测试前花5分钟核对这份清单能避免很多低级错误[ ]架构确认uname -m输出aarch64。[ ]存储挂载df -h确认测试目录anchor挂载在目标设备上且空间充足。[ ]磁盘调度器cat /sys/block/[sdX|nvmeXnY]/queue/scheduler确认调度器设置合理SSD常用none或mq-deadline。[ ]CPU模式cpupower frequency-info确认调控器为performance。[ ]内存充足free -h确认可用内存远大于JVM堆内存设置。[ ]网络稳定如果是网络存储ping测试端到端延迟和丢包率。[ ]参数复核检查fwd文件中的threads,blocksize,operation是否符合测试目标。[ ]输出目录确保-o指定的输出目录有写权限且磁盘空间足够。[ ]监控就绪提前打开iostat,top,sar等监控命令的终端。最后我想分享一个在ARM边缘设备上测试的小技巧。这些设备往往资源紧张跑完整的Vdbench负载可能吃力。这时可以先用一个超短的测试elapsed10, interval1快速验证脚本和基本功能。然后重点使用fwdrate参数进行限流测试比如设定fwdrate100100 IOPS来评估存储系统在特定压力下的延迟稳定性这比盲目追求最大性能更有实际意义。ARM生态正在快速成长其上的存储性能测试也会成为越来越常见的需求希望这篇从环境搭建到深度分析的长文能成为你手边一份实用的参考指南。
返回列表