1. 磁盘
磁盘(disk)是指利用磁记录技术存储数据的存储器。磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。如下图,磁盘是由圆形盘片再加上机械臂磁头构成。
1.1. 扇区
磁盘一直是存储设备的主流,磁盘的盘片是圆形,通过机械磁头以圆形方向磁道读写数据。如下图的玫红色部分的C区域,是一个扇形区域,即扇区(Sector)。那么一个Sector多大呢?磁头在盘片上是可以每次只读写一个字节的数据,但是这样面临一个问题。向磁盘写数据时,因为磁信号写入信噪比(SNR) 的原因,存在出错的可能性。因此,需要增加一种纠错机制,来让数据的写读更安全。综合读写性能,纠错算法等考虑,大家选定512为一个Sector大小,也即磁盘每次至少读写512大小(有效数据为512,但是实际数据比这大,因为还有纠错算法的校验位数据)。自此以后,磁盘的最小读写单元一直为SectorSize=512。
1.2. Advanced Format Disk
磁盘容量的增加,主要是通过提高磁盘单面积存储密度来实现的。存储密度的提升会导致磁信号信噪比相应提升,进而导致更多出错的可能性。针对这种情况,急需要一种快速提升纠错能力的新算法。原来12bit/512Byte的纠错算法,即每512Byte中只要出错小于等于12bit即可以纠正。单纯地想针对512Byte提升纠错能力,非常难实现。此时一种相对简单的提升纠错能力的方法提出来了。即将sector扩大到4096Byte,那么纠错能力相应地变为96bit/4096Byte。因为出错情况并不是平均分布的,例如4096Byte中出现90bit错误,且有20bit错误出现在前512Byte中,针对这种情况,原先的12bit/512Byte机制是无法纠错的,但是新的96bit/4096Byte机制是可以纠错的。
基于上述原因,磁盘将最小读写单元SectorSize改为4096Byte。这种SectorSize=4096在磁盘,存储工业协议统一称为Advanced Format Disk(高级格式盘,也被称为4K盘)。
磁盘的最小存储单元改为4096了,但是使用磁盘的计算机一直是按最小单元512Byte来读写磁盘。4K盘为此,增加了一个转换层来模拟512Byte的操作。如果操作系统写512,那么磁盘实际会先读出4K数据,再修改相应的512Byte,再以4K大小写入磁盘。磁盘的这种操作,被称为512e,即512 Emulation。
2. 操作系统
2.1. Sector
磁盘的发展历史是早于操作系统的。因此在操作系统创建时,操作磁盘是按磁盘的SectorSize(512)来操作的,这样性能才最好。后来,随着磁盘容量的提升,出现了512e的Advanced Format Disk。操作系统也能用这种新的512e盘,但是发现在写小文件时(文件大小1K左右),性能下降几倍。一通分析下来,操作系统发现,实际写512Byte文件,磁盘会先读出4K内容,再修改相应位置的512Byte,再以4K大小写入磁盘,这样的操作,性能必须几倍的下降。
2.2. 4K对齐
不仅如此,操作系统还发现,读写4K大小的文件,在某些情况下,速度会降低一倍。经分析,发现文件系统的MBR默认为63个Sector,那么实际读4K数据,磁盘实际读2个4K数据,然后前面4K部分取512Byte,后来4K数据取3584Byte,这样拼凑为一个4K数据。此时,发现针对Advanced Format Disk,文件系统MBR是否对齐4K同样非常影响读写性能。
2.3. 协议
操作系统发现这样不行,针对一些对磁盘小文件读写性能敏感的应用程序,无法让他们获取良好的体验。操作系统想知道磁盘内部的SectorSize是512,还是4096?于是,操作系统方和磁盘方坐在一起商量,提出一个新的概念,即:磁盘内部实际操作的最小单元被称为Physical Sector,磁盘对外提供操作接口最小单元为Logical Sector。操作系统原来是向磁盘发送25h的SCSI命令,来获取磁盘的容量和sector信息。如下图,磁盘回的内容包括两部分,前4Byte为磁盘总可用Sector数,后4Byte为SectorSize=0x200(512)。
原有的SCSI协议没办法传递两个Sector大小,所以大家商量升级一下协议,增加一条新的命令9Eh。9Eh命令兼容25h,其同样可以获取磁盘的总可用Sector数,以及SectorSize。这个SectorSize即磁盘的接口最小读写单元,也即新协议中的Logical Sector。另外9Eh命令返回值中还包括一个内容LOGICAL BLOCKS PER PHYSICAL BLOCK EXPONEN,即以指数的形式来表示Physical Sector的大小为几个Logical Sector。如下图中的:2^3(8),Physical Sector为8个Logical Sector,即4096。
2.4. 现状
操作系统不停地升级,新的Widnows和Linux均已经支持Logical sector设置为4096。其具体为:
但是很多老的软件,并没有升级,且有大量的用户。因此,针对消费级市场的磁盘,其为了兼容老的操作系统及其应用,其依然保持Logical Sector=512,Physical Sector=4096。但是针对企业级的磁盘,其使用新的操作系统,并且有专门的配套软件,所以企业级磁盘一般是Logical Sector=4096,Physical Sector=4096。
Windows下可以通过下面的命令来获取相关信息:
C:\Windows\system32>fsutil fsinfo ntfsinfo d:
NTFS Volume Serial Number : 0xa016d8a616d87eaa
Version : 3.1
Number Sectors : 0x00000000747057ff
Total Clusters : 0x000000000e8e0aff
Free Clusters : 0x000000000e7b2813
Total Reserved : 0x0000000000000000
Bytes Per Sector : 512
Bytes Per Physical Sector : 4096
Linux下使用如下命令获取相关信息:
michael@-Product-Name:/$ sudo fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 476.96 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: YS9203_512G
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
ATA或NVMe接口的存储设备(固态硬盘或SSD),除了兼容SCSI命令,可以通过9Eh来获取相关信息,还可以通过ATA协议或NVMe协议提供的Identify命令来获取相关信息。