前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux 性能调优之文件系统调优

Linux 性能调优之文件系统调优

作者头像
山河已无恙
发布2024-02-26 16:15:27
6450
发布2024-02-26 16:15:27
举报
文章被收录于专栏:山河已无恙

写在前面


  • 考试整理相关笔记
  • 博文内容涉及,文件系统常见调优手段
    • 不同文件系统格式适用场景分析,格式化选项,挂载日志策略调整
    • 文件系统日志和数据分离配置
    • fstrim 空间回收
  • 理解不足小伙伴帮忙指正

不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树


红帽系从 RHEL8 开始默认文件系统为 XFS,不过 Ext4 依然是可以使用的文件系统方案。

ext4 (第四扩展文件系统): ext4 是Linux上最常用的文件系统之一,是对ext3文件系统的改进。它支持大文件和大容量分区,并提供更好的性能和可靠性。

XFS: XFS是一个高性能的日志文件系统,最初由SGI开发设计用于支持大型文件系统和大容量存储,被广泛用于大型服务器和高性能计算环境。它也同时支持大容量文件系统和文件,具有高性能和可扩展性。相对于 EXt4, 支持的容量更大。

  • XFS支持1PB的文件系统,单个文件大小限制为8EB
  • Ext4支持50TB的文件系统,单个文件大小限制为16TB

文件系统场景推荐:

XFS 适用场景:

  • 没有特定业务场景:XFS是一个通用的高性能文件系统,适用于各种不同类型的应用和工作负载。
  • 大型服务器:XFS在处理大型服务器和高负载环境中表现出色。它的设计目标之一是支持大容量存储和高性能需求。
  • 大存储设备:XFS适用于管理大容量存储设备,可以有效地处理大量的数据。
  • 大文件:XFS对于处理大文件(例如视频文件、数据库文件等)非常有效,它可以支持非常大的单个文件大小。
  • 多线程 I/O:XFS在处理多线程I/O时表现良好,可以同时处理多个并发的读写操作。

ext4 适用场景:

  • 小文件:ext4在处理小型文件时表现出色,它可以快速地处理大量的小文件。
  • 单线程 I/O:ext4对于单线程I/O操作(例如单个应用程序的顺序读写)非常高效。
  • 受限制的 I/O 能力:如果系统的I/O能力受限制(例如在较低的IOPS(每秒输入/输出操作数)或带宽限制下),ext4可以提供良好的性能。
  • 受限制的带宽:如果系统的带宽受限(例如在网络传输或存储设备限制下),ext4可以有效地利用可用带宽。
  • 绑定 CPU 的业务:ext4对于绑定在特定CPU上运行的业务(例如虚拟化环境或容器)具有良好的性能。
  • 支持离线缩减:ext4支持在线文件系统缩减,这在需要释放存储空间时非常有用

fstrim 空间回收

当系统让硬盘中写入一个 3G 数据时,硬盘会真实拷贝数据,但是删除数据,则仅仅是给文件打了一个标签(所以拷贝数据很慢,删除数据极快)。

固态硬盘需要擦写旧数据才能写入新数据,新的固态硬盘,有很多空闲空间,数据写入速度比较快,但是随着使用量的增加,很多数据用户删除了,但是对于存储控制器而言,那些数据还在,需要写新数据时,就需要先擦除旧数据

使用fstrim可以回收已挂载的文件系统上所有未使用的块,XFS和ext4都支持fstrim,fstrim命令通常需要以超级用户(root)权限运行

RHEL 支持多种方式进行回收工作:

  • Batch discard:根据需要手动执行 fstrim 命令 fstrim /mountoint
  • Scheduled batch discard: 使用 fstrim.timer 计划任务粗发执行 fstrim 命令,每周对所有的挂载点执行,需要启动定时计划 systemctl enable --now fstrim.timer
  • Online discard: mount 挂载文件系统时定义的 discard 属性,文件系统在线实时自动运行回收
    • mount -o discard /dev/device /mountpoint
    • fstab 中的配置 dev/device /mountpoint xfs defaults,discard 0 0

第二种的方式, /usr/sbin/fstrim -av 用于同时对所有已挂载文件系统执行空间回收的 fstrim 命令。

代码语言:javascript
复制
┌──[root@liruilongs.github.io]-[/var/lib/libvirt/images]
└─$systemctl   enable   --now    fstrim.timer
Created symlink /etc/systemd/system/timers.target.wants/fstrim.timer → /usr/lib/systemd/system/fstrim.timer.
┌──[root@liruilongs.github.io]-[/var/lib/libvirt/images]
└─$systemctl cat fstrim.timer
# /usr/lib/systemd/system/fstrim.timer
[Unit]
Description=Discard unused blocks once a week
Documentation=man:fstrim

