Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

8.4. 配置工具

Red Hat Enterprise Linux 提供了很多工具来协助管理员配置存储和文件系统。本节概述了可用的工具,并提供了如何使用它们来解决 Red Hat Enterprise Linux 7 中的 I/O 和文件系统相关性能问题的示例。

8.4.1. 为存储性能配置调优配置集

Tuned 服务提供了很多配置集,旨在提高特定用例的性能。以下配置集对提高存储性能特别有用:
  • latency-performance
  • throughput-performance(默认)
要在您的系统上配置配置集,请运行以下命令,将 name 替换为您要使用的配置集的名称。
$ tuned-adm profile name
tuned-adm recommend 命令为您的系统推荐适当的配置集。
有关这些配置集或附加配置选项的详情,请参考 第 A.5 节 “tuned-adm”

8.4.2. 设置默认 I/O 调度程序

如果没有为该设备明确指定其他调度程序,则默认 I/O 调度程序是调度程序。
如果没有指定默认调度程序,则 cfq 调度程序用于 SATA 驱动器,截止时间调度程序 用于所有其他驱动器。如果您按照本节中的说明指定默认调度程序,则默认调度程序将应用到所有设备。
要设置默认的 I/O 调度程序,您可以使用 Tuned 工具,或者手动修改 /etc/default/grub 文件。
红帽建议使用 Tuned 工具在引导的系统上指定默认的 I/O 调度程序。要设置 elevator 参数,启用 磁盘插件。有关 disk 插件的详情,请参考 Tuned 章节中的 第 3.1.1 节 “插件”
要使用 GRUB 2 修改默认调度程序,请在内核命令行中附加 elevator 参数(在引导时或系统引导时)。您可以使用 Tuned 工具,或者手动修改 /etc/default/grub 文件,如 过程 8.1, “使用 GRUB 2 设置默认 I/O 调度程序” 所述。

过程 8.1. 使用 GRUB 2 设置默认 I/O 调度程序

要在引导的系统中设置默认 I/O 调度程序,并在重启后保留配置:
  1. /etc/default/grub 文件中的 GRUB_CMDLINE_LINUX 行中添加 elevator 参数。
    # cat /etc/default/grub
    ...
    GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=vg00/lvroot rd.lvm.lv=vg00/lvswap elevator=noop"
    ...
    
    在 Red Hat Enterprise Linux 7 中,可用的调度程序为 deadlinenoop、和 cfq。如需更多信息,请参阅内核文档中的 cfq-iosched.txtdeadline-iosched.txt 文件,在安装 kernel-doc 软件包后可用。
  2. 创建一个新的配置,并添加了 elevator 参数。
    GRUB 2 配置文件的位置在具有 BIOS 固件的系统和 UEFI 系统中的位置不同。使用下列命令之一重新创建 GRUB 2 配置文件:
    • 在带有 BIOS 固件的系统中,请使用:
      # grub2-mkconfig -o /etc/grub2.cfg
    • 在带有 UEFI 固件的系统中,请使用:
      # grub2-mkconfig -o /etc/grub2-efi.cfg
  3. 重启系统以使更改生效。
    有关 GNU GRand Unified Bootloader(GRUB 2)版本 2 的更多信息,请参阅 Red Hat Enterprise Linux 7 系统管理员指南的使用 GRUB 2 Boot Loader 章节。

8.4.3. 通用块设备调优参数

