Linux调优文件系统的利用率
一、本地文件系统
Red Hat Enterprise Linux为系统管理员提供了两种本地文件系统的选择,以满足其系统的工 作负载需求,即XFS和ext4文件系统。在RHEL 7中,XFS是默认的文件系统选择,ext4是另一个 选项。在RHEL 8中,XFS继续作为默认的文件系统选择。Ext4在RHEL 8上仍然作为文件系统选项 可用。 #xfs文件系统 XFS最初由Silicon Graphics, Inc.创建,是一个健壮的、可高度伸缩的高性能文件系统。与 RHEL 7一样,RHEL 8中的XFS是引导、根和用户数据分区的默认文件系统。 与ext4的50TB文件系统限制相比,XFS支持单文件高达1PB的大小和和8EB文件系统大小,是大型 服务器和高端存储设备的明显选择。XFS对具有多个cpu和内核的大型系统进行了良好的调优,对 于大多数工作负载,它将比ext4提供更好的性能。 XFS提供了几种分配方案,例如基于区段的分配、感知条纹的分配策略、延迟分配、空间预分配和 动态分配索引节点。XFS还支持元数据日志记录,这有助于更快地进行崩溃恢复。 与大多数其他文件系统不同,XFS在引导期间不执行文件系统完整性检查。XFS文件系统可以在挂 载和活动时进行碎片整理和扩展。然而,不幸的是,即使在脱机时,它也不能缩容。 #ext4文件系统 Ext4是ext3文件系统的可扩展扩展。ext4驱动程序透明地提供了对ext2和ext3文件系统的持续 支持。与RHEL 7一样,在RHEL8中,ext4文件系统支持的最大大小为50TB,最大文件大小为 16TB。 Ext4使用区段分配,并提供以下分配方案:持久预分配、延迟分配、多块分配和感知条纹的分配。 虽然XFS被认为是大型系统和高性能存储设备的领先文件系统,但对于某些特定的工作负载,如具 有同步更新的单线程、单磁盘工作负载和小文件,ext4可以提供比XFS更好的性能。与XFS一样, ext4文件系统可以在在线时增长大小。 然而,尽管XFS文件系统目前不支持在联机或脱机状态下缩小文件系统,但ext4文件系统可以在卸 载时缩容。 #本地文件系统建议 通常,Red Hat建议你使用XFS,除非你有ext4的特定用例。在下表中,你将得到一个总结指南, 以评估哪个文件系统更适合你的用例。请记住,还应该度量特定应用程序的性能,以确保选择了适 当类型的文件系统。

