Linux下4KB扇区磁盘实用指南 您所在的位置:网站首页 3t硬盘分区对齐多少扇区最好 Linux下4KB扇区磁盘实用指南

Linux下4KB扇区磁盘实用指南

2024-07-12 14:48| 来源: 网络整理| 查看: 265

本文转载自http://www.ituring.com.cn/article/22103 摘要:从2009年12月份开始,硬盘厂商开始发布使用4096字节扇区的硬盘,以取代原来普遍使用的512字节扇区。虽然因为操作系统的原因,4096字节的物理扇区被固件(firmware)分成了原来的512字节的逻辑扇区,但是使用更大的物理扇区对于磁盘布局和系统性能都会有影响。本文将考察这些影响,并在常见的Linux文件系统中使用基准测试来表现其实际的作用。由于自2010年以来,4096字节扇区变得越来越普遍,如何处理这些新硬盘也变得越来越重要。

扇区为什么要变成4096字节 如何你熟悉磁盘结构,你会清楚磁盘被分成了扇区,扇区大小一般是512个字节;所有的读写操作都涉及到整数倍扇区大小的空间。若深究下去,你会发现实际上在硬盘的扇区之间还包含很大一部分额外的数据。这些额外的字节被磁盘的固件(firmware)用来检测和修正每个扇区内的错误。当硬盘容量变得越大时,每平方厘米硬盘上存储的数据只会越来越多,从而导致更多的底层错误,这就限制了固件的错误修复能力。

解决这个问题的办法是增加扇区的大小,使用更强大的错误更正算法。和512字节扇区相比,在更大的扇区上,这些算法更正严重错误时所需的平均数据量(每字节)要更小。所以,使用更大的扇区有两个实在的好处:改善可靠性和增大磁盘容量(至少理论上如此)。

对于现实生活中的终端用户而言,增加扇区大小的影响力远不如增加显示器大小或增强CPU运算力来得明显。但是,校验磁盘所需空间的减小确实能够增大硬盘大小和增加其可靠性。

遗憾的是,对扇区大小为512字节的假设贯穿于整个软件链,比如基本输入输出系统(BIOS),启动加载器,操作系统内核,文件系统代码,以及磁盘工具,等等。虽然切换到4096字节大小的扇区已经酝酿了差不多十年,一些工具仍然没有完全做好准备。漏洞百出的微软XP系统就不用说了,然而,即使在Linux世界,一些这方面的问题仍然正在解决。

为帮助促进这个转变,第一批4096字节扇区磁盘将每个物理扇区翻译成8个512字节的逻辑扇区。对于BIOS,操作系统和所有的磁盘工具来说,磁盘扇区大小看来起仍然是512字节,虽然实际的物理扇区已经是4096字节了。西数(Western Digital)公司是发布这种硬盘的第一个厂商,它使用高级格式(Advanced Format)来表示物理扇区大小为4096但用软件变换为512字节逻辑扇区的磁盘。本文使用同一个术语统一代指西数的这类硬盘,以及未来其它厂商的类似硬盘。

为什么性能会受影响 遗憾的是,仅仅表面上通过固件改变逻辑扇区大小会降低性能。若想知道原因,你需要先理解文件系统数据结构和硬盘是如何分区的。

大多数现代文件系统使用4096字节或更大的数据结构。因此,大多数磁盘I/O操作是4096字节的整数倍。设想Linux在一个扇区大小为4096字节的磁盘上读写这些数据结构的情形。如果文件系统数据结构刚好与底层物理分区完美对齐(align),读写一个4096字节的数据结构只涉及到单个扇区,此时硬盘的固件不需要做任何额外的工作。但是如果文件系统数据结构与底层硬件对齐地不那么好,一次读写操作可能会涉及到两个物理扇区。对于读操作而言,并没增加多少额外的时间,因为读/写磁头访问连续的两个扇区是经常发生的,固件可以简单地舍弃不需要的数据。但是对于非对齐数据的写操作,固件需要首先读取两个扇区,修改两个扇区上的部分区域,然后在两个扇区上执行写操作。这个操作比在单个扇区上写4096个字节要费时地多。因此,性能降低了。

那么,你怎么知道数据结构是否正确地对齐了呢? 大多数文件系统将数据结构与所在分区的起始位置对齐。所以,如果一个分区开始于4096字节(8个逻辑扇区),它是正确对齐的。遗憾的是,直到现在,大部分Linux分区工具没有这样对齐。后面的一节,对齐分区,描述了怎样使用常用的Linux分区软件来对齐分区。

基准测试结果 你可能想知道正确对齐分区的重要性到底几何。为了回答这个问题,我们在几个Linux文件系统下试验一个1T的西数WD-10EARS高级格式(Advanced Format)硬盘,分别测试对齐分区和非对齐分区。这个硬盘使用全局唯一标识符分区表(globally unique identifier(GUID) Partition Table, GPT)来分区,对齐分区始于第40个逻辑分区,而非对齐分区始于第34个逻辑分区(这是分区表大小默认情况下GPT磁盘中第一个可用扇区)。我们在ext3fs, ext4fs, ReiserFS(version 3), JFS, XFS, 和Btrfs这几个文件系统下面测试,而Linux内核是64-bit 2.6.32.3。

