第 5 章 存储和文件系统

此章节概述支持的文件系统和配置选项,此选项影响在红帽企业版 Linux 7 中 I/O 和文件系统的应用程序性能。〈第 5.1 节 “注意事项” 〉讨论了影响性能的 I/O 和文件系统相关因素。〈第 5.2 节 “性能问题监控和诊断”〉教授如何使用红帽企业版 Linux 7 工具诊断与 I/O 或者文件系统配置细节相关的性能问题。〈第 5.3 节 “配置工具” 〉讨论了为解决红帽企业版 Linux 7中 I/O 和文件系统相关的性能问题,您可使用的工具和策略。

5.1. 注意事项

存储和文件系统性能的合理设置在很大程度上取决于存储目的。 I/O 和文件系统性能会受到下列因素的影响:
  • 数据写入或读取模式
  • 数据重新排列与底层几何
  • 块大小
  • 文件系统大小
  • 日记大小和位置
  • 记录访问次数
  • 确保数据可靠性
  • 预取数据
  • 预先分配磁盘空间
  • 文件碎片
  • 资源争用
阅读此章节可了解影响文件系统吞吐量、可伸缩性、响应能力、资源使用和可用性的格式和挂载选项。

5.1.1. 固态硬盘

SSD(固态硬盘)使用闪存芯片而非旋转磁盘存储永久数据。它们为逻辑块地址内的全部数据提供恒定访问时间,且不会像它们旋转的对应物那样出现可测量的搜寻成本。每千兆字节的存储空间更昂贵且存储密度更小,但比 HDD 延迟时间短、吞吐量更大。
当在 SSD 上使用的块接近磁盘容量,性能通常会降低。降低的程度因供应商的不同而异,在此情况下,所有设备性能都会降低。启用放弃有助于缓解性能降低;更多细节,请参见〈第 5.1.4.3 节 “维护”〉 。
默认 I/O 调度器和虚拟内存选项适用于 SSD。
SSD 部署建议的更多信息,可从 《红帽企业版 Linux 7 存储管理指南》获得, 参见 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/

5.1.2. I/O 调度器

I/O 调度器决定 I/O 操作何时运行在存储设备上以及运行多久。它也被称为 I/O elevator(I/O 升降机)。
红帽企业版 Linux 7 提供三种 I/O 调度器。
deadline
除了 SATA 磁盘为所有块设备的默认 I/O 调度器。Deadline 尝试为指向到达 I/O 调度器的请求提供有保障的延迟。该调度器适合大多数用例,尤其适用于读取操作比写入操作更频繁的请求。
将排队的 I/O 请求分类为读或者写批处理,并按照 LBA 递增顺序执行。默认设置下,读批处理优先于写批处理,这是因为应用更可能阻止读取 I/O。批处理后,deadline 检查写入操作因等待处理器时间而处于多久的“饥饿”状态,并且适当地调度下一个读批处理或写批处理。解决批处理的请求数量、发出写批处理的读批处理数量、以及请求过期前的时间量都是可配置的,更多细节,请参见〈第 5.3.4 节 “调整期限调度器”〉。
cfq
默认调度器只适用于标识为 SATA 硬盘的设备。完全公平队列调度器,cfq,将进程分成三个独立类别:实时、尽其所能和空闲。实时类别的进程总是先于尽其所能类别进程执行,而尽其所能类别进程总是在空闲类别进程之前执行。这意味着实时类别的进程可以使尽其所能和空闲进程等待处理器时间而忍受“饥饿”。默认设置下,分配进程到尽其所能类别。
Cfq 使用历史数据来预测应用是否会在不久之后发出更多 I/O 请求。如果将有更多 I/O 请求,cfq 空闲则会等待新的 I/O,即使有来自其他进程的 I/O 在等待处理。
因为有空闲的趋势,cfq 调度器不应用于连接不会引起大量搜寻 penalty(惩罚)的硬件,除非它为此目的而被调整。cfq 调度器也不应用于连接其他断续工作型调度器,例如基于主机的硬件 RAID 控制器,因为这些调度器的堆积有造成大量延迟的趋势。
Cfq 行为是可高度配置的,更多细节,请参见〈第 5.3.5 节 “调整 cfq 调度器” 〉。
noop
noop I/O 调度器执行简单的 FIFO(先进先出)调度算法。请求通过简单的最后选中的缓存数据在一般块层合并。对于使用最快存储的受 CPU 限制的系统,这是最佳调度器。
设置不同默认 I/O 调度器的细节,或为特定设备指定不同的调度器,请参见〈第 5.3 节 “配置工具”〉。

5.1.3. 文件系统

