4k对齐

早期硬盘每个扇区以512字节为标准,新一代硬盘扇区容量为4096个字节,也就是所说的4k扇区。

硬盘标准更新,但操作系统一直使用的是512字节扇区的标准,所以硬盘厂商为了保证兼容性,把4k扇区模拟成512字节扇区。

通常文件系统的块(簇)是512字节的倍数,新的系统基本上都设成了4k的倍数。比如Linux的簇一般也是4k。

簇到扇区的映射关系变成了 簇(4k)->512B扇区->4k扇区

这就可能造成簇到扇区映射错位。

写放大 SSD(WA)

由于闪存必须先擦除才能再写入的特性,如果需要在写入钱清理被删除的数据,则需要把整个分块读出,然后擦除整个块,再写回去。

举个最简单的例子:

当要写入一个4KB的数据时,最坏的情况是一个块里已经没有干净空间了,但有无效的数据可以擦除,所以主控就把所有的数据读到缓存,擦除块,缓存里更新整个块的数据,再把新数据写回去,

这个操作带来的写入放大就是: 实际写4K的数据,造成了整个块(共1024KB)的写入操作,那就是放大了256倍。

同时还带来了原本只需要简单一步写入4KB的操作变成:闪存读取 (1024KB)→缓存改(4KB)→闪存擦除(1024KB)→闪存写入(1024KB),共四步操作,造成延迟大大增加,速度变慢。

所以说WA是影响 SSD随机写入性能和寿命的关键因素。

如何实现4K对齐

查看系统中磁盘物理大小扇区和逻辑大小扇区
cat /sys/block/vdg/queue/physical_block_size
512
cat /sys/block/vdg/queue/logical_block_size
512

可以看到我的这块测试磁盘的物理扇区大小是512字节,逻辑扇区大小也是512字节,这样我们物理块到逻辑块的映射都是512字节的。

linux查看现有磁盘是否是4k对齐,可以用fdisk -l -u
fdisk -lu /dev/sde

磁盘 /dev/sde:256.1 GB, 256060514304 字节,500118192 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000ba8b2

   设备 Boot      Start         End      Blocks   Id  System
/dev/sde1   *        2048     2099199     1048576   83  Linux
/dev/sde2         2099200    52111359    25006080   82  Linux swap / Solaris
/dev/sde3        52111360    94054399    20971520   83  Linux
/dev/sde4        94054400   500117503   203031552    5  Extended
/dev/sde5        94056448   500117503   203030528   83  Linux

Start 为 8的整数倍4k对齐,否则没有对齐。

默认情况都为4k对齐的