本节中列出的通用调优参数位于 /sys/block/sdX/queue/ 目录中。列出的调优参数与 I/O 调度程序调优分开,并适用于所有 I/O 调度程序。
add_random
有些 I/O 事件贡献到 /dev/random 的熵池。如果这些贡献的开销成为可测量,则此参数可以设置为 0。
iostats
默认值为 1 (enabled)。将 iostats 设置为 0 可禁用为该设备收集 I/O 统计,这会删除 I/O 路径的少量开销。将 iostats 设置为 0 可能会稍提高高性能设备的性能,比如某些 NVMe 固态存储设备。建议启用 iostats,除非供应商为给定的存储模型指定。
如果您禁用 iostats/proc/diskstats 文件中不再存在该设备的 I/O 统计信息。/sys/diskstats 的内容是监控 I/O 工具的 I/O 信息源,如 sariostats。因此,如果您为某个设备禁用 iostats 参数,则 I/O 监控工具输出中不再存在该设备。
max_sectors_kb
以 KB 为单位指定 I/O 请求的最大大小。默认值为 512 KB。此参数的最小值由存储设备的逻辑块大小决定。此参数的最大值由 max_hw_sectors_kb 的值决定。
当 I/O 请求大于内部纠删块大小时,某些固态磁盘的性能不佳。确定与系统连接的固态磁盘模型是否如此,请与硬件供应商核对并遵循他们的建议。红帽建议 max_sectors_kb 始终是最佳 I/O 大小和内部清除块大小的倍数。如果参数为零或未由存储设备指定,则使用 logical_block_size 值。
Nomerges
大多数工作负载均可从请求合并中受益。但是,禁用合并对于调试很有用。默认情况下,nomerges 参数设置为 0, 它可启用合并。要禁用简单的单页合并,将 nomerges 设置为 1。要禁用所有类型的合并,将 nomerges 设置为 2
nr_requests
指定一次可以排队的最大读取和写入请求数。默认值为 128,这意味着在下一个进程请求读取或写入请求之前可以排队 128 个读取请求和 128 个写入请求,以请求读取或写入到 sleep。
对于对延迟敏感的应用,降低此参数的值,并在存储上限制命令队列深度,以便回写 I/O 无法为设备队列填入写入请求。当设备队列填满时,试图执行 I/O 操作的其他进程将处于睡眠状态,直到队列空间可用为止。然后以轮循方式分配请求,防止一个进程持续占用队列中的所有位置。
I/O 调度程序内的最大 I/O 操作数是 nr_requests*2。如前文所述,nr_requests 会单独应用读和写。请注意,nr_requests 只适用于 I/O 调度程序中的 I/O 操作,而不是已经分配给底层设备的 I/O 操作。因此,针对某个设备的 I/O 操作的最大未处理限制是 (nr_requests*2)+(queue_depth),其中 queue_depth/sys/block/sdN/device/queue_depth,有时也称为 LUN 队列深度。您可以在一个vg qu-sz 列中看到此未完成的 I/O 操作数,例如 iostat 的输出。
optimal_io_size
有些存储设备通过此参数报告最佳 I/O 大小。如果报告这个值,红帽建议应用程序尽可能在最佳 I/O 大小的倍数中与 I/O 一致。
read_ahead_kb
定义操作系统可在后续读取操作期间提前读取的最大 KB 数。因此,下一顺序读取的内核页面缓存中已存在所需的信息,这提高了读取 I/O 性能。
设备映射器通常受益于高 read_ahead_kb 值。要映射每个设备的 128 KB 是很好的起点,但将 read_ahead_kb 值增加到 4-8 MB 可能会在出现大量文件顺序读取的应用程序环境中提高性能。
rotational
有些固态磁盘无法正确公布其固态状态,而是作为传统旋转磁盘挂载。如果您的固态设备没有自动将其设置为 0, 请手动将其设置为调度程序中的不必要的 seek-reducing 逻辑。
rq_affinity
默认情况下,可在不同于发出 I/O 请求的处理器的不同处理器处理 I/O 完成。将 rq_affinity 设置为 1 可禁用此功能,并仅在发出 I/O 请求的处理器中执行完成。这可以提高处理器数据缓存的效率。
scheduler
要为特定存储设备设置调度程序或调度程序首选项顺序,请编辑 /sys/block/devname/queue/scheduler 文件,其中 devname 是您要配置的设备的名称。
# echo cfq > /sys/block/hda/queue/scheduler

8.4.4. 调整截止调度程序

当使用 截止时间 时,排队的 I/O 请求将排序为读取或写入批处理,然后调度以增加 LBA 顺序执行。默认情况下,读取批处理优先于写入批处理,因为应用更有可能阻止读取 I/O。处理批处理后,截止时间 检查写操作在处理器时间不足,并根据情况调度下一个读取或写入批处理。
以下参数会影响 截止时间调度程序 的行为。
fifo_batch
在单个批处理中发布的读取或写入操作数量。默认值为 16。更高的值可以提高吞吐量,但也会增加延迟。
front_merges
如果您的工作负载永远不会生成前端合并,可以将此可调项设置为 0。但是,除非您衡量了这个检查的开销,否则红帽推荐使用默认值 1
read_expire
服务调度读取请求的毫秒数。默认值为 500 (0.5 秒)。
write_expire
服务调度写入请求的毫秒数。默认值为 5000 (5 秒)。
writes_starved
在处理写入批处理前可以处理的读取批处理数量。设置这个值越大,读取批处理的首选值越大。