我们用脚本来完成一系列的磁盘I/O操作,包括:创建一新的文件系统,解压Linux内核压缩包到测试硬盘上,将压缩包拷贝到硬盘上,读取测试硬盘上刚解压的文件,从硬盘上读取压缩包,删除Linux内核目录,等等。源Linux内核压缩包存于另一个磁盘上,在读操作测试时,结果被输出到/dev/null上。在每个写操作测试后,测试磁盘会被卸载,以确保Linux文件缓存中不再存有以前的操作。数据中包括了卸载磁盘操作所花费的时间。测试用内核压缩包约为365MB大小,远大于磁盘的64MB缓存容量。在每个文件系统上对每个测试执行6次:对齐分区3次,非对齐分区3次。测试之间的环境差异应该是比较小的。结果是非对齐分区的平均时间除以对齐分区的平均时间,以量化性能损失情况。大于1.00表示没有对齐影响了性能,等于1.00表示没有影响,小于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的敏感性影响了平均值,不考虑ReiserFS,平均值变成了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性能差,这只不过表示ReiserFS对对齐问题更加敏感而已。

除了在普通分区上测试文件系统外,我们还在LVM上针对不同文件系统做了同样的测试,结果与普通分区的结果类似。

上面的测试对实际使用有什么关系? 它们只是理论分析而已,你应该从确定物理扇区大小入手。如果你发现你的硬盘是高级格式(Advanced Format),那么你就应该正确对齐你的分区。

确定物理扇区大小 理论上,Linux内核应该在/sys/block/sdX/queue/physical_block_size伪文件中返回物理扇区的大小信息,而在/sys/block/sdX/queue/logical_block_size中返回逻辑扇区大小,其中sdX表示硬盘设备的结点名称(如sda,sdb等等)。实际上,物理块大小信息常带有欺骗性,至少第一代西数高级格式硬盘是如此。因此,磁盘工具无法正确地检测出这些硬盘的存在。(译者注:这是我看这篇文章的直接原因,买了一个西数硬盘,在Windows下分好一个区后,Gnome Disk Utility看不到剩下的未分区空间,而且提示没有对齐)

要解决这个实际问题,你必须在制造商网站上查阅硬盘的规范说明书,或通过其它方式来了解。/sys/block/sdX/device/model伪文件中存有设备的模型号(model number),你可以据此查到对应的制造商。

在当前第一代西数高级格式硬盘上,西数公司在硬盘上设置了一些标签来广告这是一个高级格式硬盘。然而,这些标签暗示只有Windows XP下硬盘才会存在问题,事实上,它也只考虑了Windows XP用户。因此,从上面的测试得到的结果来看,Linux用户对这些硬盘就需要自个儿操心了。

对齐分区 当前的西数硬盘使用一个jumper来处理Windows XP的兼容性。这个jumper的作用是将扇区编号偏移1位,这样,从扇区63(用于柱面对齐)开始的分区实际上位于逻辑扇区64。这是一个快捷却并不彻底的解决办法,只适于整个硬盘只有一个分区的情况。如果你创建多个分区,则除了第一个分区之外,其它分区仍然没有对齐。因此,你基本上不要使用jumper,相反,你应用使用Linux分区软件来创建正确的对齐分区。

Linux下面有三类工具来操作主引导记录(Master Boot Record, MBR)和GPT分区,每一类工具都有其对齐分区的方法。如果你有一块高级格式(Advance Format)硬盘,你最好是使用最新的Linux分区软件。

提示:如果你想双系统启动,包括一个Linux和另一个较旧的操作系统(要求柱面对齐),尝试让所有分区都开始于8个柱面整数倍位置。这同时满足8扇区的分区对齐和旧操作系统所要求的柱面对齐。

fdisk家族 fdisk工具家族作为util-linux-ng软件包的一部分,在大部分发行版上都能找到。用户可以直接编辑MBR数据结构,但不能创建和修改文件系统。在util-linux-ng 2.17中,fdisk并不对8扇区对齐功能提供任何的直接支持。而从2.17.2版本开始(写作本文时的最新版本),默认的对齐仍然是柱面对齐。

但是,你仍然可以使用任何版本的fdisk来正确地对齐分区。为实现这个功能,你应该在fdisk主目录中使用u来将默认的单位从柱面修改为扇区。然后,输入任意一个为8的整数倍的起始扇区。原则上,你可以指定的值最小为8。但是,最好是将第一个分区起始扇区指定为64或更高,这样可以在MBR和第一个分区之间的未分配扇区为启动加载器代码预留空间。微软Windows Vista和Windows 7的分区工具的第一个分区的起始扇区为2048,所以从跨平台的角度,这是一个安全的选择。从util-linux-ng 2.17.1开始,如果在主目录中用c禁用了DOS兼容模式,2048实际上就是默认值。我也强烈推荐2048作为第一个分区的起始扇区。