#SSD文件系统建议 fstrim 用于回收(又称为trim)一个已挂载的文件系统上所有未使用的块;这对于固态硬盘(SSD)和精简配置(thinly-provisioned)的存储设备比较有意义。默认情况下,fstrim 将会回收文 件系统上所有未使用的块。但是可以通过选项限定回收的范围和大小。 在过去的十年中,固态驱动器(SSD)带来了一种管理存储的新方法。与上一代的转盘产品相比, SSD 具有无声、更冷却的操作和更快的接口规格等优点。当然,新技术带来了新的维护和管理方 法。SSD 具有一种称为 TRIM 的功能。从本质上讲,这是一种用于回收设备上未使用的块的方 法,该块可能先前已被写入,但不再包含有效数据,因此可以返回到通用存储池以供重用。 Opensource.com 的 Don Watkins 首先在其 2017 年的文章《Linux 固态驱动器:为 SSD 启用 TRIM》中介绍过 TRIM 的内容。(https://linux.cn/article-11959-1.html) 固态硬盘可以应用我们在上表中列出的相同建议。ext4和XFS文件系统都支持TRIM命令或丢弃操 作。在RHEL中,可以选择三种方法应用丢弃操作:批量丢弃、计划批量丢弃和在线丢弃。 batch discard操作由执行fstrim命令的用户按需运行。在/mymountpoint挂载点上执行批量丢 弃操作。 计划批处理丢弃操作受益于使用系统单元fstrim。每周在所有可用的挂载点运行一个fstrim命令 的计时器。那些具有具有TRIM支持的底层设备的将对未使用的数据块进行丢弃操作。此预定丢弃 操作无需用户干预即可运行。使用fstrim启用预定的批丢弃操作。定时器系统单元,执行以下命 令: systemctl enable --now fstrim.timer 在线丢弃操作在挂载时指定。这种在线丢弃操作实时运行,无需用户干预。使用mount命令启用挂 载时在线丢弃操作,执行如下命令: mount-o discard /dev/mydevice /mymountpoint 要持久地启用挂载时的在线丢弃操作,可以在/etc/fstab配置文件中添加如下一行: cat /etc/fstab /dev/mydevice /mymountpoint xfs defaults,discard 0 0 即使丢弃操作的使用提高了指定设备的整体性能,但在执行此过程时,设备的整体性能也会受到影 响。出于这个原因,以及SSD上的磨损,Red Hat建议在工作负载或性能维护允许的情况下,使用 计划批量丢弃(每周一次)或批量丢弃(按需求)而不是在线丢弃。
二、文件系统格式化参数
在某些情况下,文件系统创建选项是针对特定用例或工作负载调优或设置文件系统的唯一方法。 ext4和XFS文件系统都有自己的选项集。 #xfs 以下格式化选项是XFS文件系统用例中最常见的: Inode大小:如果目标用例大量使用扩展属性,建议将XFS索引节点大小增加到512字节。缺省情况 下,inode大小设置为256字节。使用实例设置文件系统创建时的inode大小。mkfs.xfs-i size=512 /dev/mydevice 目录的逻辑块大小:从默认的4096字节增加目录的逻辑块大小将减少目录的I/O,并将提高目录操 作的性能。使用实例设置文件系统创建时目录的逻辑块大小。以如下命令为例: mkfs.xfs-n size=8192 /dev/mydevice RAID对齐:为了使文件系统层的I/O对齐,在格式化文件系统时,设置正确的分条单元(分条元素大 小)和分条宽度(数据磁盘个数)是非常重要的。这些选项有时是自动检测的,但是许多硬件RAID卷 需要手动配置。例如,要将具有两个数据磁盘和512k块大小的RAID0设备与顶部的XFS文件系统对 齐,可以执行以下命令: 1.3文件系统挂载参数 mkfs.xfs-d su=512k,sw=2 /dev/myraid #ext4 以下格式化选项是ext4文件系统用例中最常见的: Inode大小:在使用ext4文件系统的情况下,小文件占主导地位,不使用扩展属性,可以减小 inode大小以优化磁盘空间。默认的inode大小是256K。使用实例在文件系统创建时设置inode大 小。 [root@host-]# mkfs.ext4 -I 128 /dev/mydevice extra_isize:extra_isize特性在每个inode中为扩展元数据保留特定数量的空间。如果我们使 用减小后的inode大小(小于256K),则该选项无效,应该禁用。默认情况下该选项是启用的。使 用实例在文件系统创建时禁用extra_size特性: [root@host-]# mkfs.ext4 -O ^extra_size /dev/mydevice large_dir:large_dir特性通过提高目录的最大大小来增加每个目录的文件数量限制。默认情况 下该选项是禁用的。使用实例在文件系统创建时启用large_dir特性: [root@host-]# mkfs.ext4 -O large_dir /dev/mydevice huge_file:huge_file特性允许文件的大小大于2TB。对于ext4文件系统的典型用例(其中小文 件占主导地位),应该禁用此功能。默认情况下该选项是启用的。使用实例在文件系统创建时禁用 huge_file特性: [root@host-]# mkfs.ext4 -O ^huge_file /dev/mydevice RAID对齐:为了使文件系统层的I/O对齐,在格式化文件系统时,设置正确的分条单元(分条元素大 小)和分条宽度(数据磁盘数量)是非常重要的。这些选项有时是自动检测的,但许多硬件RAID卷需 要手动配置。例如,要将一个RAID0设备(包含两个数据磁盘,块大小为512 K)与顶部的ext4文件 系统对齐,执行以下命令: mkfs.ext4-E stride=128,stripe-width=256 /dev/mydevice
三、文件系统挂载参数
可以在ext4和XFS文件系统上调优的另一组设置是挂载选项。每个文件系统都有一些通用选项和特 定选项。 #通用挂载选项 XFS和ext4文件系统的一些常用挂载选项与更新文件和目录的inode访问时间有关。 1.atime:这个mount选项将更新索引节点访问时间的控制权授予内核默认行为。 1.4文件系统性能测试 2.relatime:如果文件或目录被修改或更改,此挂载选项将更新inode访问时间,否则它将在一天 中更新一次访问时间,而不是在每次访问文件或目录时更新。该选项在XFS和ext4文件系统上默认 启用。 3.noatime:此挂载选项不更新此文件系统上的inode访问次数,适用于文件和目录。 4.nodiratime:此挂载选项不更新此文件系统上的inode访问次数,只适用于目录。 #xfs挂载参数 RHEL 8中的XFS文件系统提供了一组预定义的选项,这些选项使它们的性能达到最佳。但是,我们 可以根据情况调整如下参数: 1.inode64:使用inode64分配策略,inode被放置在数据附近,从而最小化了磁盘寻道。RHEL 8 默认启用inode64选项。 2.logbsize:logbsize处理XFS文件系统上的日志缓冲区大小。logbsize越大,将所有更改写入 日志所需的I/O操作就越少。在具有I/O密集型工作负载且没有非易失性写缓存的系统上,更大的 日志缓冲区可以提高性能。缺省情况下,日志缓冲区的大小为32 KB。其他可配置的常用日志缓冲 区大小有64kB、128kB和最大256kB。 #ext4挂载选项 与XFS一样,RHEL 8中的ext4文件系统也提供了一组预定义的选项,使其性能达到最佳。但是, 我们可以根据情况调整如下参数: 1.i_version:i_version挂载选项将启用64位inode版本支持,这对于扩展属性的大量用例非常 有用。默认情况下i_version是禁用的。 2.journal_ioprio:journal_ioprio挂载选项控制日志I/O的优先级。取值范围为0~7,其中0 为优先级最高的I/O。journal_ioprio挂载选项的默认值为3,略高于正常I/O的优先级。
四、文件系统性能测试
有了RHEL 8中可用的文件系统选择,系统管理员可以接受默认的XFS文件系统选择,也可以在向新 的磁盘设备分配文件系统时使用ext4文件系统。虽然对于大多数工作负载,XFS提供了比ext4更 好的性能,但ext4在某些场景中会产生更好的性能。 为文件服务器和数据库服务器分配的系统可能具有不同的工作负载特征。这些特征可以包括创建或 访问的文件大小、I/O操作的频率和并发性以及读操作与写操作的比率。即使分配给相同角色的服 务器,由于不同的事务量和配置差异(例如托管服务的调试或日志级别),也可能在文件系统层施加 非常不同的工作负载。为了准确地评估哪个文件系统最适合特定系统上的工作负载,管理员需要设 计一种方法,针对该系统的工作负载对文件系统性能进行基准测试。 虽然dd、hdparm和bonnie++等实用工具对于分析存储设备的性能非常有用,但它们的吞吐量测试 结果与系统上运行的服务施加的实际工作负载几乎没有关联。为了使基准测试结果具有相关性,必 须使用在文件系统层模拟实际工作负载的基准测试例程来获得基准测试结果。为了做到这一点,管 理员需要开发测试,模拟将由系统工作负载施加的I/O操作的性质。对于文件服务器,这可能涉及 大文件的上传或下载。对于数据库服务器,这可能涉及数据库转储、执行大量并发数据库查询,或 者执行具有复杂连接的大型数据库查询。 如果基准测试设计良好,它们将产生可测量的、相关的和有意义的结果。通过运行这样的测试,在 不同的文件系统上施加模拟工作负载,管理员可以比较结果,清楚地确定哪个文件系统的性能更 好,并计算性能差异的差额。根据性能差异的大小,管理员可以选择性能更高的文件系统,也可以 不选择。
五、journal日志位置
在文件系统中拥有日志可以加速文件系统恢复,这在处理较大的文件系统时变得非常重要。日志作 为文件系统的一种日志,可以加快文件系统的恢复。每当要对文件系统进行更改时,事务将被记录 在日志中。操作完成后,日志条目将被删除。这意味着在电源丢失后,恢复进程只需要检查日志 (如果需要则重播日志)和受日志影响的文件系统部分,而不是整个文件系统。 XFS为mount命令提供了一个norecovery选项。当在挂载期间为XFS文件系统指定此选项时,将禁 用日志恢复。如果文件系统没有被干净地挂载,那么它很可能是不一致的,并且可能导致一些文件 或目录变得不可访问。因此,使用norecovery选项挂载的XFS文件系统只能以只读方式挂载。 ext3/ext4日志可以在三种不同的模式下工作,通过在挂载时将data=mode选项传递给文件系统来 选择。默认模式为ordered。这三种模式是: ordered:日志中只记录元数据。只有在将所有文件数据刷新到磁盘之后,才会提交日志条目。 2.2外部的journal writeback:日志中只记录元数据,但不保留数据顺序。据说这是最快的方法,而且可以保证内部 文件系统的完整性。但是在崩溃和恢复之后,旧数据可能会出现在文件系统中。 journal:所有数据在写入磁盘之前首先存储在日志中。这为文件系统提供了最好的可靠性,但在 大多数工作负载中可能是最差的性能。在具有许多小型写操作的工作负载中,这有助于提高性能, 因为磁盘提升机有机会将写操作分组在一起。 #Barriers(屏障) 写屏障是在设备上强制执行写顺序的一种方法,设备上支持写缓存。当启用了barrier时,就保证 了数据和日志条目之间的提交顺序,确保在崩溃时文件系统是可恢复的。 XFS和ext4文件系统在默认情况下都打开了barrier。自内核v4.10以来,已弃用XFS文件系统中 的nobarrier挂载选项。从那个内核版本开始,总是执行完整性操作,甚至指定nobarrier挂载选 项不起作用。现在,在默认情况下,障碍总是启用的,不能在XFS文件系统中禁用。 要在ext4文件系统的挂载时启用或禁用barrier,请使用barrier/nobarrier挂载选项。你还可 以使用旧的barrier=1或barrier=0挂载选项。在使用电池支持的缓存并使用ext4文件系统的设 备上,可以禁用障碍以提高性能,同时仍然保证数据完整性。
六、外部的journal
默认情况下,在创建XFS和ext4文件系统时,它们的日志与文件系统数据放在同一个块设备上。文 件系统写操作之前更新文件系统日志中相应的元数据。对于某些工作负载,例如涉及大量随机写的 工作负载,写操作及其伴随的日志更新之间可能存在磁盘争用。 在某些存储配置中,比如仍然使用旋转磁盘的存储配置,提高日志性能的一种方法是将日志放在与 包含文件系统的不同的设备上。将日志放在低延迟设备上,如SSD、NVMe或电池支持的ramdisk, 可以显著提高性能。将日志从主磁盘移开的行为可以减少磁盘寻道的数量并提高主磁盘的性能。 #在xfs文件系统中的外部日志 要创建带有外部日志的新XFS文件系统,请使用logdev日志部分选项。在下面的示例中,假 设/dev/vdc1是主文件系统的分区,/dev/vdd1是日志设备的分区。可以使用以下命令创建主文件 系统及其外部日志。 mkfs.xfs-l logdev=/dev/vdd1 /dev/vdc1 在挂载文件系统时,需要再次指定日志设备位置。位置是使用logdev挂载选项指定的。 mount-o logdev=/dev/vdd1 /dev/vdc1 /mnt 第十一章调优网络利用率 #在ext4文件系统中的外部日志 要使用外部日志创建新的ext4文件系统,你需要首先创建日志设备。 注意:ext4文件系统的外部日志必须使用相同的文件系统块设备大小,因此最佳实践是在创建日 志设备和主文件系统时指定块。 在下面的例子中,假设/dev/vdc1是主文件系统的4GiB分区,/dev/vdd1是日志设备的128 MiB 分区。首先使用4 KiB的块大小创建ext4日志: mkfs.ext4-O journal_dev -b 4096 /dev/vdd1 现在,日志设备已经准备好了,创建文件系统,指定日志设备和块大小: mkfs.ext4-J device=/dev/vdd1 -b 4096 /dev/vdc1 与XFS文件系统不同,在ext4文件系统中,不需要在挂载时指定外部日志设备。要将具有内部日志 的现有ext4文件系统转换为外部日志,首先找到现有文件系统块大小: tune2fs-l /dev/vdc 创建与目标文件系统相同块大小的外部日志设备。 mkfs.ext4-O journal_dev -b 4096 /dev/vdd1 umount /dev/vdc1 卸载文件系统,然后删除现有的日志并添加外部日志。 mkfs.ext4-O journal_dev -b 4096 /dev/vdd1 umount /dev/vdc1 卸载文件系统,然后删除现有的日志并添加外部日志。 umount /dev/vdc1 tune2fs-O'^has_journal' /dev/vdc1 tune2fs-j-J device=/dev/vdd1 /dev/vdc1 注意:确保现有的日志在删除之前是空的,你可以完全卸载文件系统,或者先在文件系统上运行 fsck命令。