8.4.5. 调优 CFQ 调度程序

使用 CFQ 时,进程被分为三个类:实时、尽力和空闲。在任何最佳工作进程之前,所有实时进程都排期,在任何空闲进程之前调度。默认情况下,进程被归类为最佳工作。您可以使用 ionice 命令手动调整进程的类。
您可以使用下列参数进一步调整 CFQ 调度程序的行为:这些参数通过在 /sys/block/devname/queue/iosched 目录下更改指定的文件来基于每个设备设置。
back_seek_max
CFQ 将执行向后寻道的最大距离(以千字节为单位)。默认值为 16 KB。向后寻寻通常会破坏性能,因此不建议大量价值。
back_seek_penalty
当磁盘头是决定前进还是向后时,用于向后寻找的倍数。默认值为 2。如果磁盘头位置为 1024 KB,且系统中存在 equidistant 请求(例如,1008 KB 和 1040 KB),则 back_seek_penalty 会被应用到向后看到距离和磁盘移动转发。
fifo_expire_async
异步(缓冲写入)请求可以保持未服务的时间长度(以毫秒为单位)。达到此时间后,一个有不足的异步请求将移到分配列表中。默认值为 250 毫秒。
fifo_expire_sync
同步(读取或 O_DIRECT 写入)请求的时间长度(以毫秒为单位)。达到此时间后,将一个无助的同步请求移到分配列表中。默认值为 125 毫秒。
group_idle
这个参数默认设置为 0 (禁用)。当设置为 1 ( 启用)时,cfq 调度程序会在控制组中发出 I/O 的最后一个进程上闲置 cfq 调度程序。这在使用比例权重 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 ( 启用)。启用后,cfq 通过为每个进程在设备上发出 I/O 的最大等待时间为 300 毫秒来取代吞吐量。当此参数被设置为 0 (禁用)时,会忽略目标延迟,每个进程都会获得完整的时间分片。
quantum
此参数定义 cfq 一次发送到一个设备的 I/O 请求数,本质上限制队列深度。默认值为 8 个请求。使用的设备可能会支持更大的队列深度,但增加 Quantum 的值也会增加延迟,特别是对于较大的连续写入工作负载。
slice_async
此参数定义分配给每个进程发布异步 I/O 请求的时间片段(以毫秒为单位)。默认值为 40 毫秒。
slice_idle
这个参数指定 cfq 在等待进一步请求时闲置的时长,以毫秒为单位。默认值为 0 ( 在队列或服务树级别闲置)。默认值为外部 RAID 存储上的吞吐量的理想选择,但可能会在内部非 RAID 存储中降级吞吐量,因为它会增加寻道操作总数。
slice_sync
此参数定义分配给每个进程发布同步 I/O 请求的时间片段的长度(以毫秒为单位)。默认值为 100 ms。

8.4.5.1. 为快速存储调优 CFQ

对于不会遭受大的看法(如快速外部存储阵列或固态磁盘)的硬件,不建议使用 cfq 调度程序。如果您的用例需要在此存储中使用 cfq,则需要编辑以下配置文件:
  • /sys/block/devname/queue/iosched/slice_idle 设置为 0
  • /sys/block/devname/queue/iosched/quantum 设置为 64
  • /sys/block/devname/queue/iosched/group_idle 设置为 1

8.4.6. 调整 noop 调度程序

noop I/O 调度程序主要用于使用快速存储的 CPU 绑定系统。另外,noop I/O 调度程序通常不是特别的,在对虚拟磁盘执行 I/O 操作时用于虚拟机。
没有特定于 noop I/O 调度程序的可调参数。

8.4.7. 为性能配置文件系统

这部分论述了特定于 Red Hat Enterprise Linux 7 支持的每个文件系统的调优参数。根据以下条件来划分参数:在格式化存储设备时应配置其值,还是挂载格式化的设备时。
如果性能丢失是由文件碎片或资源争用导致的,通常可以通过重新配置文件系统来提高性能。但在某些情况下,可能需要更改应用。在这种情况下,红帽建议联系客户支持以获取帮助。

8.4.7.1. 调优 XFS

