背景
硬盘行业正在经历一场变革。多年来,在存储密度大幅增长的同时,作为硬盘设计最主要方面之一的逻辑块格式化大小(也称为扇区)却始终没有变化。2010 年左右,硬盘公司正在将扇区从传统大小 512 字节迁移到更大、更高效的 4096 字节(一般称为 4K 扇区),国际硬盘设备与材料协会(International Disk Drive Equipment and Materials Association,IDEMA)将之称为高级格式化。
关于高级格式化 4K 扇区硬盘(Advanced Format Disk)的维基百科说明
请注意时间点:
2009 年 12 月,经过与 IDEMA 的通力合作,提名高级格式化作为 4K 字节扇区标准的名称,并获准。同时,所有硬盘制造商承诺,自 2011 年 1 月开始,所发行的台式机和笔记本电脑产品的新型硬盘平台都采用高级格式化扇区格式。
Linux版本 2.6.31 或更高版本的内核支持高级格式化硬盘
Fdisk:GNU Fdisk 命令行实用程序可对硬盘进行分区。版本 1.2.3 和更高版本支持高级格式化硬盘。
Parted:GNU Parted 图形实用程序可对硬盘进行分区。版本 2.1 和更高版本支持高级格式化硬盘。
硬盘对 AFD 4K 支持
支持AFD分三类
4Kn (Native):完全支持 4K byte 扇区格式;
512e (Emulation):虽然先进格式化技术更有优势,但是现有的操作系统有的还不支持 4K byte 扇区格式,硬盘厂商为新出的 4K byte 扇区硬盘准备了一种 512e (Emulation) 的硬盘固件,利用固件来把传统的对于 512 byte 扇区的逻辑访问转换为对于 4K byte 扇区的物理访问;
512n:传统格式的硬盘,只支持512 byte的扇区;
physical_block_size logical_block_size 512n 512 512 512e 4096 512 4Kn 4096 4096 The physical_block_size is the minimal size of a block the drive is able to write in an atomic operation. The logical_block_size is the smallest size the drive is able to write (cf. the linux kernel documentation).
看硬盘上的logo
512e的logo
4Kn的logo
在OS层检查
方法一:
cat /sys/class/block/sdX/queue/physical_block_size cat /sys/class/block/sdX/queue/logical_block_size
方法二:
fdisk: # fdisk -l /dev/sdX | grep 'Sector size'
方法三:
smartmontools since 5.41: # smartctl -a /dev/sdX | grep 'Sector Sizes:'
方法四:
hdparm since 9.12: # hdparm -I /dev/sdX | grep 'Sector size:'
方法五
[root@base-test-01 ~]# blockdev --getpbsz /dev/nvme0n1 [root@base-test-01 ~]# blockdev --getss /dev/nvme0n1
网上卖的盘
对缺少 4Kn的困惑
按照IDEMA的规定,从2011年1月起,所有的硬盘都应该是AFD,但现在我们公司目前没有 4Kn 的硬盘,在淘宝和京东上没有找到 4Kn 盘的(logo和说明都没有),512e的盘倒是有一些,见上面的图。亚马逊上的硬盘全部注明是 4Kn,有一些有logo,有的没有。
512e的坑
在512e的硬盘上扇区的read-modify-write (RMW)
在512e的硬盘上,当要向硬盘写的数据小于4K时,会先把4k的一个扇区的数据读出,修改相应的部分后在写入。这个过程称之为read-modify-write (RMW),也有人叫写放大。这三种硬盘格式只有512e可能会出现这个现象
逻辑扇区和物理扇区不对齐的现象
由于512e硬盘的本身的缺陷,可能会发生逻辑扇区和物理扇区不对齐的现象,如下图:
如果发生这种现象,会让一次读写变成两次,同时会增加read-modify-write (RMW),也有人叫写放大的现象,造成IO性能大幅下降。避免的方法很简单,对硬盘不分区。
如果随机的在 512e 硬盘上创建的分区,发生物理扇区和逻辑扇区不对齐的可能性高达7/8,因此我们要高度重视这个问题,由于物理扇区和逻辑扇区的读写转换是在硬盘的固件(firmware)里面进行转换的,在OS层并不知道,最好的解决办法是不使用 512e 的硬盘。