我使用的是 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,需要读取受影响的两个块,对其进行变异,然后将其写回)。事实上,对齐很重要的唯一原因是避免此类读取(所以这才是您真正想要寻找的:写入工作负载是否会触发读取?)