xfs


xfs

文章插图
xfs【xfs】XFS一种高性能的日誌档案系统,最早于1993年,由Silicon Graphics为他们的IRIX作业系统而开发,是IRIX 5.3版的默认档案系统 。2000年5月,Silicon Graphics以GNU通用公共许可证发布这套系统的原始码,之后被移植到Linux 核心上 。XFS 特别擅长处理大档案,同时提供平滑的数据传输 。
XFS 最初是由 Silicon Graphics,Inc. 于 90 年代初开发的 。那时,SGI 发现他们的现有档案系统(existing filesystem,EFS)正在迅速变得不适应当时激烈的计算竞争 。为解决这个问题,SGI 决定设计一种全新的高性能 64 位档案系统,而不是试图调整 EFS在先天设计上的某些缺陷 。因此,XFS 诞生了,并于 1994 年随 IRIX 5.3 的发布而套用于计算 。
基本介绍外文名:XFS
开发时间:90 年代初
开发者: Silicon Graphics
档案系统大小:限制在 16tebibytes
简介XfS档案系统是SGI开发的高级日誌档案系统,XFS极具伸缩性,非常健壮 。所幸的是SGI将其移植到了Linux系统中 。在linux环境下 。目前版本可用的最新XFS档案系统的为1.2版本,可以很好地工作在2.4核心下 。XFS 是 Silicon Graphics,Inc. 于 90 年代初开发的 。它至今仍作为 SGI 基于 IRIX 的产品(从工作站到超级计算机)的底层档案系统来使用 。现在,XFS 也可以用于 Linux 。XFS 的 Linux 版的到来是激动人心的,首先因为它为 Linux 社区提供了一种健壮的、优秀的以及功能丰富的档案系统,并且这种档案系统所具有的可伸缩性能够满足最苛刻的存储需求 。历史XFS的开发始于1993年,在1994年被首次部署在IRIX 5.3上 。2000年5月,XFS在GNU通用公共许可证下发布,并被移植到Linux上 。2001年XFS首次被Linux发行版所支持,现在所有的Linux发行版上都可以使用XFS 。XFS最初被合併到Linux 2.4主线中,这使得XFS几乎可以被用在任何一个Linux系统上 。Arch, Debian, Fedora, openSUSE, Gentoo, Kate OS, Mandriva,Slackware, Ubuntu, VectorLinux和Zenwalk的安装程式中都可选择XFS作为档案系统,但由于默认的启动管理器GRUB中存在bug,以上发行版中只有少数几个允许用户在 /boot 挂载点(引导目录)上使用XFS档案系统 。FreeBSD在2005年12月获得了对XFS的唯读支持,并在次年6月引入了试验性的写支持 。不过这些只是为了方便用户从Linux上迁移到FreeBSD上,并不是为了把XFS作为主打档案系统使用 。Red Hat Enterprise Linux 5.4 64位版的核心完整支持XFS,但未包含创建和使用XFS的命令行工具(CentOS正在进行这方面的尝试),原因是这些软体包还不够稳定 。特性主要特性包括以下几点:数据完全性採用XFS档案系统,当意想不到的宕机发生后,首先,由于档案系统开启了日誌功能,所以你磁碟上的档案不再会意外宕机而遭到破坏了 。不论目前档案系统上存储的档案与数据有多少,档案系统都可以根据所记录的日誌在很短的时间内迅速恢复磁碟档案内容 。传输特性 XFS档案系统採用最佳化算法,日誌记录对整体档案操作影响非常小 。XFS查询与分配存储空间非常快 。xfs档案系统能连续提供快速的反应时间 。笔者曾经对XFS、JFS、Ext3、ReiserFS档案系统进行过测试,XFS档案档案系统的性能表现相当出众 。可扩展性 XFS 是一个全64-bit的档案系统,它可以支持上百万T位元组的存储空间 。对特大档案及小尺寸档案的支持都表现出众,支持特大数量的目录 。最大可支持的档案大 小为263 = 9 x 1018 = 9 exabytes,最大档案系统尺寸为18 exabytes 。XFS使用高的表结构(B+树),保证了档案系统可以快速搜寻与快速空间分配 。XFS能够持续提供高速操作,档案系统的性能不受目录中目录及档案数量的限制 。传输频宽 XFS 能以接近裸设备I/O的性能存储数据 。在单个档案系统的测试中,其吞吐量最高可达7GB每秒,对单个档案的读写操作,其吞吐量可达4GB每秒 。规範容量XFS是一个64位档案系统,最大支持 8exbibytes 减1位元组的单个档案系统,实际部署时取决于宿主作业系统的最大块限制 。对于一个32位Linux系统,档案和档案系统的大小会被限制在 16tebibytes 。档案系统日誌日誌档案系统是一种即使在断电或者是作业系统崩溃的情况下保证档案系统一致性的途径 。XFS对档案系统元数据提供了日誌支持 。当档案系统更新时,元数据会在实际的磁碟块被更新之前顺序写入日誌 。XFS的日誌被保存在磁碟块的循环缓冲区上,不会被正常的档案系统操作影响 。XFS日誌大小的上限是64k个块和128MB中的较大值,下限取决于已存在的档案系统和目录的块的大小 。在外置设备上部署日誌会浪费超过最大日誌大小的空间 。XFS日誌也可以被存在档案系统的数据区(称为内置日誌),或者一个额外的设备上(以减少磁碟操作) 。XFS的日誌保存的是在更高层次上描述已进行的操作的“逻辑”实体 。相比之下,“物理”日誌存储每次事务中被修改的块 。为了保证性能,日誌的更新是异步进行的 。当系统崩溃时,崩溃的一瞬间之前所进行的所有操作可以利用日誌中的数据重做,这使得XFS能保持档案系统的一致性 。XFS在挂载档案系统的同时进行恢复,恢复速度与档案系统的大小无关 。对于最近被修改但未完全写入磁碟的数据,XFS保证在重启时清零所有未被写入的数据块,以防止任何有可能的、由剩余数据导致的安全隐患(因为虽然从档案系统接口无法访问这些数据,但不排除裸设备或裸硬体被直接读取的可能性) 。分配组XFS档案系统内部被分为多个“分配组”,它们是档案系统中的等长线性存储区 。每个分配组各自管理自己的inode和剩余空间 。档案和资料夹可以跨越分配组 。这一机制为XFS提供了可伸缩性和并行特性——多个执行绪和进程可以同时在同一个档案系统上执行I/O操作 。这种由分配组带来的内部分区机制在一个档案系统跨越多个物理设备时特别有用,使得最佳化对下级存储部件的吞吐量利用率成为可能 。条带化分配在条带化RAID阵列上创建XFS档案系统时,可以指定一个“条带化数据单元” 。这可以保证数据分配、inode分配、以及内部日誌被对齐到该条带单元上,以此最大化吞吐量 。基于Extent的分配方式XFS档案系统中的档案用到的块由变长Extent管理,每一个Extent描述了一个或多个连续的块 。相比将每个档案用到的所有的块存储为列表的档案系统,这种策略大幅缩短了列表的长度 。有些档案系统用一个或多个面向块的栅格管理空间分配——在XFS中这种结构被由一对B+树组成的、面向Extent的结构替代了;每个档案系统分配组(AG)包含这样的一个结构 。其中,一个B+树用于索引未被使用的Extent的长度,另一个索引这些Extent的起始块 。这种双索引策略使得档案系统在定位剩余空间中的Extent时十分高效 。可变块尺寸块是档案系统中的最小可分配单元 。XFS允许在创建档案系统时指定块的大小,从 512 位元组到 64KB,以适应专门的用途 。比如,对于有很多小档案的套用,较小的块尺寸可以最大化磁碟利用率;但对于一个主要处理大档案的系统,较大的块尺寸能提供更好的性能 。延迟分配主条目:延迟分配XFS在档案分配上使用了惰性计算技术 。当一个档案被写入快取时,XFS简单地在记忆体中对该档案保留合适数量的块,而不是立即对数据分配Extent 。实际的块分配仅在这段数据被沖刷到磁碟时才发生 。这一机制提高了将这一档案写入一组连续的块中的机会,减少碎片的同时提升了性能 。稀疏档案XFS对每个档案提供了一个64位的稀疏地址空间,使得大档案中的“洞”(空白数据区)不被实际分配到磁碟上 。因为档案系统对每个档案使用一个Extent表,档案分配表就可以保持一个较小的体积 。对于太大以至于无法存储在inode中的分配表,这张表会被移动到B+树中,继续保持对该目标档案在64位地址空间中任意位置的数据的高效访问 。扩展属性XFS通过实现扩展档案属性给档案提供了多个数据流,使档案可以被附加多个名/值对 。档案名称是一个最大长度为256位元组的、以NULL字元结尾的可列印字元串,其它的关联值则可包含多达 64KB 的二进制数据 。这些数据被进一步分入两个名字空间中,root和user 。保存在root名字空间中的扩展属性只能被超级用户修改,user名字空间中的可以被任何对该档案拥有写许可权的用户修改 。扩展属性可以被添加到任意一种XFS inode上,包括符号连结、设备节点、目录,等等 。可以使用 attr 这个命令行程式操作这些扩展属性 。xfsdump 和 xfsrestore 工具在进行备份和恢复时会一同操作扩展属性,而其它的大多数备份系统则会忽略扩展属性 。Direct I/O对于要求高吞吐量的套用,XFS给用户空间提供了直接的、非快取I/O的实现 。数据在应用程式的缓冲区和磁碟间利用DMA进行传输,以此提供下级磁碟设备全部的I/O频宽 。确定速率 I/OXFS确定速率I/O系统给应用程式提供了预留档案系统频宽的API 。XFS会动态计算下级存储设备能提供的性能,并在给定的时间内预留足够的频宽以满足所要求的性能 。此项特性是XFS所独有的 。确定方式可以是硬性的或软性的,前者提供了更高性能,而后者相对更加可靠 。不过只要下级存储设备支持硬性速率确定,XFS就只允许硬性模式 。这一机制最常被用在实时套用中,比如视频流 。DMAPIXFS实现了数据管理应用程式接口(DMAPI)以支持高阶存储管理(HSM) 。到2010年10月为止,Linux上的XFS实现已经支持DMAPI所要求的的磁碟元数据规範,但有报告称核心支持仍处于不稳定状态 。此前SGI曾提供了一个包含DMAPI钩子的核心源码树,但这个支持未被合併进主代码树 。不过现在核心开发者们已经注意到了它并对其做了更新 。快照XFS并不直接提供对档案系统快照的支持,因为XFS认为快照可在卷管理器中实现 。对一个XFS档案系统做快照需要调用 xfs_freeze 工具冻结档案系统的I/O,然后等待卷管理器完成实际的快照创建,再解冻I/O,继续正常的操作 。之后这个快照可以被当作备份,以唯读方式挂载 。在IRIX上发布的XFS包含了一个整合的卷管理器,叫XLV 。这个卷管理器无法被移植到Linux上,不过XFS可以和Linux上标準的LVM正常工作 。在最近发布的Linux核心中,xfs_freeze 的功能被实现在了VFS层,当卷管理器的快照功能被唤醒时将自动启动 xfs_freeze 。相对于无法挂起,卷管理器也无法对其创建“热”快照的ext3档案系统,XFS的快照功能具有很大优势 。幸运地是,现在这种情况已经改观 。从Linux 2.6.29核心开始,ext3, ext4, gfs2和jfs档案系统也获得了冻结档案系统的特性 。线上碎片整理虽然XFS基于Extent的特徵和延迟分配策略显着提高了档案系统对碎片问题的抵抗力,XFS还是提供了一个档案系统碎片整理工具,xfs_fsr(XFS filesystem reorganizer的简称) 。这个工具可以对一个已被挂载、正在使用中的XFS档案系统进行碎片整理 。线上尺寸调整XFS提供了 xfs_growfs 工具,可以线上调整XFS档案系统的大小 。XFS档案系统可以向保存当前档案系统的设备上的未分配空间延伸 。这个特性常与卷管理功能结合使用,因为后者可以把多个设备合併进一个逻辑卷组,而使用硬碟分区保存XFS档案系统时,每个分区需要分别扩容 。到2010年8月为止,XFS分区不可以原位收缩,不过有一些方法可以变相处理这个问题 。原生备份/恢复工具XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS档案系统中的数据 。xfsdump 按inode顺序备份一个XFS档案系统 。与传统的UNIX档案系统不同,XFS不需要在dump前被卸载;对使用中的XFS档案系统做dump就可以保证镜像的一致性 。这与XFS对快照的实现不同,XFS的dump和restore的过程是可以被中断然后继续的,无须冻结档案系统 。xfsdump 甚至提供了高性能的多执行绪备份操作——它把一次dump拆分成多个数据流,每个数据流可以被发往不同的目的地 。不过到目前为止,Linux尚未完成对多数据流dump功能的完整移植 。原子磁碟配额XFS的磁碟配额在档案系统被初次挂载时启用 。这解决了一个在其它大多数档案系统中存在的一个竞争问题:要求先挂载档案系统,但直到调用quotaon(8)之前配额不会生效 。性能考虑写入屏障XFS档案系统默认在挂载时启用“写入屏障”的支持 。该特性会一个合适的时间沖刷下级存储设备的写回快取,特别是在XFS做日誌写入操作的时候 。这个特性的初衷是保证档案系统的一致性,具体实现却因设备而异——不是所有的下级硬体都支持快取沖刷请求 。在带有电池供电快取的硬体RAID控制器提供的逻辑设备上部署XFS档案系统时,这项特性可能导致明显的性能退化,因为档案系统的代码无法得知这种快取是非易失性的 。如果该控制器又实现了沖刷请求,数据将被不必要地频繁写入物理磁碟 。为了防止这种问题,对于能够在断电或发生其它主机故障时保护快取中数据的设备,应该以 nobarrier 选项挂载XFS档案系统 。日誌的放置XFS档案系统创建时默认使用内置日誌,把日誌和档案系统数据放置在同一个块设备上 。由于在所有的档案系统写入发生前都要更新日誌中的元数据,内置日誌可能导致磁碟竞争 。在大多数负载下,这种等级的竞争非常低以至于对性能没有影响 。但对于沉重的随机写入负载,比如在忙碌的数据块伺服器上,XFS可能因为这种I/O竞争无法获得最佳性能 。另一个可能提高这个问题的严重性的因素是,日誌写入被要求以同步方式提交——它们必须被完全写入,之后对应实际数据的写入操作才能开始 。如果确实需要最佳的档案系统性能,XFS提供了一个选项,允许把日誌放置在一个分离的物理设备上 。这只需要很小的物理空间 。分离的设备有自己的I/O路径,如果该设备能对同步写入提供低延迟的路径,那幺它将给整个档案系统的操作带来显着的性能提升 。SSD,或带有写回快取的RAID系统是日誌设备的合适候选,它们能满足这种性能要求 。不过后者在遭遇断电时可能降低数据的安全性 。要启用外部日誌,只须以 logdev 选项挂载档案系统,并指定一个合适的日誌设备即可 。缺点XFS档案系统无法被收缩 。历史上XFS上的元数据操作曾比其它档案系统都慢,表现为在删除大量小档案时性能糟糕 。该性能问题是被Red Hat的XFS开发者Dave Chinner在代码中定位到的 。使用一个叫“延迟记录”的挂载选项可以成数量级地提升元数据操作的性能 。该选项几乎把日誌整个存在记忆体中 。Linux核心主线版本2.6.35中作为一个试验性特性引入了这个补丁,在2.6.37中使它成为了一个稳定的特性,并计画在2.6.39中把它作为默认的日誌记录方法 。早期测试显示在有少量执行绪的环境中其性能接近EXT4,在大量执行绪的环境下超过了EXT4 。