概括
我试图了解如何计算最佳对齐32MiB
(65535
扇区)的后续分区的对齐,而不是通常的1MiB
(2048 sector
)。
背景
我最近买了一个SAMSUNG SSD 850 EVO (M.2 1TB)
,
# cat /sys/block/sdx/queue/optimal_io_size
> 33553920
# cat /sys/block/sdx/queue/minimum_io_size
> 512
# cat /sys/block/sdx/alignment_offset
> 0
# cat /sys/block/sdx/queue/physical_block_size
> 512
# cat /sys/block/sdx/queue/logical_block_size
> 512
# cat /sys/block/sdx/queue/hw_sector_size
> 512
# fdisk -l
> Disk /dev/sdx: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
> Units: sectors of 1 * 512 = 512 bytes
> Sector size (logical/physical): 512 bytes / 512 bytes
> I/O size (minimum/optimal): 512 bytes / 33553920 bytes
> Disklabel type: gpt
计算第一个扇区并不困难。
允许 GNU parted 自动计算对齐
(parted) mkpart primary 0% 100%
- https://wiki.archlinux.org/index.php/GNU_Parted#Alignment
- 可可https://unix.stackexchange.com/questions/38164/create-partition-aligned-using-parted
结果是从扇区65535
( 32MiB
) 开始的对齐。
手动计算对齐
(optimal_io_size + alignment_offset) / physical_block_size
- 从如何使用 parted 对齐分区以获得最佳性能作者:Ian Chard 2013 年 1 月 30 日引用 Red Hat Enterprise Linux 6 - 使用 parted 创建 7TB 分区时始终显示“生成的分区未正确对齐以获得最佳性能”
使用数据SAMSUNG SSD 850 EVO (M.2 1TB)
并应用公式可得出
(33553920 + 0) / 512 = 65 535
问题
通常在创建分区时,我只是将offset + length
前一个分区的添加为下一个分区的开始,例如,
(parted) mkpart primary 1MiB 2MiB
(parted) mkpart primary 2MiB 514MiB
(parted) mkpart primary 514MiB 1538MiB
...
尝试类似的事情SAMSUNG SSD 850 EVO (M.2 1TB)
(parted) mkpart primary 65535s 67582s # OK ~32MiB 33MiB
(parted) mkpart primary 67583s 100%
or
(parted) mkpart primary 33MiB 100%
导致以下警告:
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel?
补救
驱动器相当挑剔,我尽力计算精确的扇区。不幸的是,这导致了复杂的计算,我无法解释为什么分区已最佳对齐(align-check optimal <partition number>
)。
(parted) unit s
(parted) print free
Number Start End Size File system Name Flags
34s 65534s 65501s Free Space
1 65535s 67582s 2048s
67583s 131069s 63487s Free Space
2 131070s 1179645s 1048576s
1179646s 1245164s 65519s Free Space
3 1245165s 9633772s 8388608s
9633773s 9699179s 65407s Free Space
4 9699180s 1953467279s 1943768100s
1953467280s 1953525134s 57855s Free Space
据我所知,每个扇区必须以一个65535
间隔开始,该间隔对应于~32MiB(或65535+1 = 32MiB
)。我假设字节偏移量为,0
而不是1
。给定1MiB = 2048s
。
第一个分区大小为1MiB
,因此停止为65535 + 2048 - 1 = 67582
。
(parted) mkpart primary 65535s 67582s
如果前一个分区低于 ,则32MiB
下一个分区只需从 开始previous partition offset + 32MiB
。对于2
上述 parted 示例中的分区,它从~64MiB
( 65535s * 2 = 131070s
) 开始。大小为512MiB
( 512 * 2048 = 1048576
),因此,停止为131070 + 1048576 - 1 = 1179645
。
(parted) mkpart primary 131070s 1179645s
到目前为止一切顺利,但分区的最佳起点是什么3
?第一个可用的 32MiB 间隔是哪个偏移量?
1179645 / 65535 ~= 18,000223
当前使用 18 个间隔并在第 19 个间隔溢出;因此下一个分区应该从第 19 个间隔开始?
19 * 65535 = 1245165
尺寸为4096MiB
(4096 * 2048 = 8388608
),因此,止损为1245165 + 8388608 - 1 = 9633772
。
(parted) mkpart primary 1245165s 9633772
因此,对于下一个分区
9633772 / 65535 ~= 147,0019
148 * 65535 = 9699180
等等等等。
我之前没有发现有关此问题的任何讨论,感觉我把分区弄得太复杂了。
答案1
使用GPT fdisk 教程 gdisk
当以 为前缀时,它会自动计算后续分区的对齐方式+
,例如,
Last sector (8390656-15634398, default = 15634398) or {+-}size{KMGTP}: +2G
从最后提供的扇区创建 2GiB(吉比字节)。
分区在 处对齐2048s
。GNU parted 确认分区已对齐,align-check minimal
但未对齐align-check optimal
。
回报。blockdev --getalignoff /dev/sdx
0
答案2
有人说,沿着 ERASE BLOCK 和 NAND PAGE SIZES 对齐 SSD 很重要。
evo 840 显然具有不常见的擦除块和 nand 参数:1536kb 和 8k 我不确定 850(三星不愿意透露此信息(商业秘密))...
我已经想出了一个通用对齐值,它涵盖了所有已知的 SSD 及其擦除块和 Nand 页面大小。我建议使用 6291456 字节的偏移量(扇区 12288(6144kb=6mb)或任何倍数(12mb、18mb、24mb 等)。此偏移量应适用于任何已知的 ssd(或 hdd)。根据您处理的 NAND PAGE SIZE,我建议在格式化期间尽可能将您的 ALLOCATION UNIT SIZE 与 NAND PAGE SIZE 匹配,以避免 READ MODIFY WRITE 问题,但是如果需要,4k 也应该是几乎所有 ssd 的可接受值。即使您的驱动器内部配置过多,我仍然会保留 10% 的磁盘未格式化,以帮助避免 WRITE AMPLIFICATION 问题(我保留 17% OP)。我还建议,当您确定了您的参数后,不要使用“QUICK FORMAT”选项,而是进行正常格式化,SSD 不会花很长时间。让我知道这是否对您有帮助,请随意添加您可能有的任何想法......
PS 我发现 parted 使用起来很麻烦,我更喜欢 gdisk。在 gdisk 中,您可以使用 xpert 菜单下的“l”设置“设置扇区对齐值”。当您这样做时,创建的所有分区将自动计算为从该值的最接近倍数开始,从而导致所有分区正确对齐,前提是给定的值是正确的。
答案3
这个最佳 I/O 大小是错误的,这个错误被多次引用,例如 在 Ubuntu 上, 在 redhat 上. 可能更有帮助的是这个博客页面。
无论如何,这个 65535 只是两个字节的最大值,它甚至没有对齐 4 或 8 个 512 字节扇区。内核、parted、lvm 错误地遵循了它;不要试图遵守它。