[Timer]
OnCalendar=weekly
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target
┌──[root@liruilongs.github.io]-[/var/lib/libvirt/images]
└─$systemctl cat fstrim.service
# /usr/lib/systemd/system/fstrim.service
[Unit]
Description=Discard unused blocks

[Service]
Type=oneshot
ExecStart=/usr/sbin/fstrim -av
┌──[root@liruilongs.github.io]-[/var/lib/libvirt/images]
└─$

红帽建议使用计划任务每周执行回收,或者根据需要手动执行回收操作。

文件系统格式化选项

XFS

inode size: 如果你需要使用 XFS 的扩展属性,则推荐将默认的 256 字节的 inode 大小修改为 512 字节

代码语言:javascript
复制
mkfs.xfs   -i  size=512   /dev/mydevice

block size: block size 默认值为 4096 字节,增加该值可以降低 I/O 次数,提升性能

代码语言:javascript
复制
mkfs.xfs -n size=8192 /dev/mydevice

RAID Alignment

d 选项,用于指定文件系统的数据块大小和数据块的条带宽度

代码语言:javascript
复制
mkfs.xfs -d su=512k,sw=2 /dev/myraid

ext4

inode size: 如果是小文件应用案例,并且不需要使用扩展属性,则可以降低inode size值,修改默认的256字节

代码语言:javascript
复制

mkfs.ext4  -I  128   /dev/mydevice           //大写字母i

extra_isize

开启扩展 metadata,默认是开启的,如果inode size小于256字节,无需扩展,使用下面的命令可以禁用该功能

代码语言:javascript
复制
mkfs.ext4  -O  ^extra_size   /dev/mydeivce

large_dir

开启该选项可以提升每个目录下的文件个数,该选项默认未开启

代码语言:javascript
复制
mkfs.ext4  -O  large_dir    /dev/mydevice

huge_file

支持大于2TB的文件,默认该属性是开启的,对于小文件的应用场景,可以通过下面的命令禁用该功能

代码语言:javascript
复制
mkfs.ext4  -O  ^huge_file     /dev/mydevice

RAID Alignment

代码语言:javascript
复制
mkfs.ext4  -E  stride=128,stripe-width=256   /dev/mydevice

文件系统挂载属性

通用挂载属性

  • atime:授权内核更新文件访问时间
  • relatime:如果文件或目录被修改,则更新文件的访问时间,否则,系统每天更新一次访问时间,而不是实时更新,默认该选项在XFS和ext4文件系统上是启用的。
  • noatime:不更新文件访问时间
  • nodiratime:不更新目录的访问时间

XFS 挂载选项

默认RHEL中已经预定义了一些挂载参数,但是还有一些参数需要根据具体的应用场景决定是否开启。

  • inode64: 将inodes放在离数据近的地方,以减少磁盘寻道时间。
  • logbsize=32K:log buffer size,默认值为32KB,可以修改为64K,128K,256K,logbsize=64K

ext4 挂载选项:

i_version:开启64位inode支持功能,对于扩展元数据属性很有用,默认该属性是禁用的。journal_ioprio=: 定义journal(日志) I/O的优先级,范围0-7,0的优先级最高

管理文件系统日志

有日志的文件系统,可以加速数据恢复的效率。任何时候文件系统发生数据变化时,就会记录日志,当完成I/O操作后,再将日志记录删除。

因此,当计算机突然断电,需要进行数据恢复时,我们仅需要检查日志(必要时可以使用日志对数据进行恢复)和受日志影响的那部分文件系统,而不需要检查整个文件系统。

XFS文件系统提供了一个norecovery 挂载选项,当使用此选项挂载文件系统时,日志会被禁用,挂载XFS文件系统时禁用自动恢复(recovery)过程。如果文件系统的数据不干净(not cleanly),会出现数据一致性问题,有些文件或目录可能无法访问。使用norecovery选项挂载文件系统仅可以以只读方式挂载。

代码语言:javascript
复制
mount -o norecovery,ro /dev/<device> <mountpoint>

Ext3/Ext4文件系统的日志,可以分为三种工作模式,可以在mount挂载时,使用data=模式选项进行定义。文件在ext4文件系统中分两部分存储:metadatadatametadatadata的日志是分开管理的。

