简单介绍advanced format disks(4K扇区磁盘)的产生与标准,并对比512e磁盘分区对齐与不对齐时的性能。
4K扇区 (1)
磁盘的高级格式(Advanced Format)使用4K作为扇区的大小(至少第一代Advanced Format就是指4K扇区)。传统磁盘的扇区大小是512B。有什么问题呢?这得从扇区的结构说起:磁盘上的扇区不是一个接一个紧密排列的,相邻的扇区之间有一个间隙(gap),并且每个扇区前面有一个sync字段和一个address mark字段,接着才是我们所知的512B数据(data),后面还有一个纠错码ECC(error correcting code)。并且:
$$ gap + sync + address mark = 15B $$
$$ data = 512B $$
$$ ECC = 50B $$
这样,磁盘空间的利用率是:
$$ \frac{512}{15+512+50}=88.7% $$
显然,增大扇区可以提高空间的利用率。另外,由于纠错码ECC只有50B,纠错算法也受限,无法使用更高级的纠错算法来提高磁盘的可靠性。于是,2010年的时候,International Disk Drive Equipment and Materials Association (IDEMA)完成了一个新的标准:采用4096B作为扇区大小,并且把ECC增大到100B。虽然ECC增大了,但现在一个扇区相当于原来的8个扇区,空间利用率还是提高了:
$$ gap + sync + address mark = 15B $$
$$ data = 4096B $$
$$ ECC = 100B $$
那么,磁盘空间利用率是:
$$ \frac{4096}{15+4096+100} = 97.3% $$
从下面一图一表(来自维基百科)我们可以看的更直观。
Description | 512B section | 4096B sector |
---|---|---|
gap,sync,address mark | 15B | 15B |
user data | 512B | 4096B |
error correcting code | 50B | 100B |
total | 577B | 4211B |
efficiency | 88.7% | 97.3% |
总结来说:引入4K扇区有两个好处:
- 提高空间利用率;
- 可以引入更高级的纠错算法,来提高磁盘的可靠性;
物理扇区和逻辑扇区 (2)
历史原因,给这个看上去很好的优化带来很多麻烦。因为直到现在,还有很多硬件、软件系统是基于512B的扇区设计的,包括芯片组,操作系统,数据库引擎、磁盘分区工具、文件系统等。为了和现有系统兼容,就引入物理扇区和逻辑扇区的概念。
- 物理扇区是磁盘驱动器读写的最小单元,也就是说,操作系统读写100B,磁盘驱动器也必须读写一整个扇区。
- 逻辑扇区是磁盘的firmware模拟出来的操作系统看到的扇区。比如,为了兼容老的软硬件系统,很多4K扇区的磁盘(512e类型,见下文4K扇区磁盘的分类),都模拟512B扇区。
4K扇区磁盘的分类 (3)
4K native (3.1)
简写为4Kn,这类磁盘firmware里不会把4K的物理扇区模拟成512B的逻辑扇区,也就是说,外部可见的逻辑扇区直接映射到内部的物理扇区。自从2014年开始,企业级的4K native磁盘已经在市场上流通了。这类磁盘的logo如下:
但,由于4Kn不能兼容512B扇区的软硬件系统,它的使用并不广泛。虽然Windows(Windows8和Windows Server 2012)和Linux(自从kernel 2.6.31)都支持4Kn的磁盘,然而很多操作系统不能从4Kn磁盘引导(见这里和这里),这些磁盘通常作为外部存储使用。
512e (3.2)
为了向下兼容,磁盘提供商在firmware里模拟512B扇区,目前这也是事实上的标准(见这里)。这类磁盘被叫做Advanced Format 512e, 或者512 emulation磁盘。它的logo如下:
4096B扇区和512B扇区之间的转换是磁盘的firmware完成的,对外界透明,也就是说,可以像读写传统磁盘一样来读写512e磁盘,如下图所示:
比如,操作系统读取512B数据,磁盘驱动器会:
- 读取目标扇区4096B;
- 从中抽取被读取的512B返回给操作系统;
对于读操作来说,这个过程带来的性能损失很小,可以忽略不计。但是对于写操作,问题就麻烦了。操作系统写512B数据,磁盘驱动器必须采用“读-修改-写”(RMW: Read-Modify-Write)的方式:
- 读取目标扇区4096B;
- 修改其中的512B;
- 把目标扇区写回;
可以预见,这种方式有明显的性能影响。但是,假如操作系统写入的要是整个4K,并且和一个扇区对齐,那么就不必采用RMW的方式了,性能的影响可以规避。
分区对齐 (4)
为了避免RMW带来性能损耗,最好能做到如下两点:
- 写入大小是4K的整数倍;
- 写入边界和物理扇区边界对齐;
Linux系统已经作了优化:
- 尽量写入4K的整数倍;
- 尽量和分区对齐。
注意第二点,这要求分区和物理扇区是对齐的。假如分区和物理扇区没有对齐,而每个写操作和分区又是对齐的,导致的结果是,每个写操作恰恰和物理扇区没有对齐。如下图所示:
可见,系统IO-1和系统IO-2和分区是对齐的。但是,分区和物理扇区没有对齐,导致磁盘IO-1和磁盘IO-2都没对齐,并且每个磁盘IO需要两次RMW,共4个RMW才能完成。所以,分区和物理扇区的对齐至关重要。parted可以检查已有分区是否对齐;并且在做新分区时,若没对齐,也会得到警告。下面我们做一个测试。
- 磁盘信息
如下,有一块size为6T转速为7200 rpm的512e的磁盘(512 bytes logical, 4096 bytes physical):
1 | # smartctl -a /dev/sde |
- fio jobs
我们将分别用这2个job来测试对齐和不对齐情况下,分区和Filesystem的性能:
1 | # cat job.write.part.4k |
- 分区对齐时的性能
1 | # parted /dev/sde |
- 分区不对齐时的性能
1 | # parted /dev/sde |
- 对比
Aligned | RawPartition or Filesystem | BandWidth (KiB/s) | IOPS | Avg SyncLatency (ms) |
---|---|---|---|---|
Yes | RawPartition | 480 | 120 | 8.4 |
No | RawPartition | 160 | 40 | 25.85 |
Yes | Filesystem | 132 | 33 | 33.81 |
No | Filesystem | 44 | 11 | 89.16 |
很明显,不对齐的时候,无论是裸分区还是文件系统,性能都降低至对齐的1/3。值得一提的是,测裸分区时,若使用ioengine=libaio, direct=1,则对齐与不对齐差别不大,原因是没强制sync,磁盘firmware可能对齐后再写到盘片。
小结 (5)
在了解advanced format disks标准的时候,我们猜测512e磁盘在分区不对齐的情况下会有严重的性能损耗。然后,我们通过实验证实了这一猜想。