本节介绍在格式化和挂载时供 XFS 文件系统使用的一些调优参数。
XFS 的默认格式化和挂载设置适用于大多数工作负载。红帽建议仅在特定的配置更改能让您的工作负载受益时才更改它们。
8.4.7.1.1. 格式化选项
有关这些格式化选项的详情,请查看 man page:
$ man mkfs.xfs
目录块大小
目录块大小会影响每个 I/O 操作可以检索或修改的目录信息量。目录块大小的最小值是文件系统块大小(默认为 4 KB)。目录块大小的最大值为 64 KB。
在给定的目录块大小中,较大的目录需要比较小的目录更多的 I/O。与目录块大小较小的系统相比,每个 I/O 操作的处理能力也越多。因此,建议针对您的工作负载,尽可能小的目录和目录块大小。
对于不超过 write-heavy 和 read-heavy 工作负载列出的文件系统,红帽建议 表 8.1 “目录块大小的建议最大目录条目” 中列出的目录块大小。
有关目录块大小对不同大小的文件系统中读写工作负载的影响的详情,请查看 XFS 文档。
要配置目录块大小,请使用 mkfs.xfs -l 选项。详情请查看 mkfs.xfs 手册页。
分配组
分配组是一种独立结构,用于索引可用空间并在文件系统的某一部分分配索引节点。每个分配组都可以独立修改,允许 XFS 同时执行分配和分配操作,只要并发操作影响不同的分配组。因此,文件系统中可执行的并发操作数等于分配组的数量。但是,由于执行并发操作的能力也受到能够执行操作的处理器数量的限制,红帽建议分配组的数量大于或等于系统中的处理器数量。
单个目录无法由多个分配组同时修改。因此,红帽建议创建和删除大量文件的应用程序不会将所有文件存储在单个目录中。
要配置分配组,请使用 mkfs.xfs -d 选项。详情请查看 mkfs.xfs 手册页。
增长限制
如果您需要在格式化时间后增加文件系统的大小(可以通过添加更多硬件或通过精简配置),您必须仔细考虑初始文件布局,因为在格式化完成后将无法更改分配组大小。
分配组的大小必须根据文件系统的最终容量而非初始容量来确定大小。全增长的文件系统中的分配组数量不应超过数百个,除非分配组的最大大小为 1 TB。因此,对于大多数文件系统,建议允许文件系统的最大增长为初始大小的十倍。
在 RAID 阵列中增大文件系统时,需要格外小心,因为设备大小必须与分配组大小的倍数一致,以便在新添加的存储上正确匹配新的分配组标头。新存储还必须具有与现有存储相同的地理位置,因为 geometry 在格式化后无法更改,因此无法针对同一块设备上不同地理位置的存储进行优化。
索引节点大小和内联属性
如果索引节点有足够的可用空间,XFS 可以直接将属性名称和值写入索引节点。这些内联属性可以比检索独立属性块更快检索和修改,因为不需要额外的 I/O。
默认索引节点大小为 256 字节。根据存储在索引节点中的数据区块指针数量,该属性存储仅可使用大约 100 字节。当您格式化文件系统时,增加索引节点大小可以增加存储属性的可用空间量。
属性名称和属性值都限制为最大 254 字节大小。如果 name 或值的长度超过 254 字节,则该属性将被推送到单独的属性块,而不是内嵌存储。
要配置 inode 参数,请使用 mkfs.xfs -i 选项。详情请查看 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
8.4.7.1.2. Mount Options
内节点分配
强烈建议用于大于 1 TB 的文件系统。inode64 参数将 XFS 配置为在整个文件系统中分配 inode 和数据。这样可确保索引节点不会在文件系统的开头大量分配,而且不会在文件系统的末尾大量分配数据,从而提高大型文件系统的性能。
日志缓冲区大小和编号
日志缓冲区越大,向日志写入所有更改时所用的 I/O 操作较少。更大的日志缓冲可以改进具有 I/O 密集型工作负载且没有非易失性写入缓存的系统的性能。
日志缓冲区大小使用 logbsize 挂载选项进行配置,并且定义可在日志缓冲区中存储的最大信息量;如果没有设置日志条带单元,缓冲区写入可能会比最大值更短,因此不需要减少同步密集型工作负载的日志缓冲区大小。日志缓冲区的默认大小为 32 KB。最大值为 256 KB 和其他支持的大小为 64 KB、128 KB 或日志分条单元在 32 KB 和 256 KB 之间的两个倍数。
日志缓冲区数量由 logbufs 挂载选项定义。默认值为 8 日志缓冲(最大值),但只能配置两个日志缓冲区。通常不需要减少日志缓冲区的数量,除非在内存绑定系统上无法将内存分配给额外的日志缓冲。减少日志缓冲区数量可能会降低日志性能,特别是在对日志 I/O 延迟敏感的工作负载上。
延迟更改日志
XFS 可以选择在将更改写入日志之前聚合内存中的更改。delaylog 参数允许定期写入日志,而不是每次修改的元数据。这个选项会增加崩溃时可能会丢失的操作数量,并会增加用于跟踪元数据的内存量。但是,它也可以通过一个量级来提高元数据修改速度和可扩展性,当 fsyncfdatasyncsync 用于确保将数据和元数据写入磁盘时,它不会降低数据或元数据的完整性。
有关挂载选项的更多信息,请参阅 man xfs