默认模式为 ordered

  • ordered:在这种模式下,只记录元数据的日志,而不记录数据的日志。当进行文件系统操作时,文件系统会先将需要修改的数据写入磁盘,然后再写入相应的元数据的日志。这样可以确保在写入元数据的日志之前,对应的数据已经持久化到磁盘上。这种模式提供了较好的数据一致性和良好的性能。
  • writeback:在这种模式下,只记录元数据的日志,而不记录数据的日志。与ordered模式不同,文件系统在进行文件系统操作时,会先将修改的数据写入内存缓存(而不是直接写入磁盘),然后再写入相应的元数据的日志。这种模式具有较高的性能,因为数据写入到内存缓存速度更快,但它也带来了较低的数据一致性,因为数据可能尚未刷新到磁盘上。
  • journal:在这种模式下,会提供完整的数据和元数据的日志记录。所有新的数据首先会被写入日志,然后再写入其最终位置。这种模式下的数据一致性最好,因为在发生崩溃或系统故障时,可以回放日志以恢复数据和元数据的一致性。然而,相对于前两种模式,journal模式的性能较差,因为每个写操作都需要先写入日志

日志和数据分离

默认XFS和ext4文件系统被创建时,日志会被放置在与文件系统相关的设备上,当出现大量随机写操作时,磁盘的IO压力比较大,我们可以通过将日志与数据分离的方式,来降低磁盘的IO压力,提高数据读写性能。

格式化挂载时分离

创建XFS文件系统时,可以使用logdev选项指定日志设备:

使用-l(小写L)指定日志选项,通过logdev设置日志磁盘为sdd1, sdc1为主文件系统磁盘

代码语言:javascript
复制
mkfs -t  xfs  -l  logdev=/dev/sdd1   /dev/sdc1

在mount挂载时,也必须指定日志磁盘的位置:

代码语言:javascript
复制
mount  -o  logdev=/dev/sdd1   /dev/sdc1  /mnt

Ext4文件系统指定独立日志磁盘的方式:

和XFS不一样,ext4文件系统不能在mount挂载的时候指定独立的日志设备

创建日志磁盘,block size为4KiB

代码语言:javascript
复制
mkfs  -t  ext4  -O  journal_dev   -b  4096   /dev/sdd1   

创建主文件系统sdc1,并指定日志设备为sdd1

代码语言:javascript
复制
mkfs  -t  ext4  -J  device=/dev/sdd1   -b  4096   /dev/sdc1   

注意:

ext4扩展日志文件系统要求,日志文件系统的 block 大小必须与主文件系统的block大小一致!最佳实践是推荐在做主文件系统时同时创建日志文件系统。

已存在日志的ext4系统做日志数据分离

假设sdc1是4G数据盘,sdd1是128M日志设备

将一个已经存在的ext4系统中的日志转换为独立的日志设备,首先需要查看现有文件系统的block大小:

tune2fs 是一个用于调整和修改 Ext2、Ext3 和 Ext4 文件系统参数的命令行工具。通过使用 tune2fs,您可以更改文件系统的各种属性和选项,以满足特定的需求。

代码语言:javascript
复制
┌──[root@liruilongs.github.io]-[/var/lib/libvirt/images]
└─$tune2fs -l /dev/sdc1

… …
Block size:               4096
… …

创建相同大小的日志文件系统,在 /dev/sdd1 上创建一个 Ext4 文件系统,并启用日志功能

代码语言:javascript
复制
[root@serverX ~]# mkfs  -t  ext4  -O journal_dev   /dev/sdd1

卸载文件系统:这将卸载 /dev/sdc1 文件系统,以便进行后续的文件系统调整。

代码语言:javascript
复制
[root@serverX ~]# umount   /dev/sdc1

修改文件系统特性:从 /dev/sdc1 文件系统中移除现有的日志特性,以便为其添加新的日志设备。

代码语言:javascript
复制
[root@serverX ~]# tune2fs  -O  '^has_journal'   /dev/sdc1          

添加日志设备:为 /dev/sdc1 文件系统添加一个日志设备,并使用 /dev/sdd1 作为日志设备。

代码语言:javascript
复制
[root@serverX ~]# tune2fs  -j  -J  device=/dev/sdd1   /dev/sdc1
#-j 添加日志设备,-J 指定日志设备的参数

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知 :)


《 Red Hat Performance Tuning 442 》


© 2018-2024 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 山河已无恙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • fstrim 空间回收
  • 文件系统格式化选项
    • XFS
      • ext4
      • 文件系统挂载属性
      • 管理文件系统日志
        • 日志和数据分离
          • 格式化挂载时分离
          • 已存在日志的ext4系统做日志数据分离
      • 博文部分内容参考
      相关产品与服务
      云服务器
      云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档