如何在Windows上衡量存储性能和IOPS?
允许评估现有或者设计的存储系统性能的主要指标之一是" IOPS"(每秒输入/输出操作)。简而言之,IOPS是每个时间单位对存储,磁盘或者文件系统进行的读/写操作的数量。该数字越大,存储的性能就越高(坦白地说,必须将IOPS值与其他存储性能特征(如延迟,吞吐量等)一起考虑。
在本文中,我们将探讨几种测量Windows中存储性能(IOPS,延迟,吞吐量)的方法(我们可以将本手册用于本地硬盘,SSD,SMB网络文件夹,CSV卷或者SAN/iSCSI上的LUN)贮存)。
在Windows中使用磁盘性能计数器捕获存储I/O
我们可以使用"性能监视器"中的内置磁盘性能计数器粗略估计Windows中当前的存储I/O工作量。收集这些计数器数据:
- 启动Perfmon;
- 创建一个新的"数据收集器集",然后选择"手动创建";
- 选中"创建数据日志"->"性能计数器"复选框;
- 现在,在新数据收集集的属性中,为"物理磁盘"对象添加以下性能计数器(我们可以为特定磁盘或者所有可用本地磁盘选择计数器):
- 平均磁盘秒/传输
- 平均磁盘队列长度
- 平均磁盘字节数/传输
- 磁盘字节/秒
- 磁盘传输/秒
- 分割IO /秒
- 我们可以更改其他数据收集属性。默认情况下,计数器值每15秒收集一次。要显示实时磁盘性能,我们需要在"监视工具->性能监视器"部分中添加指定的Perfmon计数器。
- 仍然需要开始收集性能计数器数据(选择"开始"),并等待收集足够的信息以进行分析。之后,右键单击数据收集器集,然后选择"停止";
- 要查看收集的性能数据,请转到" Perfmon->报告->用户定义-> Data_Disk_IO> check_the_last_set"。默认情况下,磁盘数据显示为图形。
- 使用Ctrl + G切换到"报告"模式。
如何了解Perfmon收集的存储性能计数器?为了快速分析磁盘/存储性能,我们需要查看至少以下5个计数器的值。
分析计数器数据时,建议我们了解当前的物理磁盘(存储)配置(是否使用RAID或者Stripe,磁盘的数量和类型,高速缓存大小等)。
- "磁盘秒/传输"是对存储设备或者磁盘执行一次写/读操作所需的时间("磁盘延迟")。如果延迟超过25 ms(0.25),则磁盘阵列将无法按时处理I/O操作。对于高负载服务器,磁盘等待时间值不应超过10毫秒(0.1);
- 每秒磁盘传输量(IOPS)。每秒的读取/写入操作数。这是磁盘访问强度的主要指标(本文结尾处列出了不同磁盘类型的大约IOPS值);
Disk Bytes/Sec
每秒总磁盘吞吐量(读+写)。最大值取决于磁盘类型(常规HDD磁盘为150-250 Mb/s,SSD为500-10000);- 当操作系统必须将一个I/O操作拆分为多个磁盘请求时," Split IO/sec"磁盘碎片指示符。这也可能表明应用程序正在请求太大的数据块,而这些数据块无法通过一次操作进行传输;
平均。磁盘队列长度
已排队的平均读/写请求数。对于单个磁盘,队列长度不应超过2. 对于4个磁盘的RAID阵列,磁盘队列长度的阈值为8.
DiskSpd:在Windows中测试磁盘性能和IOPS
Microsoft建议使用DiskSpd
(https://aka.ms/diskspd)实用程序在磁盘(存储)系统上生成负载并评估其性能。这是一个命令行界面工具,可以在多个线程中对指定的驱动器目标执行I/O操作。我经常使用DiskSpd来衡量存储性能,并从特定服务器获得最大的可用读写速度和IOPS(当然,我们也可以衡量存储的性能,在这种情况下,diskspd将用于生成存储负载)。
DiskSpd不需要安装,只需下载存档并将其解压缩到本地磁盘即可。对于x64位系统,请使用" amd64fre"目录中的diskspd.exe版本。
我使用以下命令来测试磁盘的性能:
diskspd.exe –c50G -d300 -r -w40 -t8 -o32 -b64K -Sh -L E:\diskpsdtmp.dat > DiskSpeedResults.txt
重要。使用diskspd.exe时,在测试系统的磁盘和CPU上会产生相当大的负载。为了消除用户的性能下降,不建议在高峰时间在生产系统上启动它。
-c50G
文件大小为50 GB(最好使用较大的文件大小,以使其不适合存储控制器的缓存);
-d300
测试持续时间(以秒为单位);
-r
随机读/写操作(如果需要测试顺序访问,请使用);
-t8
线程数;
-w40
读写操作比例为40%/ 60%;
-o32
队列长度;
-b64K
块大小;
-Sh
不使用缓存;
-L
测量等待时间;
E:\diskpsdtmp.dat
测试文件路径。
压力测试完成后,可以从输出表中获得平均存储性能值。
在我的测试中,获得了以下性能数据(检查Total IO表):
- MiB/s 241(大约252 Mb/s,还不错);
- IOPS 3866(非常好!);
- 平均延迟66.206毫秒(相当大的延迟!)。
我们可以获取读取("读取IO"部分)或者写入("写入IO"部分)的各个值。
使用diskspd测试了多个磁盘或者存储LUN之后,我们可以将它们进行比较,或者为任务选择具有所需性能的阵列。
如何使用PowerShell测量存储IOPS,吞吐量和延迟?
我发现了一个PowerShell脚本(由Microsoft MVP Mikael Nystrom编写),它实质上是SQLIO.exe实用程序(一组文件存储性能测试)的附件。
注意2014年12月,Microsoft宣布终止对该工具的支持,并用更通用的工具" Diskspd"替换SQLIO,并从其网站上删除了SQLIO分发文件。因此,我们将必须自己搜索sqlio.exe,或者从我们的网站下载该文件(该文件位于PowerShell脚本的存档中)。
因此,下载包含2个文件的存档:SQLIO.exe和DiskPerformance.ps1(disk_perf_iops.ZIP 74 KB)并将其解压缩到任何文件夹中。
运行PowerShell脚本以估计磁盘性能和IOPS的示例:
.\DiskPerformance.ps1 -TestFileName test.dat –TestFileSizeInGB 1 -TestFilepath C:\temp -TestMode Get-LargeIO -FastMode True -RemoveTestFile True -OutputFormat Out-GridView
让我们考虑脚本参数:
–TestFileName test.dat
FSUTIL工具创建的文件的名称;
–TestFileSizeInGB 1
测试文件的大小。可能的值为1.5、10、50、100、500、1,000 GB。文件大小必须大于存储系统缓存的大小。否则,将针对缓存数据(而非磁盘)测量IOPS。
-TestFilepath C:\Temp
在此处,我们可以指定用于测量性能的磁盘以及将其中创建测试文件的磁盘上的文件夹。我们还可以指定网络共享文件夹(SMB)的UNC路径。
-TestMode Get-LargeIO
输入输出测量有两种选择。 " Get-SmallIO"可以测量IOPS,而" Get-LargeIO"可以测量数据传输速率。 SmallIO和LargeIO参数之间的区别在于,在测量速率时,块大小分别为8 KB和512 KB,以及相应的访问类型(随机或者顺序)。
-FastMode True
在快速模式下,每个测试运行10秒钟,否则需要60秒钟;
-RemoveTestFile True
测试结束后删除测试文件;
-OutputFormat Out-GridView
测试结果可以显示在PowerShell控制台("格式表")或者单独的图形图表窗口("网格视图")中。
在我们的案例中(使用了通过SAN连接的HP MSA 2040的VMFS数据存储上的vmdk虚拟磁盘),磁盘阵列显示的平均IOPS值约为15,000,数据传输速率(吞吐量)约为5 Gbit/s。 。
下表显示了不同磁盘类型的大约IOPS值:
类型 | IOPS |
SSD(SLC) | 6000 |
SSD(MLC) | 1000 |
15K RPM | 175-200 |
10K RPM | 125-150 |
7.2K RPM | 50-75 |
6个驱动器中的第5个具有10K RPM的RAID | 1000 |
我发现了一些流行的Microsoft服务在IOPS中对磁盘性能的一些建议:
- 拥有5,000个用户的Microsoft Exchange 2010,每个用户每天接收75个并发送30封电子邮件,至少需要3,750 IOPS;
- 每秒3,500个SQL事务(TPS)的Microsoft SQL 2008 Server需要28,000 IOPS;
- 面向10-100个用户的通用Windows应用程序服务器需要10-40 IOPS。