如何判断硬盘是否使用SMR

如何判断硬盘是否使用SMR

到目前为止,我知道这cat /sys/block/<devicename>/queue/rotational会告诉我我的驱动器是 SSD 还是 HDD。有没有类似的东西可以查出它是否使用SMR(叠瓦磁记录)?

答案1

唯一确定的方法是使用足够的随机写入访问对驱动器进行基准测试。 “驱动器管理”SMR 应该对主机完全透明,有时制造商不会提及 SMR。然而,“透明”仅涉及逻辑行为,而不是性能(或延迟)。

我建议遵循以下步骤。fio按如下方式运行(首先cd进入磁盘上的目录进行测试,因为以下操作将在当前工作目录中创建基准测试文件):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randwrite --size=500g --io_size=1500g --blocksize=10m --ioengine=libaio --iodepth=1 --direct=1 --numjobs=1 --runtime=3600 --group_reporting

此示例将创建填充伪随机数据的 500 GB 文件,然后在其中选择一个随机位置并将 10 MB 伪随机数据写入该文件。然后,它会重复选择随机位置并写入长达 1 小时或直到写入 1.5 TB。观察 ETA 线,如下所示:

Jobs: 1 (f=1): [w(1)] [20.0% done] [0KB/40960KB/0KB /s] [0/4/0 iops] [eta 00m:28s]

上述命令将每 5 秒发出一个新的 ETA 行。查看上面斜杠 (40960KB4) 之间的当前吞吐量和 IOPS。对于 SMR 驱动器,您应该首先获得良好的值(100MB+/s 和 10+ IOPS),但随着测试的进行以及 SMR 驱动器的内部缓存填满(通常约为 20 GB),性能将会下降。有时会接近启动速度,有时会长时间在 0 MB/s 和 0-1 IOPS 左右。但绝对不应该有错误。

请注意,SMR 驱动器在使用或基准测试时会变慢!某些驱动器支持 TRIM 命令,fstrim可能有助于使驱动器速度恢复到原始速度。

即使没有 TRIM,一个做得好的“驱动管理”SMR 在空转供电足够长的时间后也将恢复其原始速度。如果磁盘在内部缓存完全刷新到 SMR 区域之前进入睡眠状态,您可能需要禁用磁盘降速(电源管理)。作为替代方案,您可以设置一个时不时写一点的外观。即使是单线,例如

while true; do date >> timestamps.txt; sleep 5m; done

在设备上存储的目录中进行测试就可以了,完成后只需使用 Ctrl+C 结束即可。对于我使用的 Seagate SMR 硬盘,完全刷新缓存似乎需要大约半个小时。在此期间,驱动器听起来像是正在写入数据,即使计算机没有向驱动器写入任何内容。不幸的是,我不知道有什么方法可以查询驱动器的刷新状态。要么听一下驾驶声音,要么只是等待足够长的时间。

示例:希捷 SMR 硬盘似乎很乐意在 SMR 刷新过程中进入睡眠状态(可能是为了假装对用户完全透明),并在将来再次唤醒时继续刷新。这是透明的,即使断电也不会发生数据损坏。然而,如果您时不时地写入大量数据,然后立即将驱动器置于睡眠状态(例如,使用此类驱动器作为备份驱动器,在备份逻辑完成后立即卸载并断开连接),这会导致性能非常差。下次您进行另一个备份时,新备份将与先前备份的 SMR 刷新竞争,并且性能将非常低。如果您保持此类驱动器始终通电,并且一次最多只能写入 10 GB,那么它将与普通 PMR HDD 驱动器一样快或更快。

答案2

现代版本sg3_utils有一个命令 sg_rep_zones,它将询问驱动器并询问其 SMR 配置。如果您的发行版没有最新版本,您可能需要手动构建它。

这可以明确地告诉您驱动器是否SMR。

但是,即使命令报告Report zones command not supported,也不能确定驱动器不是SMR。一些 SMR 驱动器使用“驱动器管理”SMR,这意味着驱动器可以神奇地处理所有事情,您无需担心。在这种情况下,它不一定支持报告区域命令。

另一件要尝试的事情 - 查看驱动器是否支持“unmap”或“trim”命令 - sg_unmap,也是 sg3_utils 的一部分。非 SMR 驱动器不太可能支持该命令(但同样,并非所有 SMR 驱动器都支持它)。

相关内容