SSD 4k对齐写放大
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对齐的