欲了解红帽企业版 Linux 7 中支持文件系统的细节、推荐用例、通常情况下的文件系统可用的格式和挂载选项,请阅读此章节。为这些文件系统的调整推荐,请参见〈第 5.3.7 节 “为性能配置文件系统”〉。
XFS
XFS 是一个可靠的、且可高度缩放的 64 位文件系统。它是红帽企业版 Linux 7 中默认文件系统。XFS 使用基于分区的分配,具有一些分配方案,包括预先分配和延迟的分配,这两种都会减少碎片和辅助性能。它也支持促进故障恢复的元数据日志。当挂载并激活时,能够对 XFS 进行碎片整理和放大,红帽企业版 Linux 7 支持几种 XFS 特定的备份和还原工具程序。
自红帽企业版 Linux 7.0 GA 起,XFS 支持最大容量可达 500 TB 的文件系统,以及最大容量为 8 EB 的文件偏移量(稀疏文件)。管理 XFS 的细节,请参见《红帽企业版 Linux 7 存储管理指南》。可在下列网站中查找 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/。如有调整 XFS 的特殊需求而需要协助,请参见〈第 5.3.7.1 节 “调整 XFS”〉。
Ext4
Ext4 是 ext3 文件系统的可缩放扩展。它的默认行为对大部分工作负载是最佳的。然而,它只支持最大容量为 50 TB的文件系统以及最大容量为 16 TB 的文件。管理 ext4 的细节,请参见《红帽企业版 Linux 7 存储管理指南》,可在下列网站中查找 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/ ,如有调整 ex4 的特殊需求而需要协助,请参见〈第 5.3.7.2 节 “调整 ext4”〉。
Btrfs(技术预览)
Btrfs 是提供缩放性、容错和方便管理的 copy-on-write(写时复制)文件系统。它包括内置快照和 RAID 支持,通过数据和元数据校验来提供数据的完整性。它也通过数据压缩提高性能及使用空间的效率。Btrfs 作为一种技术预览,支持最大容量可达 50 TB 的文件系统。
Btrfs 是最适合桌面存储和云存储的。最初格式化设备时,最好按照预期使用而调整 btrfs。
红帽企业版 Linux 7 提供 Brtfs 作为技术预览。技术预览特征的细节,请参见 https://access.redhat.com/site/support/offerings/techpreview/
管理 brtfs 的细节,请参见《红帽企业版Linux 7存储管理手册》,可在下列网站中查找 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/。如有调整 btrfs 的特殊需求而需要协助,请参见〈第 5.3.7.3 节 “调整 btrfs”〉。
GFS2
GFS2 是具有极高可用性附加装置的一部分,为红帽企业版 Linux 7 提供簇文件系统支持。GFS2 集群提供所有服务器一致的文件系统图像,允许服务器在一个单独共享文件系统中读取和写入。
GFS2 支持最大容量可达 250 TB 的文件系统。
管理 GFS2 的细节,请参见《红帽企业版 Linux 7 存储管理指南》。可在下列网站中查找 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/。如有调整 GFS2 的特殊需求而需要协助,请参见〈第 5.3.7.4 节 “调整 GFS2”〉。

5.1.4. 文件系统的一般调整注意事项

此章节涵盖普遍适用于所有文件系统的调整注意事项。特定文件系统的调整推荐,请参见〈第 5.3.7 节 “为性能配置文件系统”〉。

5.1.4.1. 格式时间注意事项

在设备格式化后,文件系统配置的部分决定不能改变。此章节包含格式化存储设备前必须要做的决定的可用选项。
大小
按照工作负载创建合理大小的文件系统。按相应比例,较小的文件系统的备份次数也较少,且文件系统检查所需时间和内存也更少。然而,如果您的文件系统太小,性能将因大量碎片而降低。
块大小
块是文件系统中工作的单位。块大小决定单个块能存储多少数据,也因而决定能够同时读写的数据最小量。
默认块大小适用于大部分用例。然而,如果块大小(或者多个块大小)和通常同时读写的数据数量一样大,或者略大时,文件系统将执行得更好、存储数据更加有效率。小文件仍将使用一个完整的块。文件分布在多个块中,但这会造成额外的运行时间开销。另外,一些文件系统受限于一定数量的块,转而限制文件系统最大尺寸。
使用 mkfs 指令格式化设备时,块大小作为文件系统选项的一部分而被指定。指定块大小的参数随文件系统变化,文件系统的细节,请参见 mkfs 手册页。例如,查看格式化 XFS 文件系统时可用的选项,执行下列命令:
$ man mkfs.xfs
几何
文件系统几何与文件系统中数据的分布相关。如果系统使用带状存储器,例如 RAID,可在格式化设备时,通过重新排列数据和底层存储几何的元数据提高性能。
很多数据导出的推荐几何在使用特定文件系统格式化设备时会被自动设置。如果设备没有导出这些推荐几何,或您想要变更推荐设置,那么您在使用 mkfs 格式化设备时,需要手动指定几何 。
指定文件系统几何的参数随文件系统而变化;文件系统细节请参见 mkfs 手册页。例如,查看格式化 ext4 系统时可用的选项,执行下列命令:
$ man mkfs.ext4
外部日记
日志文件系统会在执行写操作之前,将写操作期间发生的变化记录到日志文件中。 这会降低系统发生故障、电源故障时日志的存储设备损坏的可能性,并加速恢复过程。
元数据密集工作负载涉及日志的频繁更新。大型日志使用更多内存,但会减少写操作的频繁性。此外,可通过将设备日志置于和主要存储一样快或者更快的专用存储上,提高带有元数据密集工作负载的设备的寻道时间。

