磁盘分区对齐详解与配置 – Linux篇
介绍
许多系统管理员可能不曾听过磁盘分区对齐之说,甚至一些有经验的存储管理员对分区对齐也不甚了解。磁盘分区不对齐现象是什么,为什么会造成比较严重的性能下降?相反,配置正确的分区起始位置(Offset)设置会使存储系统发挥更大的性能潜力。文章就磁盘分区对齐进行的介绍,并且给出了在Windows平台上如何配置的方法。
什么是磁盘分区对齐(Disk Alignment、Partition Alignment)
Windows的磁盘有一种结构叫做Master Boot Record(MBR),它的默认大小为63个Block(每个大小为512字节)。它的存在使得磁盘的初始位置和的磁盘上第一个分区的初始位置有63个Block的错位。如果磁盘的单个Track大于63个Block的话。这就会导致默认的初始的位置是从第64个开始。使文件系统的中的Track和位于磁盘中的两个Track之上。这种不对齐现象会导致存储系统的性能下降,原因是单个I/O请求会跨越多个磁盘上的Track,从而导致存储系统的额外性能开销。特别是对于一些随机I/O比较较大的应用程序,影响将更大。
而对于Windows 2003以后支持的GPT Disk,也会存在磁盘分区不对齐的现象,但是结构有所不同。如图1所示(图中单位为Block,512字节),所有的分区由1MB大小(2048 Block)构成,第一个分区从LBA 34开始,即17KB大小位置。这也就意味着所有的分区会有17KB的不对齐的情况发生。同样会导致I/O读写性能影响。
存储系统的磁道区域与Linux分区对齐问题
出于最大化性能需求,任何到后端存储阵列的I/O需要通过配置适当的结构化,从而避免任何I/O操作跨界现象的发生。如果I/O操作跨越多个界限,会带来额外的资源开销从而造成性能下降。所以,为了避免因为分区不对齐所造成的性能影响。需要使用工fdisk或者parted工具创建和对齐分区。
如何选择一个正确的磁盘分区offset值,基本上EMC和其他厂商建议的值都是64KB。为什么要选择64KB这个值呢,这里解释一下。首先讲一下一个叫做物理磁道区域的概念。因为对于不同类型的保护级别,也可以说叫Raid和磁盘类型,这个区域的范围有所不同的。我们举两个个例子:
Symmetrix缓存中的磁道区域单位大小为一个Track,即64个Block、32KB大小。如图2所示,如果磁盘分区没有被对齐,则任何32KB或者更大的I/O就需要跨越两个Track来进行,50%的16KB的I/O会可能会跨越两个Track,25%的8KB也会跨越两个Track,造成额外的存储系统性能开销。
看了第一个例子,读者可能会想,那把起始位右移一个Block就好了啊,(MBR+Reserved=63Block),就不会有跨Track的I/O发生了。接下来我们再看另外一个例子。一个3+1 Raid5的单个条带大小为四个Track,即256个Block、128KB大小。如果对于这类的磁盘,使用第64个block为起始位置,当linux I/O大小达到64KB的时候,如果I/O直接从缓存(单个track为32KB),则正好完成两次读取。但是如果,两个连续的64KB I/O,且需要牵涉到后端Raid5的物理磁盘读写,如下图所示,第二个64KB就会出现跨越两个条带的情况发生,从而倒是读或者写的开销加倍。
在这种情况下,需要将起始位置调节成建议配置(64KB),这样一来,Linux最大I/O大小的情况也不会发生跨多个条带的情况发生了。(图3)
所以说,无论是从存储系统的缓存从读取数据,还是I/O在缓存中不存在的情况,需要从底层物理磁盘上读取数据。对于不同类型的磁盘,64KB的起始为是一个建议配置。
Linux创建分区对齐方法
描述了磁盘分区对齐的原理后,下面介绍如何使用fdisk创建对齐分区的例子。在Linux中,对齐分区操作需要要空数据的情况下进行,因为对齐分区操作会清空分区表并且该LUN上的数据会被删除。在这个例子中,我们对/dev/emcpowerfw设备,创建一个大小为51281 Cylinder(Cylinder是Symmetrix的计量单位,每个Cylinder大小为960KB,所以这个磁盘大小为50GB左右)、Offset错位大小为128个block的磁盘设备。方法和命令输出(图4)如下
方法1,使用fdisk创建分区对齐
Linux命令提示符下输入:
#fdisk /dev/emcpowerfw
输入n,创建一个分区:
输入p,创建分区为主分区:
输入起始Cylinder位置,默认为第一个:
输入最后Cylinder位置,默认为该磁盘设备的最后一个Cylinder:
输入x进入expect mode:
输入b,一定分区初始位置:
设定最初位置为128个block(128 block大小为64KB):
再次输入p确认分区初始位置信息:
输入w保存退出:
方法2:使用parted创建对齐分区
Parted和fdisk相比,支持更多的类型(支持GPT)和更大的分区尺寸。下面一个例子给出一个给dev/sdb磁盘创建128bloc分区起始位的例子,方法和命令输出如下(图5)
Linux命令提示符下输入:
#parted /dev/sdb
将显示单位调整为Sector(大小512个字节):
(parted)unit s
列出当前逻辑卷:
(parted)print
将原来Number1移除并且创建一个起始位为128 sector,小为976735934 sector的主分区。
(parted)rm 1
(parted)mkpart primary 128 976735934
(parted)print
参考
Parted命令手册及参数:http://www.gnu.org/software/parted/manual/parted.html#unit
Fdisk命令手册及参数:http://manpages.courier-mta.org/htmlman8/fdisk.8.html
磁盘分区对齐详解与配置- Windows篇 :https://community.emc.com/docs/DOC-18571
磁盘分区对齐详解与配置 Linux篇 :https://community.emc.com/docs/DOC-18666
磁盘分区对齐详解与配置 – Linux篇 相关文章
C结构体的内存对齐
术语说明 pack 可以指定内存对齐值,单位是字节,这个是值需要时2的次幂(1,2,4,6,8)。如不设置也有默认值,这个值我理解的是操作系统的字长。 #pragma pack(8) 对齐规则 结构体第一个成员放在struct offset 0 的位置。 计算每个成员的对齐值,计算方式
Linux下掌控磁盘分区的九大神器
在这篇文章中,我们来了解一些用来检查你的系统分区的一些命令,这些命令将检查每个磁盘的分区情况和其它细节,例如总空间容量,已用完的空间和文件系统等。 像fdisk,sfdisk和cfdisk命令这样的常规分区工具,不仅可以显示分区信息,还可以修改。 1. fdisk F
ncdu – 基于ncurses库的磁盘使用分析器
Ncdu (NCurses Disk Usage) 是一个基于Ncurses库的du命令的界面。它通过大家熟知的du命令,为用户提供一个快速且容易被使用的界面。它可以显示磁盘使用的百分比,且允许你使用ncurses库的方式在目录之间导航。 安装 ncdu已经被移植到大多数linux发行版本,可
必须强迫症!160GB硬盘双系统整数分区推荐方案
以下是我在160GB硬盘上的分区方案,采用Windows Server 2003 SP2(32位)、CentOS Linux 6.5(64位)双系统,作为日常办公桌面环境使用。 基本思路是这样的: 各分区大小尽可能为整数,看上去舒服一些( 有些强迫症 );两个系统之间需要进行文件共享和数据
在Linux中使用LVM构建灵活的磁盘存储(第一部分)
逻辑卷管理器(LVM) 让磁盘空间管理更为便捷。如果一个文件系统需要更多的空间,可以在它的卷组中将空闲空间添加到其逻辑卷中,而文件系统可以根据你的意愿调整大
巧用linux云服务器下的的/dev/shm/,避开磁盘IO不给力!
一.什么是tmpfs和/dev/shm/? tmpfs是Linux/Unix系统上的一种基于内存的文件系统。tmpfs可以使用您的内存或swap分区来存储文件。由此可见,tmpfs主要存储暂存的文件。它有如下2个优势: 1)动态文件系统的大
使用条块化I/O管理多个LVM磁盘(第五部分)
在本文中,我们将了解逻辑卷是如何通过条块化I/O来写入数据到磁盘的。逻辑卷管理的酷炫特性之一,就是它能通过条块化I/O跨多个磁盘写入数据。 LVM条块化是什么? LVM条块化 是LVM功能之一,该技术会跨多个磁盘写入数据,而不是对单一物理卷持续写入。 使用条
迁移LVM分区到新的逻辑卷/驱动器(第六部分)
这是我们正在进行的LVM系列的第六部分。在本文中,我们将为大家展示怎样在线将现存的逻辑卷迁移到其它新的驱动器。在开始之前,我想要先来介绍一下LVM迁移及其特性。 LVM存储迁移 什么是LVM迁移? LVM 迁移是LVM众多优秀特性之一,通过它,我们可以迁移逻辑
为什么我要竖向对齐程序代码
最近在HackerNews上Linux内核编码风格的讨论非常热闹。 讨论的进行中,我的一个回复触发了另外一场关于是否应该竖向对齐代码的口水仗。我坚持我的观点!下面让我来解释一下为什么要竖向对齐。 为什么要竖向对齐代码? 举一个简单的例子: int robert_age = 3
重走LFS之路(三) 磁盘初始化与源码准备
当硬件部分都准备就绪,就可以开始动手来准备软件了。不过在开始编译之前需要先做一件事,就像Windows中说的要格式化分区。虽然我真心不喜欢用Linux和Windows比,因为那样着实像是在英语和汉语之间来回翻译,想想就知道印欧语系和汉藏语系两门语言跨语系表述