我如何测试对硬盘的所有写入是否都与其 4k 扇区对齐?

我如何测试对硬盘的所有写入是否都与其 4k 扇区对齐?

我使用的是 Linux,有 4 个使用 4k 扇区的硬盘。我的文件系统和原始设备之间有几层:磁盘 > Linux Raid 5 > dm-crypt > LVM。

我找到的所有资源都解释了如何设置每一层,以确保该层上的写入与 4k 扇区边界对齐。但是,我找不到任何解释如何验证对硬盘进行的写入是否确实发生在 4k 边界上的内容。

我对重新检查我的设置以使用逻辑来确定它是否正确对齐不感兴趣。我想检查在写入磁盘时实际发生了什么。

我如何记录或查看对硬盘进行的写入的地址和大小,以便验证它们是否正确对齐?

答案1

不久前我问过自己同样的问题,并简单地做了以下事情:

使用 shell 多次向文件写入一个相当不寻常的字符串(例如“WackaWacka”),然后简单地使用十六进制转储进行搜索(使用外径) 磁盘的实际内容,并检查字符串的第一次出现是否恰好存储在 4k 块的开头。

提示:不要使用编辑器 - 它可能会创建你不知道的临时文件,其中也可能包含字符串。请按如下方式操作:

 $ for i in 1 2 3 4 5 ...
 >  do
 >   echo "WackaWacka!"
 >  done > mytestfile

因此 .sh_history 可能包含搜索字符串,但不会连续出现 5 次 ;-)

然后,只需搜索:

 # sync
 # od -c /dev/sda | grep 'W   a   c   k   a'

好吧,最好在相当空的磁盘上进行操作,以避免搜索千兆字节的数据;-)

答案2

写入一个 4k 块并观察读取/写入了多少数据iostat(“Blk_read”和“Blk_wrtn”列)。如果数据未对齐,则写入将首先触发读取,然后触发超过 4k 的写入。

不过,您需要小心不要测量任何元数据更新......或者只是通过进行 1000 次 4k 写入来淹没它们......因此,确保没有其他东西正在扫描磁盘或持有打开的文件(我认为lsof就足够了?),然后打开一个新文件,等待,运行iostat,将 4k 写入文件,同步写入(或者只是等待一段时间?)然后再次检查iostat

这似乎给了我一个合理的输出:

iostat  -d /dev/hdb3
dd if=/dev/urandom of=/mount/path/ofhdb3/tmptest bs=4k count=10000 conv=fdatasync
iostat  -d /dev/hdb3

Noteiostat的手册页声称以 512 字节块为单位进行报告,我看到写入了超过 80000 个额外的块,但没有读取任何块。如果您的对齐不正确,您将看到类似数量的读取(因为要写入未对齐的 4k,需要读取受影响的两个块,对其进行变异,然后将其写回)。事实上,对齐很重要的唯一原因是避免此类读取(所以这才是您真正想要寻找的:写入工作负载是否会触发读取?)

相关内容