前段时间学习了一下Linux下IO调度,突然想起4k对齐和写入放大,就合一起作个笔记。
4k对齐
早期硬盘每个扇区以512字节为标准,新一代硬盘扇区容量为4096个字节,也就是所说的4k扇区。
硬盘标准更新,但操作系统一直使用的是512字节扇区的标准,所以硬盘厂商为了保证兼容性,把4k扇区模拟成512字节扇区。
通常文件系统的块(簇)是512字节的倍数,新的系统基本上都设成了4k的倍数。比如Linux的簇一般也是4k。
簇到扇区的映射关系变成了 簇(4k)->512B扇区->4k扇区
这就可能造成簇到扇区映射错位。
图中,颜色相同的8个块对应现在的4k扇区,每块512B,系统块为16k,图中的映射方式明显让块读取需要的扇区多出了一个。(对齐时只需要4个扇区)
显然,错位会造成读取文件时需要硬盘读取更多的扇区。所以才有了4k对齐一说。
如何查看系统是否4k对齐:
Windows下,开始-运行-“msinfo32”-进入系统信息
展开 组建-存储-磁盘,查看里面的分区起始偏移。
如果起始便宜正好是4k(4096字节)的倍数,说明4k对齐。
Linux下,使用fdisk -lu命令。
1 | Disk /dev/xvda : 21.5 GB, 21474836480 bytes |
2 | 255 heads, 63 sectors /track , 2610 cylinders, total 41943040 sectors |
3 | Units = sectors of 1 * 512 = 512 bytes |
4 | Sector size (logical /physical ): 512 bytes / 512 bytes |
5 | I /O size (minimum /optimal ): 512 bytes / 512 bytes |
6 | Disk identifier: 0x0007ce89 |
7 |
8 | Device Boot Start End Blocks Id System |
9 | /dev/xvda1 * 2048 41943039 20970496 83 Linux |
可以看到start的值,这显示的是对应扇区的起始位置。这里的扇区指的是512B大小的扇区。所以,如果起始扇区值是8的倍数,则说明磁盘4k对齐。
命令中u是让分区表用扇区值。
When listing partition tables, give sizes in sectors instead of cylinders.
写入放大(Write Amplification)
由于闪存必须先擦除才能再写入的特性,如果需要在写入钱清理被删除的数据,则需要把整个分块读出,然后擦除整个块,再写回去。
举个最简单的例子:当要写入一个4KB的数据时,最坏的情况是一个块里已经没有干净空间了,但有无效的数据可以擦除,所以主控就把所有的数据读到缓存,擦除块,缓存里更新整个块的数据,再把新数据写回去,这个操作带来的写入放大就是: 实际写4K的数据,造成了整个块(共1024KB)的写入操作,那就是放大了256倍。同时还带来了原本只需要简单一步写入4KB的操作变成:闪存读取 (1024KB)→缓存改(4KB)→闪存擦除(1024KB)→闪存写入(1024KB),共四步操作,造成延迟大大增加,速度变慢。所以说WA是影响 SSD随机写入性能和寿命的关键因素。
为什么写可以4K,而擦除只能一个块得擦:
闪存的基本单元电路,与EEPROM类似,也是由双层浮空栅MOS管组成。但是第一层栅介质很薄,作为隧道氧化层。写入方法与EEPROM相同,在第二级浮空栅加以正电压,使电子进入第一级浮空栅。读出方法与EPROM相同。擦除方法是在源极加正电压利用第一级浮空栅与源极之间的隧道效应,把注入至浮空栅的负电荷吸引到源极。由于利用源极加正电压擦除,因此各单元的源极联在一起,这样,快擦存储器不能按字节擦除,而是全片或分块擦除。 到后来,随着半导体技术的改进,闪存也实现了单晶体管(1T)的设计,主要就是在原有的晶体管上加入了浮动栅和选择栅,
为什么SSD会越用越慢?
SSD的特性决定了它的写入方式,不能直接覆写数据使得SSD多了擦除的操作,而写入单位与擦除单位的不统一又让SSD不停地在各个Block区块之间折腾。通常写入数据的延迟约为0.2ms,但擦除操作需要2ms左右,SSD用久了需要擦除的区块就会越多,性能自然也会变慢。
转载请注明:旅途@KryptosX » 4k对齐和SSD写入放大