8.4.7.2. 调优 ext4

本节介绍 ext4 文件系统在格式和挂载时可用的一些调优参数。
8.4.7.2.1. 格式化选项
内节点表初始化
在非常大的文件系统中初始化所有索引节点可能需要很长时间。默认情况下,初始化过程会被延迟(启用索引节点表初始化)。但是,如果您的系统没有 ext4 驱动程序,则默认情况下禁用 lazy inode 表初始化。它可以通过将 lazy_itable_init 设置为 1 来启用。在这种情况下,内核进程在挂载文件系统后继续初始化文件系统。
本节仅介绍一些在格式时可用的选项。有关进一步格式化参数,请查看 mkfs.ext4 手册页:
$ man mkfs.ext4
8.4.7.2.2. Mount Options
索引节点表初始化率
启用 lazy 内节点表初始化时,您可以通过为 init_itable 参数指定值来控制初始化的速率。执行后台初始化所需的时间大致等于 1 与此参数的值除以。默认值为 10
自动文件同步
有些应用程序在重命名现有文件后,或者在截断和重写后无法正确执行 fsync。默认情况下,ext4 会在每个这些操作后自动同步文件。然而,这可能非常耗时。
如果不需要这种同步级别,您可以在挂载时指定 noauto_da_alloc 选项来禁用此行为。如果设置了 auto_da_alloc,应用程序必须显式使用 fsync 来确保数据持久性
日志 I/O 优先级
默认情况下,日志 I/O 的优先级为 3,它比普通 I/O 的优先级稍高。您可以在挂载时使用 journal_ioprio 参数控制日志 I/O 的优先级。journal_ioprio 范围的有效值从 070 是最高优先级 I/O。
本节仅介绍挂载时可用的部分选项。有关更多挂载选项,请参阅 mount 手册页:
$ man mount

8.4.7.3. 调优 Btrfs

从红帽企业 Linux 7.0 开始,Btrfs 作为技术预览提供。应始终进行调优,以根据系统当前的工作负载优化系统。有关创建和挂载选项的详情,请参考《Red Hat Enterprise Linux 7 存储管理指南 》中关于 Btrfs 的章节。

数据压缩

默认的压缩算法是 zlib,但特定的工作负载可能会给出更改压缩算法的原因。例如,如果您有一个包含大量文件 I/O 的线程,则最好使用 lzo 算法。挂载时的选项有:
  • compress=zlib - 默认的 选项,具有高压缩率,对于较旧的内核而言是安全的。
  • compress=lzo - 压缩速度快,但比 zlib 更低.
  • compress=no - 禁用压缩.
  • press-force=方法 - 即使对于不压缩效果的文件(如视频和磁盘映像)也启用压缩。可用的方法为 zliblzo
仅压缩在挂载选项中添加后创建或更改的文件。要压缩现有文件,请在使用 zliblzo 替换方法后运行以下命令
$ btrfs filesystem defragment -cmethod
要使用 lzo 重新压缩文件,请运行:
$ btrfs filesystem defragment -r -v -clzo /

8.4.7.4. 调整 GFS2

本节介绍了 GFS2 文件系统在格式和挂载时可用的一些调优参数。
目录间进行
GFS2 挂载点顶级目录中创建的所有目录都会自动占用空间,以减少碎片并提高这些目录中的写入速度。对于另一个目录(如顶级目录),请将该目录标记为 T 属性,如下所示,将 dirname 替换为您想要空间的目录的路径:
# chattr +T dirname
chattr 作为 e2fsprogs 软件包的一部分提供。
减少争用
GFS2 使用一种全局锁定机制,需要集群节点之间的通信。多个节点间的文件和目录争用会降低性能。您可以通过最小化在多个节点间共享的文件系统区域来最小化跨缓存无效的风险。