5.3. 配置工具

红帽企业版 Linux 提供一些帮助管理员配置存储和文件系统的工具。此章节概述可用的工具并提供示例阐述如何使用这些工具解决红帽企业版 Linux 7 中 I/O 和文件系统相关的性能问题。

5.3.1. 配置存储性能的调整配置文件。

Tunedtuned-adm 提供一些旨在为特定用例提高性能的配置文件。下列配置文件对于提高存储性能尤其有用。
  • 延迟性能
  • 吞吐量性能(默认)
如需配置系统中的配置文件,请运行以下命令,用您想用的配置文件名称替代 name
$ tuned-adm profile name
tuned-adm recommend 命令为系统推荐合适的配置文件。在安装时它也会为系统设置默认配置文件,因此可用于返回默认配置文件。
配置文件或其他配置选项更多细节,请参见 第 A.6 节 “tuned-adm”

5.3.2. 设置默认 I/O 调度器

如果设备的挂载选项没有指定调度器,可使用默认 I/O 调度器。
如需设置默认 I/O 调度器,在重启时通过向内核命令行附加 elevator 参数来指定欲使用的调度器,或通过编辑 /etc/grub2.conf 文件。
elevator=scheduler_name

5.3.3. 为设备配置 I/O 调度器

如需设置特定存储设备的调度器或调度器优先顺序,编辑 /sys/block/devname/queue/scheduler 文件,devname 为您欲配置的设备名称。
# echo cfq > /sys/block/hda/queue/scheduler

5.3.4. 调整期限调度器

使用 deadline 时,排队的 I/O 请求将分为读批处理或者写批处理,然后按照 LBA 递增的执行顺序调度。默认设置下,读批处理比写批处理优先处理,这是因为在读 I/O 上应用程序易被阻止。在批处理被处理后,deadline 会检查写操作因等待处理器时间而处于多久的“饥饿”状态,并合理调度下一个读或者写批处理。
下列参数影响 deadline 调度器行为:
fifo_batch
单个批处理中读操作或写操作发出的数量。默认值为 16。值越高,吞吐量也会更多,但也会增加延迟。
front_merges
如果您的工作负载从不产生正面合并,可调整的参数设置为 0。然而,除非您已经测试了该检查的开销,红帽推荐 1 的默认值。
read_expire
应为服务调度读请求中毫秒的数量。默认值为 500(0.5秒)。
write_expire
应为服务调度写请求中毫秒的数量。默认值为 5000(5秒)。
writes_starved
先于写批处理而处理的读批处理数量。该值越高,给读批处理的优先更多。

5.3.5. 调整 cfq 调度器