但是,需注意的是,fdisk并不自动对齐后续的分区。用MB或更大的单位作为分区大小然后在后续的分区中使用默认值,分区很有可能就正确对齐了,但并不绝对。为安全起见,你应该确认每一个分区都从8的整数倍扇区开始。

另外一个使用fdisk的方法是运行fdisk -H 224 -S 56 /dev/sda, 这一条命令改变了柱面/磁头/扇区(CHS)的几何关系,让程序对齐到柱面,从而保证了正确的4096字节对齐。

libparted 库 libparted库支援了许多Linux下支持文件系统操作的分区工具。在版本2.1中,文本模式GPU Parted程序(命令行是parted)只提供少量的对柱面边界对齐的支持。最好的方法可能是输入unit s来将默认的单位修改为扇区。然后,你可以手动地输入分区起始扇区,并准确地确认分区的起始点。

在版本2.2中,libparted开始为4096字节物理扇区硬盘提供更有用的策略。在这个版本中,你可以指定起始值为1M,然后扇区就会正确对齐。这个版本还会在分区没有对齐时显示警告。

使用图形用户界面(GUI)版本的GParted程序,你应该确保在Create New Partition对话框中取消"Round to cylinders"这个勾选框,如图3所示。你还必须设置当前分区的相对于上一个分区末尾的起始扇区,但是,如果你一开始就让分区正确对齐了,后面的也就自然地畅通无阻了。你还可以打开一个分区的Information对话框来了解其绝对起止扇区。

图3 使用GParted时取消"Round to Cylinder"勾选框(默认是选中的) 使用GParted时取消"Round to Cylinder"勾选框(默认是选中的)

GPT fdisk工具 GPT fdisk工具只对GPT硬盘有用。早于0.5.2的版本不支持任何对齐操作,但你可以手动地指定合适的起始扇区号。版本0.5.2和0.6.0至0.6.5将大硬盘(超过800G)的所有分区的起始扇区都调整为8扇区的整数倍,但是小硬盘则不在考虑之列。版本0.6.6为所有未分区的磁盘提供一个微软风格的2048扇区(1MB)对齐方式,并尝试推断磁盘上已有分区的对齐值。

0.5.2及以后的版本,你可以手动调整对齐值,使用专家菜单中的l选项即可。这个选项的参数为扇区数目,将其设置为8或8的倍数可以将高级格式磁盘正确地对齐。基于当前的对齐值,确认选项(任意目录中的v)能报告任何未正确对齐的分区。

对齐RAID分区 冗余磁盘阵列(Redundant array of independent disks, RAID)第5和第6级也有和高级格式硬盘类似的对齐问题,但是其原因与用于创建阵列数据带(stripe)大小有关,其大小一般为16KB至256KB。当使用RAID阵列,你应该将分区与数据带大小的整数倍对齐。默认对齐至2048扇区(1024KB)正渐渐成为一个新的标准,它在所有常见的RAID数据带大小下都工作良好。

已发布的测试结果显示不正确的对齐会导致5%-30%的性能损失,比起高级格式硬盘低多了。当从高级格式磁盘创建一个RAID磁盘阵列时,你无需任何多余的步骤。因为RAID对齐值是4096字节,这与高级格式硬盘的对齐要求是一致的。因此,你在RAID阵列上对齐分区了,其底层的磁盘扇区也就同时对齐了。

展望 当前,只有少数高级格式硬盘模型存在。相关报告显示这个技术会从2010年开始扩展到所有主要厂商的更多的硬盘上。可以想像,新的模型有可能会导致其它的性能问题,而不限于第一代高级格式硬盘的问题。

最终,硬盘厂商可能会放弃512字节扇区,或者它们可能会提供jumper来供用户选择是否使用兼容模式。如果你遇到一个4096字节扇区的硬盘,并且可以选择使用真正的扇区大小,你可能会愿意尝试一下,届时你需要意识到这些问题。

正如早前所提到的,从底层的BIOS往上的软件可能会假设硬盘的扇区大小。如果BIOS包含了这样的假设,在一块物理扇区大小为4096字节但固件没有转换为512字节逻辑扇区的硬盘上,你的计算机很有可能无法启动。GNU Parted 2.2对于非512字节扇区硬盘显示警告的功能只是实验性的。在一些对你重要的软件中还可能会隐藏着其它问题。使用最新的软件可能会帮助你解决问题,当使用一个传统的硬盘作为启动盘时,你就限制了自己的新技术硬盘只能作为数据盘了(结点号为/dev/sdb或更高)。

总的来说,新的硬盘的推广正谨慎而有序地进行。意思是,高级格式硬盘的使用方式很有可能会逐步明朗,包括其它新的硬盘类型,而且,发展的速度也会相对较快。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有