为物理扇区大小 4096 HDD 优化逻辑扇区大小

Mat*_*tan 27 performance io hard-disk

许多新硬盘的物理扇区大小为 4096。是否可以使系统使用相同大小的逻辑扇区大小,而不是默认的 512 逻辑扇区大小?

它会加速批量读取和写入吗?哪里可以配置?

max*_*zig 33

512 字节并不是真正的默认扇区大小。这取决于您的硬件。

您可以通过/sys伪文件系统显示磁盘报告的物理/逻辑扇区大小,例如:

# cat /sys/block/sda/queue/physical_block_size
4096
# cat /sys/block/sda/queue/logical_block_size
512
Run Code Online (Sandbox Code Playgroud)

这两个值有什么区别?

  • physical_block_size是驱动器能够在原子操作中写入的最小块大小。
  • logical_block_size是驱动器能够写入的最小尺寸(参见 linux 内核文档)。

因此,如果您有一个 4k 驱动器,那么您的存储堆栈(文件系统等)使用等于或大于物理扇区大小的东西是有意义的。

这些值也显示在 的最新版本中fdisk,例如:

# fdisk -l /dev/sda
[..]
Sector size (logical/physical): 512 bytes / 4096 bytes
Run Code Online (Sandbox Code Playgroud)

在当前的 linux 发行版上,程序(应该关心最佳扇区大小)mkfs.xfs会默认选择最佳扇区大小(例如 4096 字节)。

但是您也可以通过选项显式指定它,例如:

# mkfs.xfs -f -s size=4096 /dev/sda
Run Code Online (Sandbox Code Playgroud)

或者:

# mkfs.ext4 -F -b 4096 /dev/sda
Run Code Online (Sandbox Code Playgroud)

在任何情况下,大多数mkfs变体还将在执行期间显示使用的块大小。

对于现有的文件系统,可以使用如下命令确定块大小:

# xfs_info /mnt
[..]
meta-data=                       sectsz=4096
data     =                       bsize=4096
naming   =version 2              bsize=4096
log      =internal               bsize=4096
         =                       sectsz=4096
realtime =none                   extsz=4096
Run Code Online (Sandbox Code Playgroud)

或者:

# tune2fs -l /dev/sda
Block size:               4096
Fragment size:            4096
Run Code Online (Sandbox Code Playgroud)

或者:

# btrfs inspect-internal dump-super /dev/sda | grep size
csum_size             4
sys_array_size        97
sectorsize            4096
nodesize              16384
leafsize              16384
stripesize            4096
dev_item.sector_size  4096
Run Code Online (Sandbox Code Playgroud)

在分区上创建文件系统时,要检查的另一件事是分区起始地址是否实际与物理块大小对齐。例如,查看fdisk -l输出,将起始地址转换为字节,将它们除以物理块大小 - 如果分区对齐,则提醒必须为零。


psu*_*usi 1

不,这是不可能的,即使是也没关系。无论如何,IO 通常以至少 4096 字节为单位完成,并且通常更多。

  • 不确定这个陈述与我的问题有何关系。逻辑扇区大小可能意味着 IO 管道的某些部分中的块较小,加上 HDD 固件上不必要的模拟。介意澄清一下吗? (9认同)
  • 这个“答案”无论是其主张还是其结论都是完全错误的。逻辑大小是在格式化卷时设置的。逻辑和物理大小之间的不匹配会给基于闪存的存储等技术带来一定的成本。 (3认同)
  • 不正确。每当您的软件尝试在小于存储系统物理大小的单元上运行时,就会出现此问题。对于小于闪存擦除块大小的逻辑单元尤其如此 - 软件最终必须将未触及的部分复制到新的物理块,并且这会消耗擦除寿命,无论它是由操作系统文件系统代码还是由代码完成驱动器内部。 (3认同)
  • @Matan,我根本无法理解你的评论。我解释说,IO 并不是一次执行 512 字节,因此磁盘在 512 字节扇区中寻址这一事实并不重要。驱动器唯一需要进行模拟的情况是,如果您尝试执行非 4k 对齐的写入操作,并且由于 IO 通常是以 4k 的倍数完成的,并且现代分区工具可确保分区在 4k 边界上开始,那不会发生。 (2认同)
  • 请*实际阅读*我的评论。如果您格式化的驱动器的逻辑大小小于物理大小,则会出现问题。如果您使用等于或超过物理大小的逻辑大小和对齐方式进行格式化,则您的声明“仅适用”。您的答案有缺陷,因为它不包含您现在迟来添加的“关键”限定符,但仅作为评论而不是有缺陷的答案本身的文本。 (2认同)