使用 cfq 时 ,进程分为三类:实时、尽其所能和空闲。尽其所能进程之前调度所有实时进程,而空闲进程之前调度尽其所能进程。默认设置下,进程归类为尽其所能。可使用 ionice 命令手动调整进程分类。
通过使用下列参数进一步调整 cfq 调度器的行为。这些参数通过改变 /sys/block/devname/queue/iosched 目录下的指定文件,基于每个设备设置的。
back_seek_max
cfq 将执行向后搜寻以千字节计算的最大距离。默认值是 16 KB。 向后搜寻通常会损害性能,因此不推荐大的值。
back_seek_penalty
磁头在决定向前还是向后移动时,乘法器应用于向后搜寻。默认值为 2。如果磁头位置是 1024 KB,并且在系统中有等距的请求(例如:1008 KB 和 1040 KB),back_seek_penalty 应用于向后搜寻距离和磁盘向前移动。
fifo_expire_async
异步(缓冲写入)请求以毫秒计算的可能持续无服务的时间长度。在这个时间过期之后,一个单独的“饥饿”的异步请求移动至配送列表。默认值为 250 毫秒。
fifo_expire_sync
同步(读取或者O_DIRECT 写入)请求以毫秒计算的可能持续无服务的时间长度。在这个时期过期后,一个单独的“饥饿”的同步请求被移动到配送列表。默认值为 125 毫秒。
group_idle
默认设置下,参数设为 0(禁用)。设置为 1(禁用)时,cfq 调度器空闲在控制组中发出I/O的最后进程里。如使用成比例的重量 I/O 控制组,或 slice_idle 设置为 0 (在快速存储上)会有帮助。
group_isolation
默认设置下,该参数设置为 0(禁用)。设置为 1(启用)时,它提供组之间更强的隔离,但是吞吐量会减少,这是因为公平性用于随机和顺序工作负载。group_isolation 禁用时(设置为 0),公平性只提供给顺序工作负载。更多信息,请参见安装文件 /usr/share/doc/kernel-doc-version/Documentation/cgroups/blkio-controller.txt
low_latency
默认设置下,设置参数为 1 (启用)。启用后,通过为设备上发出 I/O 的每个进程提供最大为 300 ms 的等待时间,cfq 更注重公平性而非吞吐量。设置参数为 0 时(禁用),目标延迟被忽略,每个进程接受完整时间片。
quantum
该参数定义 cfq 在同一时间发送给一个设备的 I/O 请求的数量,实质上是对队列深度的限制。默认值为 8 请求。使用的设备可能支持更大的队列深度,但增加量程值也会导致延迟增加,尤其是大的顺序写工作负载。
slice_async
该参数定义分配给每个发出异步 I/O 请求的进程的时间片(以毫秒计算)长度。默认值为 40 毫秒。
slice_idle
该参数指定等待下一步请求时以毫秒计算的 cfq 空闲时间长度。默认值为 0(队列无空闲或者 service tree level)。默认值对于外部 raid 存储器的吞吐量是理想的,由于增加了搜寻操作的整体数量,而降低内部 non-RAID 存储器的吞吐量。
slice_sync
该参数定义分配给每个发出同步 I/O 请求的进程的时间片长度(以毫秒计算)。默认值为 100 ms。

5.3.5.1. 为快速存储调整 cfq

不向无法遭受大搜寻 penalty(惩罚)的硬件推荐 cfq 调度器,例如快速外部存储数列或者固态硬盘。如果您需要在此存储上使用 cfq ,需要编辑下列配置文件:
  • 设置 /sys/block/devname/queue/ionice/slice_idle0
  • 设置 /sys/block/devname/queue/ionice/quantum64
  • 设置 /sys/block/devname/queue/ionice/group_idle1

5.3.6. 调整 noop 调度器

noop I/O 调度器主要对使用快速存储的受 cpu 限制的系统有用。请求在块层合并,因此通过编辑 /sys/block/sdX/queue/ 目录中的文件中块层参数,修改noop 行为。
add_random
一些 I/O 事件会影响 /dev/random 的熵池 。如果这些影响的负荷变得可测量,该参数可设置为 0
max_sectors_kb
指定 I/O 请求的最大尺寸(以千字节计算),默认值为 512 KB。该参数的最小值是由存储设备的逻辑块大小决定的。该参数的最大值是由 max_hw_sectors_kb 值决定的。
I/O 请求大于内部擦除块大小时,一些固态硬盘会表现不佳。在这种情况下,红帽推荐将 max_hw_sectors_kb 减少至内部擦除块大小。
nomerges
大多数工作负载受益于请求合并。然而,禁用合并有助于调试目的。可设置参数为 0 禁用合并。默认设置下为启用(设置为 1)。
nr_requests
限定同一时间排队的读和写请求的最大数量。默认值为 128, 即在请求读或者写操作的下一个进程进入睡眠模式前有 128 个读请求和 128 个写请求排队。
对于延迟敏感应用程序,降低该参数值,并限制存储上的命令队列深度,这样回写 I/O 便无法填充有写请求的设备队列。设备队列填充时,其他尝试执行 I/O 操作的进程会进入睡眠模式,直到有可用队列空间。随后请求会以 round-robin fashion(循环方式)分配,以防止一个进程持续使用队列所有点。
optimal_io_size
一些存储设备用此参数报告最佳 I/O 大小。如果报告该值,红帽建议您尽可能将应用程序发出 I/O 与最佳 I/O 大小对齐,并是最佳 I/O 大小的倍数。
read_ahead_kb
定义操作系统在顺序读取操作阶段将预先读取的千字节数量,以便存储在页面缓存中可能马上需要的信息。设备映射程序经常受益于高的 read_ahead_kb 值 128 KB ;对于访问将要被映射的设备这是一个良好的起点。
旋转
一些固态硬盘不能正确公布其固态硬盘状态,并且会如传统旋转磁盘挂载。如果您的固态硬盘不能将它自动设置它为 0,那么请您手动设置,禁用调度器上不必要的搜寻减少逻辑。
rq_affinity
默认设置下,I/O 完成能在不同处理器上进行,而不是限定在发出 I/O 请求的处理器上。 将rq_affinity 设置为 1 以禁用此能力,并只在发出 I/O 请求的处理器上执行完成。这能提高处理器数据缓存的有效性。

