![硬盘报告其物理扇区大小有什么意义?](https://linux22.com/image/1468657/%E7%A1%AC%E7%9B%98%E6%8A%A5%E5%91%8A%E5%85%B6%E7%89%A9%E7%90%86%E6%89%87%E5%8C%BA%E5%A4%A7%E5%B0%8F%E6%9C%89%E4%BB%80%E4%B9%88%E6%84%8F%E4%B9%89%EF%BC%9F.png)
我有一块固态硬盘,可以配置为以两种不同的方式向操作系统报告其物理扇区大小:
选项1:逻辑 = 512 字节,物理 = 512 字节
选项 2:逻辑 = 512 字节,物理 = 4096 字节 (4K)
考虑到以下因素,操作系统了解 4K 物理扇区大小可以获得哪些好处:
操作系统必须以 512 字节扇区为单位与驱动器通信,无论
所有现代操作系统都与 4K 对齐,并使用 4K 或 4K 的倍数 I/O,无论
该设置似乎毫无意义,因为现代操作系统已经针对 4K 扇区驱动器进行了优化。现代操作系统不需要“询问”驱动器的扇区是 512b 还是 4K,因为操作系统默认以 4K 友好的方式执行所有操作。
例如,Windows 7 将分区对齐为 1MB(4K 的倍数),NTFS 簇大小为 4K 或其倍数,所有 I/O 都以 4K 或其倍数完成。Windows 不会在乎你拥有什么硬盘,它会在全部案件。
无论如何...我的 SSD 有这个“物理扇区大小”设置,所以它的存在一定有充分的理由...这就是我正在寻找的原因。
顺便说一句,就其价值而言,这款驱动器是一款英特尔固态硬盘 DC S3510. 驱动器的数据表说了这样的话(第 27 页):
通过使用 State=0、Option=1 的 SCT 命令 0xD801,ID Word 106 可以从 0x6003 更改为 0x4000(支持 4KB 物理扇区大小到 512B 物理扇区大小的更改)。
答案1
512 字节模拟是为了与旧系统兼容。但是,仅涉及物理 4K 扇区的一部分的写入可能会导致性能下降,因为需要先读取和修改该扇区,然后才能实际写入。
当旧版操作系统尝试写入高级格式磁盘时,可能会出现性能问题,因为写入的逻辑扇区可能与物理扇区不匹配。
- 当只读取 4K 物理扇区的一部分时,数据只是从物理扇区读取,性能不会降低。但是,当系统尝试写入部分物理扇区(例如模拟的 512 字节扇区,而不是整个物理扇区)的写入,硬盘需要读取整个物理扇区,修改硬盘内部存储器中更改的部分,并将其写回盘片。这称为读-修改-写(平均边距),此操作需要磁盘额外旋转一次,因此会降低性能。希捷对此的解释如下:
[...] 硬盘必须首先读取包含主机写请求的目标位置的整个 4K 扇区,将现有数据与新数据合并,然后重写整个 4K 扇区:
在这种情况下,硬盘必须执行额外的机械步骤,即读取 4K 扇区、修改内容,然后写入数据。这个过程称为读取-修改-写入循环,这是不可取的,因为它会对硬盘性能产生负面影响。
未与 4K 边界对齐的磁盘分区也会导致性能下降。
传统上,硬盘上的第一个分区从扇区 63 开始。Windows XP 和较旧的操作系统以这种方式对磁盘进行分区。较新版本的 Windows 将在 1 MB 边界上创建分区,以确保与物理扇区正确对齐。这称为对齐 0。
- 这个奇数是柱面头扇区 (CHS) 寻址用于INT 13 小时,遗产BIOS 应用程序接口用于磁盘访问。在使用 INT 13h API 的旧系统和引导加载程序中,所有分区都必须在柱面边界上开始和结束。即使在逻辑块寻址 (LBA)引入后,为了保持与旧版 API 的兼容性,使用了伪造的 CHS 值(与实际磁盘几何形状不对应)。由于 CHS 寻址最初支持每个柱面最多 63 个扇区,因此第一个分区将从扇区 63 开始。Windows XP(Service Pack 3 之前)和更早版本的 Windows如果系统卷不在柱面边界上,则无法启动。
由于 LBA 63 不是 8 的倍数(8 个 512 字节的传统扇区可装入 4K 扇区),因此以旧方式格式化的高级格式磁盘将具有未与 4K 磁盘上的物理扇区对齐的簇(文件系统数据分配的最小单位,通常为 4K),这种情况称为对齐 1. 因此,原本涉及 4K 数据的 I/O 操作现在跨越两个扇区,从而导致读取-修改-写入操作,从而降低性能。
如果操作系统始终在 4K 边界上写入数据,则有关物理扇区大小的信息是不必要的,但执行低级 I/O 的应用程序可能仍需要这些信息。
- 当驱动器报告其物理扇区大小为 4K 时,操作系统或应用程序可以判断它是高级格式驱动器,因此必须避免执行未跨越完整物理扇区的 I/O 操作。报告 512 字节原生扇区的驱动器不会施加此限制。虽然较新的操作系统通常会尽可能尝试以 4K 为单位读取或写入数据(使此信息变得无关紧要),但执行低级 I/O 的应用程序可能需要知道物理扇区大小,以便它们可以进行相应调整并避免导致 RMW 周期缓慢的未对齐或部分扇区写入。
您的 SSD 具有更改报告的物理扇区大小的功能,因为这对于与某些存储阵列兼容是必要的。
数据中心通常具有由传统 512n 驱动器组成的存储阵列。4K 驱动器(即使是模拟 512 字节扇区的驱动器)可能与此类阵列不兼容,因此此功能对于确保兼容性是必要的。请参阅此论坛主题:
我们不能直接将 4K 驱动器插入使用 512b 磁盘格式化的阵列中。许多阵列(最值得注意的是基于 ZFS 的存储,随着软件定义存储的兴起,这种存储越来越受欢迎)不会接受具有不同物理扇区格式的替换驱动器。
请注意,如果驱动器配置为使用 4K 扇区,则在现代系统上将获得更好的性能。
答案2
无论如何,当操作系统必须以 512 字节扇区与驱动器通信时,通过了解物理扇区大小,操作系统能获得什么好处呢?
逻辑大小是转移数据。由于这是一个块设备,因此主机和驱动器之间的任何数据传输都将是该逻辑块大小的倍数。
物理尺寸是最佳尺寸转移数据,并反映实际的大小读和写控制器/驱动器级别的操作。
当主机请求读取逻辑扇区时,控制器/驱动器将对包含该逻辑扇区的物理扇区执行读取操作。
当逻辑扇区大小等于物理扇区大小时,操作很简单。当逻辑扇区大小小于物理扇区大小时,控制器必须从物理扇区中提取逻辑扇区,然后将其传输到主机。
当主机请求写入逻辑扇区时,物理扇区的大小很重要。
当逻辑扇区大小等于物理扇区大小时,写入操作很简单,可以直接进行。扇区先前内容的情况不会影响写入操作。
当逻辑扇区大小小于物理扇区大小时,控制器必须首先对包含逻辑扇区的物理扇区执行读取操作。
如果读取成功,则将逻辑扇区插入物理扇区,并将物理扇区完整写入。
如果读取不成功(即使重试后),则无法完成写入操作。
如果操作系统使用物理扇区大小执行读写操作(通过利用 ATAPI 命令集中可用的多扇区操作),则写入操作将更有效地执行(并且不会出现不必要的不完整机会)。
逻辑扇区大小完全定义了操作系统如何与驱动器通信。没有例外。当您只允许以逻辑扇区大小进行通信时,知道物理扇区大小有什么用呢?
您所说的“没有例外”是不正确的。
与 IDE HDD 一起引入的 ATAPI 命令集始终能够使用参数执行读写操作sector count
。这仅仅是现有磁盘和软盘控制器接口的扩展,这些接口也能够执行多扇区读/写操作(只要扇区位于同一轨道上)。
答案3
如果操作系统知道底层物理扇区大小,它可以优化查询以尽可能减少物理操作。特别是对于 SSD,物理操作限制(4KB IOPS 限制)通常是设备速度的最终限制,因此能够充分利用此容量非常重要。
答案4
访问驱动器内某个位置有两种不同的方式,一种是 CHS 方案,另一种是 LBA 方案。
CHS 代表柱面、磁头、扇区,是确定从驱动器读取或写入位置的最底层方法。您告诉它使用柱面 x、磁头 y 和扇区 z,并将该位置的内容读取或写入内存(缓冲区)中的地址。它源自(传统的旋转生锈)硬盘的实际物理组件,其中有物理柱面和读取磁头。扇区是最小的可寻址单位,传统上固定为 512 字节。
LBA 是逻辑字节寻址,其中驱动器通过偏移量读取和写入扇区地址,例如,读取磁盘上的第 123837 个扇区或将其写入磁盘上的第 123734 个扇区(从零开始)。
问题是什么?每个值的范围都是有限的。事实上,由于 CHS 的限制非常严重,因此必须引入 LBA。对于 CHS,C(柱面)的可能值为 1023,而 H(磁头)的最大值为 255,S(扇区)的最大值为 63,这意味着在传统的 CHS 格式中,您最多可以映射 1024 个柱面 x 255 个磁头 x 64 个扇区 x 512 个字节,总共不到 8 GiB!使用 CHS,根本无法访问大于 8 GiB 的磁盘!
因此,LBA 引入了 32 位限制,为磁盘大小提供 2^32 x 512 字节或 2 TiB 的限制 - 这就是 MBR 磁盘不能超过 2TiB 的原因,因为它使用 CHS 和 LBA 来指定分区大小,并且两者都不能支持超过 2TiB 的任何内容。
已经引入了更新、更好的选项,例如 GPT 分区方案,它将 LBA 扩展至 64 位,为您提供远远超出您所需的 2^64 x 512 字节空间 -但有一个问题:许多旧硬件、旧操作系统、旧 BIOS 实现和旧驱动程序不支持 UEFI 或 GPT,许多人希望有一些东西可以更轻松地升级以超越 2TiB 限制,而不必从头开始重写整个堆栈。最后,我们达到了 4096 扇区大小。
看看,在上面讨论的所有限制中,有一件事是固定的假设:扇区大小。从第一天起,它就是 512 字节,并且一直保持这种状态。但最近,硬盘制造商意识到有机会施展一些魔法:采用传统的 CHS 或 32 位 LBA,只需将扇区大小替换为 4096(4k),而不是 512 字节。当操作系统通过请求 LBA 1(因为 LBA 0 是第一个)表示“给我磁盘上的第二个扇区”时,我们不会给它字节 512 - 1023,而是字节 4096 - 8191。
突然间,我们的 2TiB 限制升级到 2^32 x 4096 字节,即 16 TiB,而无需放弃 MBR、切换到 UEFI 或 GPT,或者其他任何事情!
唯一的问题是,如果操作系统不知道这是一个使用 4096 个扇区而不是 512 字节扇区的魔术磁盘,就会出现不匹配的情况。每次操作系统说“嘿,你,磁盘,把这 512 个字节写入偏移量 xxx”时,磁盘就会用尽4096 字节存储这 512 个字节(其余为零或垃圾数据,假设您不会出现内存下溢),因为它们不是以字节为单位进行通信,而是以扇区为单位进行通信。
因此,BIOS 现在(有时)包含一个选项,让您手动指定应使用 512 字节扇区大小,而不是较新磁盘使用的本机 4096 字节扇区大小 - 但需要注意的是,您不能使用它来访问 MBR 系统上超过 2TiB 的磁盘,就像在“过去的美好时光”一样。但是,支持 4k 的现代操作系统可以利用所有这些优势,使用这种魔力以 4096 字节块进行读写,然后就大功告成了!
(另外一个优点是速度更快,因为如果您一次读取和写入 4096 个字节,那么读取或写入 4GiB 数据的操作就会更少。)