警告

确保外部日志的可靠性。失去外部日志,设备将导致文件系统损坏。
外部日志必须在格式化时便创建,并在挂载期间指定日志设备。细节请参见 mkfsmount 手册页。
$ man mkfs
$ man mount

5.1.4.2. 挂载时间注意事项

此章节包含适用于大部分文件系统的调整决定,且可在挂载设备时指定。
Barrier(屏障)
文件系统 barrier 确保文件系统元数据正确写入到永久存储并排序,使用 fsync 传输的数据在断电下得以存留。以前红帽企业版 Linux 版本中,启用文件系统 barrier 会明显放慢严重依赖 fsync 的应用程序,或者创建和删除很多小文件。
红帽企业版 Linux 7 中,文件系统 barrier 性能的得到的改善使禁用的文件系统 barrier 的性能影响变得极小(小于3%)。
更多信息,请参见《红帽企业版 Linux 7 存储管理指南》,可在下列网站中查找 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/
访问时间
每次读取文件,它的元数据随访问时间(atime)更新。这涉及额外的写入 I/O。在大多数情况下,这样的开销是最小的,因为在默认设置下,前次访问时间早于上次修改时间(mtime) 或者状态变化(ctime),红帽企业版 Linux 7 只更新 atime 字段。
然而,如果更新元数据耗时,且并不对准确访问时间做要求,您可以使用 noatime 挂载选项挂载文件系统。读取文件时会禁用元数据的更新。它也会启用 nodiratime 行为,读取目录时,该行为禁用元数据的更新。
预读
预读行为通过预取可能立即需要的数据,并且将其加载到可比在磁盘上更快检索的页面缓存中加速文件访问。预读值越高,系统预取数据越早。
红帽企业版 Linux 根据对于文件系统的检测,尝试设置一个合适的预读值。然而,检测不可能总是准确的。例如,如果存储数组将自己作为单一 LUN 展示给系统,系统会检测单一 LUN,但不会为数组设置合适的预读值。
涉及大量数据流的量数据流的顺序 I/O 的工作负载常常受益于高预读值。红帽企业版 Linux 7 提供的相关存储调整配置文件提高预读值,和使用 LVM 条带化一样,但这些调整对于所有工作负载而言并不总是足够的。
定义预写行为的参数随着文件系统而变化;请参见手册页。
$ man mount

5.1.4.3. 维护

定期丢弃文件系统不用的块是对于固态硬盘和精简配置存储的建议做法。有两种丢弃不使用的块的做法:batch discard(批量丢弃)和 online discard(网络丢弃)。
batch discard(批量丢弃)
这种丢弃方式是 fstrim 指令的一部分。它丢弃文件系统中与管理员指定的标准相配的所有不使用的块。
红帽企业版 Linux 7 支持 XFS 和 ext4 格式化设备上的 batch discard,这些设备支持实际丢弃操作即( /sys/block/devname/queue/discard_max_bytes 值不为 0 的 HDD 设备,和 /sys/block/sda/queue/discard_granularity 不为 0 的 SSD 设备)。
online discard(网络丢弃)
这种方式的丢弃操作在挂载时间使用 discard 选项配置,实时运行不受用户干扰。然而,online discard 只丢弃从使用转换到空闲的块。红帽企业版 Linux 7 支持 XFS 和 ext4 格式化设备上的 online discard。
红帽推荐 batch discard,除非要求用 online discard 维持性能,或 batch discard 不可用于系统工作负载。
预先分配
预先分配将硬盘空间标记为已经将磁盘空间分配给一个文件,而未将数据写入该空间。这可用于限制数据碎片和较差的读取性能。红帽企业版 Linux 7 支持挂载时间内 XFS、ext4、 和 GFS2 设备上预先分配空间。对您文件系统的合适参数,请参见 mount 手册页。应用程序也可通过使用 fallocate(2) glibc 调用从预先分配空间受益。