5.3.7. 为性能配置文件系统

此章节包含红帽企业版 Linux 7 支持的每个文件系统的调整参数。用户格式化存储设备或者挂载格式化设备时,参数根据其值是否应当配置而分配。
如果文件碎片或者资源争用引起性能损失,性能通常可通过重新配置文件系统而提高性能。然而,在有些用例中,可能需要更改应用程序。这种情况下,红帽建议联系客户支持以获得帮助。

5.3.7.1. 调整 XFS

此章节包含对 XFS 文件系统格式化和挂载时可用的一些调整参数。
XFS 默认格式化和挂载设置适用于大多数工作负载。红帽建议只在更改特定配置会对您的工作负载有益时对它们进行更改。
5.3.7.1.1. 格式化选项
格式化选项的更多信息参见手册页:
$ man mkfs.xfs
目录块大小
目录块大小影响每个 I/O 操可检索或修改的目录信息数量。目录块大小最小值即文件系统块大小(默认设置下为4 KB)。目录块大小最大值为 64 KB。
对于指定的目录块大小来说,大的目录比小的目录需要更多 I/O。因为和小目录块的系统相比,大目录块大小的系统每 I/O 操作会使用更多的处理能力。因此,根据您的工作负载,推荐使用尽可能小的目录和目录块大小。
如文件系统比大量写和大量读工作负载的列出项目数量少,红帽推荐使用以下目录块大小,请参见 〈表 5.1 “为目录块大小推荐的最大目录项”
在不同大小文件系统中,目录块大小对读和写工作负载的影响的情况请参见 XFS 文件。
使用 mkfs.xfs -l 选项配置目录块大小。请参见 mkfs.xfs 手册页。
分配组
分配组是独立的结构,指示自由空间并在文件系统中一节分配 inodes。只要同时操作影响不同分配组,每个分配组能被独立修改,这样 XFS 同时执行分配和解除分配操作。因此文件系统中执行的同时操作数量和分配组数量相等。然而,由于执行同时操作的能力受到能够执行操作的处理器数量的限制,红帽建议分配组数量应多于或者等于系统中处理器的数量。
多个分配组无法同时修改单独目录。因此,红帽推荐大量创建和移除文件的应用程序不要在单个目录中存储所有文件。
使用 mkfs.xfs -d 选项配置分配组,更多信息参见 mkfs.xfs 手册页。
增长约束
如您在格式化之后(通过增加更多硬件或通过自动精简配置),需要增加文件系统的大小,由于分配组大小在完成格式化之后不能更改,请务必仔细考虑初始文件布局。
必须根据文件系统最终能力,而非根据初始能力调节分配组大小。占据所有使用空间的文件系统中分配组数量不应超过数百,除非分配组处于最大尺寸 (1 TB)。因此,红帽向大部分文件系统推荐最大增长,允许文件系统是初始大小的十倍。
增长 RAID 数组的文件系统时,务必考虑额外护理,由于设备大小必须与固定多个分配组大小对齐,以便新分配组表头在新增加的存储中正确对齐。由于几何在格式化之后不能被更改,因此新存储也必须与已有的存储几何一致,因此,在同一个块设备上,不能优化不同几何的存储。
Inode 大小和内联属性
如果 inode 有足够可用空间,XFS 能直接将属性名称和值写入 inode。由于不需要额外的 I/O,这些内联属性能够被获取和修改,达到比获取单独的属性块更快的量级。
默认 inode 大小为 256 bytes。其中只有约 100 bytes 大小可用于属性存储,取决于 inode 上存储的数据范围指针数量。格式化文件系统时,增加 inode 大小能增加存储属性可用的空间数量。
属性名称和属性值两者都受到最大尺寸 254 bytes 的限制。如果名称或者值超过 254 bytes 长度,该属性会被推送到单独的属性快,而非存储在内联中。
使用 mkfs.xfs -i 选项配置 inode 参数,更多信息请参见 mkfs.xfs 手册页。
RAID
如果使用软件 RAID ,mkfs.xfs 会使用合适的带状单元和宽度自动配置底层的硬件。然而,如果使用硬件 RAID, 带状单元和宽度可能需要手动配置,这是因为不是所有硬件 RAID 设备输出此信息。使用 mkfs.xfs -d 选项配置带状单元和宽度。更多信息请参见 mkfs.xfs 手册页。
日志大小
直到同步事件被触发,待定的更改在内存中累计,这个时候它们会被写入日志。日志大小决定同时处于进行中的修改数量。它也决定在内存中能够累计的最大更改数量,因此决定记录的数据写入磁盘的频率。与大日志相比,小日志促使数据更频繁地回写入磁盘。然而,大日志使用更多内存来记录待定的修改,因此有限定内存的系统将不会从大日志获益。
日志与底层带状单元对齐时,日志表现更佳;换言之,它们起止于带状单元边界。使用 mkfs.xfs -d 选项将日志对齐带状单元,更多信息请参见 mkfs.xfs 手册页。
使用下列 mkfs.xfs 选项配置日志大小,用日志大小替换 logsize
# mkfs.xfs -l size=logsize
更多详细信息参见 mkfs.xfs 手册页:
$ man mkfs.xfs
日志带状单元
日志写操作起止于带状边界时(与底层带状单元对齐),存储设备上使用 RAID5 或 RAID6 布局的日志写操作可能会表现更佳。mkfs.xfs 尝试自动设置合适的日志带状单元,但这取决于输出该信息的 RAID 设备。
如果您的工作负载过于频繁地触发同步事件,设置大日志带状单元会降低性能。这是因为小的写操作需要填充至日志带状单元,而这会增加延迟。如果您的工作负载受到日志写操作延迟的约束,红帽推荐将日志带状单元设置为 1 个块,从而尽可能地触发非对齐日志写操作。
支持的最大日志带状单元为最大日志缓存的大小(256 KB)。因此底层存储器可能拥有更大的带状单元,且该带状单元能在日志中配置。在这种情况下,mkfs.xfs 会发出警告,并设置一个大小为 32 KB 的日志带状单元。
使用以下选项之一配置日志带状单元,其中 N 是被用于带状单元的块的数量,size 是以 KB 为单位的带状单元的大小。
mkfs.xfs -l sunit=Nb
mkfs.xfs -l su=size
更多详细信息参见 mkfs.xfs 手册页:
$ man mkfs.xfs
5.3.7.1.2. 挂载选项
Inode 分配
强烈推荐文件系统大于 1 TB。inode64 参数配置 XFS,从而在文件系统中分配 inode 和数据。这样能保证 inode 不会被大量分配到文件系统的起始位置,数据也不会被大量分配到文件系统的结束位置,从而提高大文件系统的性能表现。
日志缓存和数量
日志缓存越大,将所有变更写入日志的 I/O 操作越少 。大日志缓存能提高有大量 I/O 密集型工作负载的系统性能表现,而该工作负载没有非易变的写缓存。
通过 logbsize 挂载选项配置日志缓存大小,并确定日志缓存中信息存储的最大数量。如果未设置日志带状单元,缓存写操作可小于最大值,因此不需要减少大量同步工作负载中的日志缓存大小。默认的日志缓存大小为 32 KB。最大值为 256 KB, 也支持 64 KB、128 KB 或以 2 的倍数为幂的介于 32 KB 和 256 KB 之间的日志带状单元。
日志缓存的数量是由 logbufs 挂载选项确定的。日志缓存的默认值为 8 (最大值),但能配置的日志缓存最小值为2。通常不需要减少日志缓存的数量,除非内存受限的系统不能为额外的日志缓存分配内存。减少日志缓存的数量会降低日志的性能,尤其在工作负载对 I/O 延迟敏感的时候。
延迟变更日志
内存的变更写入日志前,XFS 的选项能集成这些改变。 delaylog 参数允许将频繁更改的元数据周期性地写入日志,而非每次改变都要记录到日志中。此选项会增加故障中操作丢失的潜在数量,也会增加用于跟踪元数据的内存大小。但是,它能通过按量级排序增加元数据的更改速度和可扩展性,为确保数据和元数据写入硬盘而使用 fsyncfdatasyncsync 时,此选项不能减少数据或元数据的完整性。

