为何更改为 4096 字节扇区?
如果您熟悉磁盘结构,就知道磁盘是被分解成扇区 的,大小通常是 512 字节;所有读写操作均在成倍大小的扇区中进行。仔细查看,就会发现硬盘事实上在扇区之间包括大量额外数据,这些额外字节由磁盘固件使用,以检测和纠正每个扇区内的错误。随着硬盘变得越来越大,越来越多的数据需要存储在磁盘的每一单位面积上,导致更多低级别错误,从而增加了固件纠错功能的负担。
解决该问题的一个方法是将扇区大小从 512 字节增加为更大的值,以使用功能更强大的纠错算法。这些算法可使每个字节使用较少的数据,从而比使用 512 字节扇区能纠正更多严重问题。因此,更改为较大尺寸的扇区有两个实际好处:提高可靠性且增加磁盘容量 — 至少从理论上讲是这样。
不同于增加的显示器大小或提高的中央处理单元(CPU)速度,对终端用户的现实获益可能没有这么明显。不过,专用于奇偶检验的空间减少了,可能加快较大磁盘的引入或提高磁盘可靠性。
遗憾的是,关于 512 字节扇区的假设潜藏在整个软件链中,在基本输入/输出系统(BIOS)、引导装载程序、操作系统内核、文件系统代码和磁盘工具等工具中。尽管向 4096 字节扇区的转变已经酝酿了多年,有些工具仍未做好准备。Microsoft? Windows? XP 经常被提出有故障隐患,即使在 Linux 中,有些问题也只是暂时得到纠正。
为帮助实现这种过渡,带 4096 字节分区的第一批磁盘将每个物理 扇区转换成 8 个 512 字节的逻辑 扇区。对于 BIOS、操作系统和所有磁盘工具,磁盘看起来有 512 字节扇区,但实际上底层物理扇区大小是 4096 字节。Western Digital 是第一家生产这种磁盘的制造商,它使用术语 Advanced Format 来代表带 4096 字节物理扇区且向 512 字节逻辑扇区转换的磁盘。本文对 Western Digital 的磁盘和使用类似技术的其他制造商的磁盘都使用同一术语。
为何有性能影响?
遗憾的是,在固件中改变表面扇区大小会降低性能。要了解个中原因,首先应了解文件系统数据结构以及如何进行磁盘分区。
最新的文件系统使用 4096 字节或更大尺寸的数据结构。因此,大部分磁盘 I/O 操作占用成倍数量的大小。想一下,当 Linux 想在一个带 4096 字节扇区的新磁盘上读写这些数据结构时,会发生什么事情。如果文件系统数据结构正好与底层物理分区大小一致,对 4096 字节数据结构的读写会产生对单一扇区的读写。硬盘的固件不需要做任何特别的事;但是当文件系统数据结构与底层物理扇区不完全一致时,读写操作必须使用两个物理扇区。对于读操作,这基本上不会花费很多额外时间,因为磁盘上的读/写头极可能连续通过两个扇区,且固件可丢弃它不需要的数据。另一方面,对不一致数据结构的写操作需要磁盘的固件首先读取两个扇区,修改两个扇区的分区,然后写两个扇区。该操作所需时间比 4096 字节占用一个扇区时所需时间多。因此,性能下降。
如何判断数据结构是否得到合理对齐? 大多数文件系统将其数据结构与包含其本身的分区开头对齐。因此,如果一个分区起始于一个 4096 字节(8 个扇区)边界,则表示它得到合理对齐。遗憾的是,直到最近,大多数 Linux 分区工具还没有创建以这种方式对齐的分区。下一小节 对齐分区,描述如何使用普通 Linux 分区软件对齐分区。
基准测试结果
您可能不了解合理的分区对齐有多重要。为此,我们对已对齐和未对齐分区以及若干 Linux 文件系统使用了一个 1TB Western Digital WD-10EARS Advanced Format 驱动。磁盘是通过全局唯一标识符(GUID)Partition Table (GPT) 系统进行分区的,其中已对齐的分区起始于逻辑扇区 40,而未对齐的分区起始于逻辑扇区 34(使用 GPT 磁盘与默认大小的分区表时的第一个可用扇区)。受测试的文件系统是 ext3fs、ext4fs、ReiserFS(第 3 版)、JFS、XFS 和 Btrfs。计算机运行一个 64 比特 2.6.32.3 Linux 内核。
一个脚本执行了一系列磁盘 I/O 操作,包括创建一个新文件系统、提取一个未压缩的 Linux 内核原始码到测试驱动上、复制原始码到驱动、读取测试驱动上刚才未压缩的文件、从驱动上读取原始码、删除 Linux 内核目录。源 Linux 内核原始码存储在另一个磁盘上,对于读测试,输出指向 /dev/null。在每个写测试之后,测试磁盘被卸载,以确保在 Linux 的磁盘缓存中没有操作。所报告的数字包括执行卸载操作所需的时间。内核原始码的大小是 365MB — 远远大于磁盘 64MB 的缓存。每个测试序列对每个文件系统运行 6 次,对合理对齐的分区运行 3 次,对未合理对齐的分区运行 3 次。隔次操作的变动很小。用平均未对齐时间除以平均对齐时间所得的值来确定所应用的不合理对齐对性能的影响程度。大于 1.00 的值表示不合理对齐产生一些性能损失。
许多测试产生适度的损失。针对文件系统创建的值介于 0.96(对于 XFS)到 7.94(对于 ReiserFS)之间,平均值为 2.79。由于文件系统不常创建,所以该损失不是那么重要。读测试生成的值介于 0.95 到 1.25 之间,这表示速度损失不超过 25%,如图 1 中所示。值为 1.00 时表示没有损失;更高的值则意味着性能下降。
图 1. 使用未对齐分区的读性能损失
大型文件写性能也受到适度损失。这些值介于 1.10(对于 XFS 和 JFS)到 6.02(对于 ReiserFS)之间,平均值为 2.10。一般情况下该值较高都归咎于 ReiserFS 的敏感性。删除它之后,其余 5 个文件系统的平均值为 1.31。文件检测效果类似,从 1.04(对于 XFS)到 4.78(对于 JFS),平均值为 1.97。将 JFS 作为离群值删除之后,平均值变为 1.40。
小型文件创建操作会产生最大的写性能影响(提取内核原始码)。对原始码提取的影响范围为 1.04(对于 ext4fs)到 25.53(对于 ReiserFS),平均值为 10.9。该测试中第二大性能影响者是 XFS,值为 1.82。由于这些数字是未对齐性能与对齐性能之比,值为 10.9 时表示一个原始码提取在合理对齐的分区上需时 10 秒,而在未合理对齐的分区上需时 109 秒 — 一个巨大的差别!对于 XFS,值为 1.82 时表示这个 10 秒钟的操作在未合理对齐的分区上需要花 18.2 秒的时间。
图 2 总结了所有文件系统的这些写性能损失。与前面相同,值为 1.00 时表示没有性能损失;更高的值表示性能下降。
图 2. 使用未对齐分区的写性能损失
注意,这些测试不反映文件系统的总体性能。例如,您不应该因为 ReiserFS 产生一些最大的性能差异,就认为它对性能的影响不好。不过,ReiserFS 对不合理的对齐比其他文件系统更敏感。
除了在分区中对文件系统运行测试之外,在一个 LVM 配置中还对文件系统执行了抽样检查,不管 LVM 分区是否经合理对齐。这些结果类似于原始分区结果。
实际情况是,到底这一切意味着什么?您应该首先确定您磁盘的物理扇区大小。如果您有 Advanced Format 驱动,就应该合理对齐您的分区。
确定物理扇区大小
从理论上,Linux 内核应该在 /sys/block/sdX/queue/physical_block_size pseudo-file 中返回物理扇区大小相关信息,在 /sys/block/sdX/queue/logical_block_size pseudo-file 中返回逻辑扇区大小相关信息,其中 sdX 是您设备的节点名称(通常为 sda、sdb 等)。但是在实践中,物理块大小信息是假的,至少对于第一代 Western Digital Advanced Format 驱动是这样的。遗憾的是,这表示磁盘工具不能合理检测这种磁盘的存在。
那么从实际来看,您必须在制造商的 Web 站点或通过其他方式查找您的驱动的规格。/sys/block/sdX/device/model 伪文件含有设备型号,因此您可以在这里查找,然后与制造商核对。
对于目前的第一代 Advanced Format 驱动,Western Digital 在驱动上贴有标签,以表明它们是 Advanced Format 驱动。遗憾的是,这些标签表示,只有 Windows XP 上的这些驱动有问题。以上基准测试结果显示,Linux 用户必须非常谨慎地对待这些驱动。
对齐分区
对齐 RAID 分区
独立磁盘冗余阵列(RAID)第 5 和 6 级含有与 Advanced Format 驱动类似的对齐问题,不过原因与用于创建阵列的数据带大小有关,通常为 16KB 到 256KB。使用 RAID 阵列时,您应当在成倍大小的数据带上对齐分区。作为一种新兴标准,2048 扇区(1024KB)上的默认对齐对所有常见尺寸的 RAID 条带都很适用。
已发布的测试结果表明,未合理对齐的性能损失大约为 5-30%,比未合理对齐 Advanced Format 驱动所造成的性能损失小多了。从 Advanced Format 磁盘上创建 RAID 阵列时,您不需要采取额外步骤。因为 RAID 对齐值是 Advanced Format 驱动所需的 4096 字节对齐的倍数,如果您为带 512 字节物理扇区的 RAID 磁盘阵列对齐分区,两种技术便都能实现。
当前的 Western Digital 驱动包括一个跳线,可用于设置 Windows XP 兼容性。该跳线能够将扇区编号移动 1 位,因而在真实的逻辑扇区 64 上置入一个分区,计算机将其识别为扇区 63 的开头(对于柱面对齐)。这是解决 Windows 中常见情形(即使用跨整个驱动的单一分区的扇区对齐问题)的一种应急方法。遗憾的是,如果您创建多个分区,除了第一个分区之外,所有其他分区可能都不会被对齐。因此,您几乎可以肯定不能 使用该跳线;二是使用您的 Linux 分区软件创建合理对齐的分区。
Master Boot Record (MBR) 的三个系列和 GPT 分区工具可供 Linux 使用,且每个工具都有其自己对齐分区的方式。如果您有一个 Advanced Format 驱动,那么您最好的选择就是运行最新的 Linux 分区软件。
提示:如果您想双重启动需要柱面对齐的 Linux 和一个旧版操作系统,尝试在成倍的 8 个柱面上调整所有分区的开头。这转化成用于最优磁盘性能的 8 扇区对齐和用于旧版操作系统的柱面对齐。
fdisk
系列
fdisk
系列是大多数 util-linux-ng
分发包附带的一部分,支持直接编辑 MBR 数据结构,但它不能创建或修改文件系统。通过 util-linux-ng
2.17,fdisk
对分区的 8 扇区对齐不提供任何直接支持。通过 2.17.2 及其以上版本(我写本文时是最新版本),默认对齐仍然是基于柱面的。
不过,您可以使用任何版本的 fdisk
合理对齐分区。为此,您应该在主菜单输入 u
,将默认单元从柱面更改为扇区。然后输入初始扇区值,应为 8 的倍数。在理论上,为实现合理对齐,您可以将第一个分区的扇区数设为 8;但是,最好将第一个分区设置为 64 或更高的值,为 MBR 与第一个分区之间的未分配空间中的装载引导程序代码留出空间。Microsoft 面向 Windows Vista 和 Windows 7 的分区工具将第一个分区起始于扇区 2048,从跨平台角度来讲,这里是开始分区的安全地带。事实上,从 util-linux-ng
2.17.1 开始,当您通过在主菜单输入 c
来禁用 DOS 兼容性模式时,这就是默认设置。我建议保持该设置。
但是,要注意,fdisk
不自动对齐随后的分区。如果您指定以兆字节或更大字节为单位的分区大小,然后接受随后分区的默认值,随后的分区可能会被对齐,但这不一定。出于安全考虑,您不应检验以 8 的倍数为初始值的每个分区。
使用 fdisk
的另一种方法是通过 fdisk -H 224 -S 56 /dev/sda
启动它,这会更改 cylinder/head/sector (CHS) 几何参数,从而确保在将程序与柱面对齐时有合理的 4096 字节对齐,这也是默认情形。
libparted
库
libparted
库驱动支持文件系统操作的多个 Linux 分区工具。通过版本 2.1,文本模式 GNU Parted 程序(命令名 parted
)仅对柱面边界的对齐提供支持。最好的方法可能是输入 unit s
,将默认单元更改为扇区。然后您可以在扇区中手动输入分区起始点,并精确检验分区起始点。
版本 2.2 开始向一种对带 4096 物理扇区的磁盘更有用的策略转变。通过该版本,您可以指定 1M
的起始值,然后扇区将得到合理对齐。当您的分区没有合理对齐时,该版本还会发出警告。
使用 GUI GParted 程序时,您一定要取消选中 Create New Partition 中的 “Round to cylinders” 复选框,如图 3 所示。您必须设置与前一分区末端相关的分区的起始扇区,但是如果您从一个合理对齐的分区开始,这就都能解决。您可以显示一个分区的 Information 对话框,以了解其起始和结束扇区从绝对意义上讲是什么。
图 3. 使用 GParted 时取消选中 “Round to cylinders” 复选框(这里显示它处于选中状态,这是默认状态)
GPT fdisk 工具
GPT fdisk 工具仅在使用 GPT 磁盘时才有用。0.5.2 之前的版本不执行任何对齐,尽管您可以通过指定合适的起始扇区数来手动对齐分区。版本 0.5.2 以及 0.6.0 到 0.6.5 将所有分区的起始扇区调整为 8 扇区边界,不过这仅针对大磁盘(超过 800GB 的磁盘),而不适用于小磁盘。版本 0.6.6 为所有未分区磁盘引入一种 Windows 样式的 2048 扇区(1MB)对齐,并试图通过现有分区推断过去使用的磁盘对齐。
通过 0.5.2 及其后期版本,您可以通过专家菜单上的 l
选项手动调整对齐值。该选项将大量扇区作为一个选项。为实现对 Advanced Format 磁盘的合理对齐,将该值设为 8 或其倍数。验证选项(任何菜单上的 v
)基于当前对齐值报告未合理对齐的任何分区。
前景
目前仅有少量 Advanced Format 硬驱模型可供使用。新闻报道表明,该技术从 2010 年开始将会扩展到来自所有主要制造商的更多驱动。可以想象得到,新模型会遭遇与第一代 Advanced Format 驱动不同的其他性能问题。
最后,制造商可能会丢弃 512 字节扇区这个构想,或提供跳线来支持用户选择是否使用该兼容性特性。如果您遇到一个带 4096 字节扇区、但可选择真实扇区大小的驱动,您可能希望使用它;不过,您需要注意一些警告。
正如之前所述,来自 BIOS 的软件可能包括关于硬盘扇区大小的假设。如果 BIOS 包含这样一个假设,那么您的计算机可能不会从一个含 4096 字节扇区且缺乏到 512 字节扇区的固件转换的磁盘上启动。自版本 2.2 起,对于除 512 字节扇区之外都属于试验性扇区的磁盘,在该磁盘上启动 GNU Parted 时,它自动显示一个支持该磁盘的警告。其他问题可能潜藏在对您很重要的软件中。使用最新的软件可能会帮助您解决这些问题,例如可以将传统磁盘作为启动磁盘使用,将新技术磁盘仅作为数据磁盘使用(/dev/sdb 或更高)。
总之,在处理不同寻常的新磁盘时一定要谨慎。Advanced Format 磁盘的当前样式以及其他新驱动类型可能很快就会尘埃落定。
Roderick W. Smith 是一位顾问兼作家,他撰写了十多本关于 UNIX 和 Linux 的书,包括 The Definitive Guide to Samba 3、Linux in a Windows World 和 Linux Professional Institute Certification Study Guide。他还是 GPT fdisk 分区软件的创建者。他目前定居罗得岛州的 Woonsocket 市。