存储性能测试利器DiskSpd:从参数到实战,彻底搞懂磁盘基准测试
发布时间:2026/9/18 14:14:22 锦皓数字建站

用了这么多年服务器和存储我越来越觉得一件事测试存储性能最怕的不是数据不好看而是你根本不知道手里的数字是怎么测出来的。厂商宣传页面上的“百万IOPS”看着爽可真到自己验收、排障、扩容的时候拿不出一个可复现、不会被同行挑刺的基准数据等于没测。diskspd就是为解决这个痛点而生的。它是微软官方开源的磁盘/存储子系统基准测试工具业界很多存储厂商、云厂商、服务器整机厂在出厂验收和性能调优时用的就是它。网上关于它的中文资料不多大多是零散的命令抄来抄去很少讲清楚参数背后的逻辑和测试结果怎么解读。这篇文章我会从工具定位、安装部署、核心参数、常用场景、结果分析到踩坑实录完整走一遍我自己的用法和心得希望给正在做存储选型、数据库服务器压测、虚拟化环境验收的同行一个可以照着抄的参考。1. diskspd是什么为什么我最终选了它1.1 微软官方出品的存储基准工具到底强在哪diskspd的前身是微软内部存储团队用的测试工具后来以开源形式放出来现在托管在GitHub上由微软官方持续维护。它能做的事情概括起来就三类持续压测一个指定文件或整块磁盘产生可量化的IOPS、吞吐量MB/s和延迟数据并把这些数据按时间维度、线程维度、IO大小维度输出成结构化结果。它最大的价值在于标准化和可复现性。同一套参数命令跑在不同机器上对比结果才是有意义的。我自己经历过一个非常典型的场景业务侧报“数据库慢”DBA怀疑存储不行存储厂商又说自己跑基准没问题。两边数字对不上就是因为用的工具不一样、参数不一样。后来统一用diskspd把块大小、队列深度、读写比例、测试时长全部定死问题很快定位到是Linux虚拟机里队列深度配置太低导致的跟底层存储阵列本身没关系。这种“拉齐度量标准”的能力比工具本身的功能点更重要。1.2 它和CrystalDiskMark、fio有什么本质区别很多朋友一上来就问我用CrystalDiskMark测不行吗为什么非要用diskspdCrystalDiskMark这类图形化工具适合快速判断一块家用SSD“大概什么水平”操作简单几秒钟出结果看个乐没问题。但它的硬伤是测试模型固定、能调的参数少、结果汇总粒度粗而且测完你拿不到原始时序数据不方便做深入分析和横向对比。Linux生态下大家更常用fio。fio功能强大、灵活度高本质上是Linux IO栈上的全能选手。但如果是Windows环境fio的编译、驱动和Windows语义适配多少有点麻烦。diskspd作为微软官方出品在Windows上的兼容性和稳定性是最好的不需要额外装驱动普通命令行就能跑。它跟fio的设计哲学类似——通过组合不同的参数来模拟各种负载模型但命令风格和输出格式都是Windows系工程师更熟悉的。所以我的建议很简单Windows环境优先diskspdLinux环境优先fio跨平台对比时把两边的测试模型块大小、队列深度、读写比对齐。至于CrystalDiskMark就让它继续当轻量级参考工具吧别用它做正式验收。2. 部署准备别小看这几步很多人栽在环境上2.1 获取diskspd的三种方式diskspd的获取方式非常轻量没有安装向导没有注册表就是一个命令行exe。推荐三种方式GitHub官方仓库下载在微软官方的DiskSpd仓库Release页面下载最新的zip压缩包解压后根据系统架构选择对应目录里的diskspd.exe。Windows已有的系统里翻很多存储阵列管理端、虚拟化平台节点、数据库一体机出厂镜像里已经内置了diskspd可以直接在C:\Windows\System32或工具目录下搜到。包管理器如果你用Chocolatey或scoop也可以直接搜diskspd安装。解压出来你会看到类似这样的目录结构amd64、arm64、x86分别对应不同架构。日常使用直接切到amd64目录调用diskspd.exe即可。建议把该目录加入系统PATH环境变量省得每次敲一长串路径。2.2 测试环境的几个硬性约定在正式部署测试前有几个环境层面的条件必须确认否则数据出来很容易翻车用管理员权限运行命令行。diskspd某些参数比如禁用缓存、刷新缓存需要管理员权限普通权限窗口运行会报错或结果无效。测试盘最好是非系统盘、非数据盘。如果拿生产库正在写的盘跑基准测试轻则数据不准确重则可能干扰业务IO给线上应用造成明显抖动。我一般会在专门的测试机上挂一块独立的数据盘。测试文件大小至少是物理内存的两倍以上。原因后面细说这里先记住这条经验法则。测试期间关闭杀毒软件、备份任务、Windows Update、索引服务。这些后台组件会偷偷产生IO污染你的测试结果。如果有硬件阵列卡或存储阵列先确认写缓存策略。生产环境通常建议开启写缓存以提升性能但测试时如果要衡量“裸盘”能力需要把缓存策略调到Write Through或暂时旁路缓存。测试机和产品验收环境对缓存策略的要求不一样要提前想清楚你测的是“存储逻辑卷最终对外表现”还是“底层磁盘物理极限”。3. 核心参数详解把这些弄明白命令就不会写错diskspd上手快但很多人跑出来的结果不对根本原因是参数搭配错了却不知道错在哪。我用自己最常用的参数逐项拆解一遍相当于给你一张参数速查表。3.1 最常用的9个参数及背后逻辑参数含义我的常用值说明-b块大小Block Size4K、8K、64K、256K、1M模拟不同应用IO大小是影响结果的第一个关键维度-d测试持续时间秒30~120生产压测建议至少60秒以上太短无法反映稳态-t线程数4~8模拟多个并发进程同时访问磁盘-o每线程排队深度8~16每个线程在操作系统IO队列里允许同时挂起的IO数-r随机IO模式不加该项则默认顺序随机读写对机械盘、SSD的影响差异极大-w写比例百分比0、20、50、100-w0纯读-w100纯写-w20模拟8读2写场景-c创建测试文件的大小4G、8G、32G配合-c创建指定大小的文件用于测试-s预热时间秒10~30正式计时前先跑一段时间让设备进入稳定状态-Sh禁用硬件写缓存视场景使用测试底层物理盘极限时用测阵列逻辑卷对外性能时慎用3.2 参数之间的搭配关系比单个参数更重要参数不是越多越好关键是理解它们如何共同决定测试负载模型。线程数-t和排队深度-o是相乘关系。比如-t4 -o8系统里就有最多32个并发IO同时在飞。这时测出来的IOPS数据其实隐含了一个前提应用能同时压过来这么多读写请求。数据库高并发场景通常确实是高队列深度但普通桌面应用、轻量Web服务往往没这么高的并发测出来的高IOPS对它们意义不大。所以我测存储阵列性能时会分别跑-t4 -o8和-t1 -o1两组一组看极限一组看单线程低并发下的延迟表现。块大小-b决定了主导指标是IOPS还是吞吐量。4K、8K的小块IO测出来主要看IOPS和延迟1M、2M的大块IO测出来主要看MB/s吞吐量。千万别拿4K随机的结果去对比1M顺序的吞吐量这俩维度完全没法直接比较。写比例-w决定要不要关注“写放大”和缓存。-w0纯读很多设备都能吃满缓存性能很好看-w100纯写考验的是盘本身的写入能力和缓存回写策略。实际业务里最常模拟的是-w20大概对应OLTP类应用“读多写少”的特征。测试时间-d和预热时间-s一起决定了结果可信度。很多SSD在空盘刚开跑时SLC Cache撑着速度非常猛过几秒缓存写满后速度掉到TLC/QLC直写水平。-s30 -d120的意思是先跑30秒热机再正式测120秒这样得到的才算稳态性能。4. 实战操作从快速跑分到生产模拟的四个场景下面这几组命令是我在真实项目里反复用过的直接复制改一下就能用。4.1 场景一快速判断一块盘的基础能力3分钟版本适合刚拿到一块新盘、想快速了解它大致水平的时候。# 在D盘根目录创建8G测试文件顺序读块大小64K4线程排队深度8测30秒 diskspd.exe -b64K -d30 -t4 -o8 -w0 -c8G D:\testfile.dat # 顺序写其余参数同上 diskspd.exe -b64K -d30 -t4 -o8 -w100 -c8G D:\testfile.dat这两条跑完你基本能判断这块盘是机械盘还是SSD——顺序读写如果都在500MB/s以上基本是SATA SSD或NVMe入门级如果在200MB/s左右大概率是机械盘。这里有个细节顺序读测试里操作系统的文件缓存会把部分数据缓存到内存里导致结果偏高。为了更接近磁盘真实能力可以加上-i参数禁用缓存diskspd.exe -b64K -d30 -t4 -o8 -w0 -i -c8G D:\testfile.dat注意-i禁用缓存后测试期间对系统的整体IO行为会有影响不要在业务高峰期对系统盘做这种事。4.2 场景二模拟数据库OLTP负载小IO随机读写数据库OLTP这类应用核心特征是大量小IO、随机访问、读写混合。我的标准测法是这样# 4K随机8读2写8线程排队深度8预热30秒正式测120秒 diskspd.exe -b4K -d120 -s30 -t8 -o8 -w20 -r -c16G D:\testfile.dat这条命令生成16G测试文件随机4K块20%写80%读8线程每线程8个队列深度。跑完后重点看两个指标平均延迟和P99延迟。如果平均延迟在两三毫秒以内P99延迟在十毫秒以内对大多数数据库业务来说是一块合格的盘。如果P99延迟动不动几十毫秒上百毫秒那高并发下数据库事务肯定要出问题。4.3 场景三模拟文件服务器/大数据顺序读写文件传输、视频渲染、大数据批量导入这类应用关注的是大块的连续吞吐能力。# 1M顺序写测吞吐量 diskspd.exe -b1M -d60 -t4 -o4 -w100 -c32G D:\testfile.dat # 1M顺序读测吞吐量 diskspd.exe -b1M -d60 -t4 -o4 -w0 -c32G D:\testfile.dat这里的-c32G是为了保证测试文件远大于内存避免缓存干扰。测试文件越大越能反映磁盘的真实稳定吞吐而不是内存缓存的吞吐。如果机器内存是64G测试文件32G可能还不够“撑爆”缓存建议至少保证测试文件是内存的两倍。4.4 场景四对比测试时如何保持变量一致做存储选型或对比验证时最容易犯的错是两个场景的参数不完全一致。对比测试必须遵守下面的约定测试文件放同一个盘符目录结构名字尽量一致目录层级一致。文件大小完全一致。测试时长、预热时间、块大小、线程数、队列深度、读写比例必须逐项一样。测试期间同一时间段跑避免其他作业干扰。每轮测试前删除旧测试文件重新生成新的-c会自动创建。我一般还会把每次执行的完整命令记录在测试报告里防止过几周自己都忘了当时跑的是哪组参数。提升一点仪式感数据可信度和可追溯性会大幅提升。5. 结果解读从满屏数字里快速抓到关键信息diskspd默认输出非常详细刚接触的人容易看着满屏英文数字发懵。这里讲清楚最值得关注的东西。5.1 找到“total”行和分位数延迟命令跑完后关键的几段都在最后面。先把宽高拉到最大再看不然列会错乱。输出里有一张表格每一行分别对应“每个线程”的结果和“汇总”结果。直接找带“Total”字样的行如下面这样实际输出因版本有差异结构类似Total IO Read IO IOPS: 52341 MB/s: 204.6 Write IO IOPS: 13179 MB/s: 51.5IOPS和MB/s很容易理解。延迟部分需要特别说明如果加了-L参数结果里会输出延迟分布包括Min、Max、Average、P50、P90、P99、P999等分位数。有时候平均值很好看但P999延迟已经高得离谱说明设备在高并发下存在明显抖动这种盘放到生产环境就是定时炸弹。真实项目里我见过平均延迟0.5msP999延迟直接飙到2000ms的情况后来查出来是某个控制器固件在特定负载下做了垃圾回收。5.2 如何判断磁盘性能是否满足业务要求“性能好还是差”不能拍脑袋得对标业务的容量规划。这里有一个我常用的简单判断框架IOPS够不够先看业务侧峰值并发IOPS需求是多少再乘以1.5到2倍的冗余系数跟测试得到的IOPS对比。延迟达不达标数据库OLTP场景平均延迟通常希望在5ms以内P99在20ms以内如果跑的是同步写日志类应用延迟要求会更高。吞吐够不够大文件批处理场景算一下目标业务需要在多长时间内搬完多少数据再对比测试得到的MB/s。重要提醒测出来的“极限IOPS”和“业务可用性能”是两回事。极限测试是在队列深度拉满的情况下跑出来的真实应用如果并发没这么高根本用不到这么大的IOPS。反过来有些盘的极限IOPS很好看但一旦延迟要求收严到1ms以内可用IOPS会掉得很厉害。所以我的习惯是除了跑极限模式还要加一组-t1 -o1的单线程低队列测试专门看低负载下的延迟表现这组数据往往更贴近真实业务的体感。6. 常见问题与排查技巧实录diskspd用久了总会遇到一些让人头大的问题。挑几个我觉得最有代表性的整理出来。6.1 测出的写性能明显低于标称值是不是盘坏了不一定。先检查是不是触发了写缓存耗尽后的真实速度。很多消费级SSD大容量持续写入时SLC Cache被写满后会掉到一个很低的直写速度。把测试文件减小、测试时间缩短看着是恢复了但那是在缓存覆盖范围内的“虚高”数据。真要看稳态性能就得加长测试时间到3到5分钟盯着后半段的数字看。另外还要确认硬件写缓存是不是被禁用了。如果命令里加了-Sh等于告诉系统不要用硬件写缓存那测出来的就是底层裸盘能力数值自然会比开缓存低不少。测之前想清楚你要的是“对外表现”还是“物理极限”。6.2 测试结果波动巨大同一台机器两次跑差20%以上优先怀疑三件事后台程序干扰、散热降频、缓存状态。用任务管理器检查有没有杀毒、备份、系统更新在后台偷跑。如果是笔记本或被动散热的小主机多轮压测后SSD主控和CPU都会过热性能会明显下滑让机器凉一会儿再测。文件缓存的影响刚测完第一次测试文件很可能还在内存缓存里马上跑第二次读测试会得到“内存速度”而非磁盘速度。每轮之间可以通过重启或使用独立工具释放缓存或者干脆换一个不同名的测试文件。6.3 报告显示“Access is denied”或参数无效常见原因就一个当前命令行窗口不是管理员权限。另外确认执行目录里有正确的diskspd.exe不同Windows架构要用对应版本的exe有些精简系统可能还需要安装VC运行库。如果还是有问题把命令放到PowerShell里执行注意PowerShell里参数可以正常识别但要注意命令行里的路径用相对路径时当前目录别搞错。6.4 测试文件生成的盘符空间不够-c16G表示立即创建16G的文件如果目标盘剩余空间不足会直接报错。一个技巧是先用fsutil file createnew预创建稀疏文件或者用磁盘剩余空间精准控制大小。但更推荐的做法是专门准备一块测试盘盘子空了才开始测省得空间不足或者测试文件碎片化严重导致数据失真。6.5 我想测整个卷而不是单个文件行不行可以。diskspd支持直接对盘符做目标比如D:不带文件名工具会直接在卷上执行测试但这样做对分区上的文件系统结构有一定风险可能把已有数据覆盖写掉。我的建议是能测文件就测文件文件模型跟实际业务更接近而且直观、安全、易清理。只有物理盘验收或整卷性能摸底时才用卷级测试。7. 踩过坑之后我总结的几条实测心得先说说我对测试文件大小和缓存这件事的执念。曾有段时间我偷懒在物理内存32G的机器上用-c8G跑了文件服务器的吞吐测试结果顺序读跑出3GB/s我差点以为买到了神仙设备。后来一分析那根本就是内存缓存的速度文件才8G整块都被OS缓存住了磁盘基本没参与。从那以后我给自己立了个规矩测试文件必须大于物理内存两倍除非这个场景就是专门测缓存命中率的。这条经验至少帮我避免了五次误判。再就是队列深度这个参数真的是“魔鬼藏在细节里”。有一次给客户的虚拟化平台做存储验收厂商提供的测试报告用-o32跑出了非常漂亮的数据但客户实际虚拟机负载根本到不了那么高的并发业务方反馈“也就那样”。后来我们按-t2 -o4这种贴近常规虚拟机的低并发跑数字才跟客户实际体感对上。所以我现在看任何存储测试报告第一件事不是看IOPS而是看它用的块大小、队列深度、线程数先判断测试模型是否跟真实业务匹配再判断数值是好是坏。最后分享一个工作习惯我会把每次diskspd测试的完整命令原样贴在测试记录开头然后把测试环境阵列缓存策略、RAID级别、测试盘型号、驱动版本、是否开Hyper-V等一并记录下来。半年后回看这份记录你能轻松复现当时的场景也能快速发现环境变更带来的性能变化。存储性能测试不是跑一次就结束而是一条需要持续维护的基线数据链。diskspd这个工具本身很简单难的是想清楚每一次压测背后要回答什么问题。搞清楚测试模型和真实业务的对应关系你手里的每一组数字都会变得有说服力。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。