5.3.7.2. 调整 ext4

本章节涵盖格式化和挂载时ext4 文件系统可用的一些调整参数。
5.3.7.2.1. 格式化选项
inode 表初始化
在很大的文件系统上初始化文件系统中所有 inode 会耗时很久。默认设置下会推迟初始化过程(启用迟缓 inode 表初始化)。但是,如果您的系统没有 ext4 驱动,默认设置下会禁用迟缓 inode 表初始化。可通过设置 lazy_itable_init1 启用。那么在挂载后,内核进程继续初始化文件系统。
本章节仅描述了在格式化时可用的一些选项。更多格式化参数,参见mkfs.ext4手册页:
$ man mkfs.ext4
5.3.7.2.2. 挂载选项
inode表初始化率
启用迟缓 inode 表初始化时,您可通过指定 init_itable 参数值控制初始化发生的速率。执行后台初始化的时间约等于 1 除以该参数值。默认值为 10
自动文件同步
对现有文件重命名、截断或重写后,一些应用程序无法正确执行 fsync。默认设置下,执行这些操作之后,ext4 会自动同步文件。但这样会比较耗时。
如果不需要此级别的同步,您可在挂载时通过指定 noauto_da_alloc 选项禁用该行为。如果 noauto_da_alloc 已设置,应用程序必须明确使用 fsync 以确保数据的持久化。
日志 I/O 优先级
默认设置下日志 I/O 优先级为 3,该值比常规 I/O 的优先级略高。您可在挂载时使用 journal_ioprio 参数控制日志 I/O 的优先级。journal_ioprio 的有效值范围为从 07,其中 0 表示具有最高优先级的 I/O。
本章节仅描述挂载时可用的一些选项。更多选项,参见 mount 手册页:
$ man mount

5.3.7.3. 调整 btrfs

自红帽企业版 Linux 7.0 起,btrfs 作为技术预览而为用户提供。如果 btrfs 受到全面支持,本章节将在未来更新。

5.3.7.4. 调整 GFS2

本章节涵盖 GFS2 文件系统在格式化和挂载时可用的调整参数。
目录间距
GFS2 挂载点的顶层目录中创建的所有目录都是自动间隔,以减少目录中的碎片并提高写速度。为像顶层目录间隔其他目录,用 T 属性标注该目录,如示,用您想间隔该目录的路径替代 dirname
# chattr +T dirname
chattr 作为 e2fsprogs 软件包中的一部份为用户提供。
减少争用
GFS2 使用全域锁机制,该机制需要簇中节点之间的通信。多节点之间的文件和目录争用会降低性能。通过最小化多节点间共享的文件系统区域,您可将缓存失效的风险最小化。

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。