SSD、擦除块大小和 LVM:原始设备上的 PV、对齐

SSD、擦除块大小和 LVM:原始设备上的 PV、对齐

我想安装一个新的 SSD,并将整个设备用作 LVM 的 PV - 换句话说:我甚至不打算在这个设备上放置一个分区。因此不需要在擦除块上对齐分区。

问题)

在ing时设置--dataalignment为擦除块大小,在 ing时设置为擦除块大小的倍数是否足够?pvcreate--physicalextentsizevgcreate

那么,假设我的 SSD 擦除块大小为 1024k,可以吗?

  • pvcreate --dataalignment 1024k /dev/ssd
  • vgcreate --physicalextentsize $(( x * 1024 ))k ...

还有什么需要考虑的吗?

假设我将 ext4 文件系统放在此 VG 中的 LV 上,将 ext4 区与 LVM-PE 大小对齐是个好主意,对吗?那么 ext4 区的大小应该等于 LVM-PE 大小,还是 LVM-PE 大小的倍数?

谢谢您的澄清!

答案1

是的,我也检查了 MBR/PBR/GPT/MD/LVM 的所有磁盘布局,得出了相同的结论。

对于您的情况(原始磁盘上的 LVM),如果 LVM-PE(物理范围)与 pvcreate 对齐 1MB,那么您可以确保所有进一步的数据分配都将对齐,只要您将分配大小保持为(1MB * N)。

由于“vgcreate -s”和“lvcreate -L”默认将无单位大小作为 MB 值处理,因此,一旦正确完成 pvcreate,您可能不需要太在意对齐。只需确保不要以 %/PEs(对于 lvcreate -l)和 B(byte)/S(512B - LVM 中的扇区始终为 512B)/K(KB)(对于 vgcreate -s 和 lvcreate -L)的形式给出大小即可。

=== 添加以澄清 ===

作为后续内容,虽然 SSD 作为整个设备可能具有 1024KB 擦除块大小,但每个内部闪存芯片的擦除块大小/ rw 页面大小可能约为 32KB-128KB / 512B-8KB。

虽然这取决于每个 SSD 的控制器,但只要您保持写入与每个内部芯片的擦除块大小一致(上例中为 32KB-128KB),就不会发生因额外的读取-修改-写入周期而导致的 I/O 损失。您只需要单个写入请求足够大(= 擦除整个 SSD 的块大小),这样您就可以通过高效驱动所有内部芯片/通道获得更好的性能。

我的理解是,1024KB 对齐只是一种安全措施,因为控制器芯片功能因供应商而异,并且闪存芯片的规格变化很快。更重要的是让操作系统级写入请求在一个大包中完成(在本例中为 1024KB)。

现在,话虽如此,在 1MB 对齐的 LVM 块上执行 mkfs(8) 几乎肯定会破坏文件系统级数据/元数据的 1MB 对齐。大多数文件系统只关心 4KB 对齐,因此它可能并不适用于 SSD(但据我所知,最近的 fs(如 btrfs)在分配内部连续块时会尝试保持 64KB+ 对齐)。但许多 fs 确实具有捆绑写入(例如:条带大小配置)的功能,以从 RAID 中获取性能,因此可以使用它来使对 SSD 的写入请求接近最佳。

我真的想用实际数据来支持我的说法,但这确实很难证明,因为当今的 SSD 控制器非常智能,一旦对齐大小和写入大小都“足够大”,就不会出现太多性能下降。只要确保它没有错位(不惜一切代价避免 <4KB 对齐)并且不要太小(1024KB 足够大)。

此外,如果您真的关心 IO 惩罚,请通过禁用设备缓存并使用同步读写重写测试进行基准测试来仔细检查。

答案2

据我所知,默认值已经足够好了。我认为您无需担心 --dataalignment 选项,因为 LVM 会自动尝试根据 sysfs 导出的值对齐所有内容,请参阅 lvm.conf 中的“data_alignment_detection”选项:

# By default, the start of a PV's data area will be a multiple of
# the 'minimum_io_size' or 'optimal_io_size' exposed in sysfs.
# - minimum_io_size - the smallest request the device can perform
#   w/o incurring a read-modify-write penalty (e.g. MD's chunk size)
# - optimal_io_size - the device's preferred unit of receiving I/O
#   (e.g. MD's stripe width)
# minimum_io_size is used if optimal_io_size is undefined (0).
# If md_chunk_alignment is enabled, that detects the optimal_io_size.
# This setting takes precedence over md_chunk_alignment.
# 1 enables; 0 disables.
data_alignment_detection = 1

此外,不需要为 vgcreate 指定 physicalextentsize,因为默认值已经是 4MB。

相关内容