精读笔记(RHCA 英文教材)· RH442 Chapter 10 Tuning File System Utilization
精读笔记(RHCA 英文教材)· RH442 Chapter 10 Tuning File System Utilization
教材原文:RHCA 官方英文教材(PDF 第 374~397 页)(OCR 整书版已从本站移除,本页为章节精读) 关联中文笔记:
02-09-性能调优RH442(RHCA).md无文件系统专节;本章=文件系统选型(XFS vs ext4)与格式/挂载调优、SSD discard、外部日志(external journaling)。 结构:2 个 Section(10.1 管理文件系统属性+GE fs-attributes;10.2 管理文件系统日志+GE fs-journal)+ Lab(lab: fs-review)。
Chapter Goal / Objectives(原文+译)
- GOAL: Manage application efficiency for file system utilization.(管理应用的文件系统使用效率。)
- OBJECTIVES: ① 描述文件系统选择与可调属性;② 配置文件系统日志并讨论适用场景。
10.1 Managing File System Attributes(管理文件系统属性)
- 两种本地文件系统:RHEL7 起 XFS 为默认(RHEL8 延续),ext4 仍是可用选项。选型不能只凭经验,要针对本机真实负载做文件系统层基准测试。
- XFS(SGI 原创):健壮、可扩展、高性能;RHEL8 的 boot/root/用户数据分区默认 XFS。最大文件系统与文件尺寸支持到 1 PB(对比 ext4 的 50 TB 存储设备上限),面向多 CPU/多核大系统多数负载优于 ext4。分配特性:extent(区段)分配、条带感知分配、延迟分配(delayed allocation)、空间预分配、动态 inode 分配。与多数文件系统不同,XFS 开机不做完整性检查(靠日志)。支持在线 defrag(碎片整理)与在线扩容,但不能缩容(离线也不行)。
- ext4(ext3 的可扩展延伸):extent 分配;提供持久预分配、延迟分配、多块分配、条带感知分配。上限:文件系统 50 TB、单文件 16 TB。单线程+单盘+同步更新与小文件负载可能比 XFS 更快。支持在线扩容;与 XFS 不同,ext4 卸载后可缩容。
- 选型速查(教材表格要点):
- 无特殊需求 / 大型服务器 / 大存储设备 / 大文件 / 多线程 I/O → XFS。
- 小文件 / 单线程 I/O / 受限 I/O 能力(<1000 IOPS)/ 受限带宽(<200 MB/s)/ CPU-bound 负载 / 需离线缩容 → ext4。
- SSD 与 discard:ext4/XFS 都支持 TRIM(discard)。三种方式:
- 批处理 discard:用户按需执行
fstrim /mymountpoint。 - 定时批处理:
systemctl enable --now fstrim.timer,每周对所有底层支持 TRIM 的挂载点自动 fstrim。 - 在线 discard:挂载时
mount -o discard …(/etc/fstab 加discard选项),实时执行。 - ⚠️ discard 执行期间设备整体性能受影响,且增加 SSD 磨损;Red Hat 建议负载/维护允许时优先每周定时批处理或按需批处理,而非在线 discard。
- 批处理 discard:用户按需执行
- XFS 格式化选项(创建期是唯一可调时机的选项):
- inode size:默认 256 字节;重度使用扩展属性(xattr)时建议 512:
mkfs.xfs -i size=512 /dev/mydevice。 - 目录逻辑块大小:默认 4096 字节;提到 8192 减少目录 I/O、改善目录操作性能:
mkfs.xfs -n size=8192 /dev/mydevice。 - RAID 对齐:
mkfs.xfs -d su=512k,sw=2 /dev/myraid(2 数据盘 RAID0、chunk 512K 示例;硬件 RAID 常需手动指定)。
- inode size:默认 256 字节;重度使用扩展属性(xattr)时建议 512:
- ext4 格式化选项:
- inode size:默认 256;小文件为主且不用 xattr 时可降到 128 省空间:
mkfs.ext4 -I 128 /dev/mydevice。 - extra_isize(默认开):每个 inode 预留扩展元数据空间;inode 降到 <256 后该特性无意义,应关闭:
mkfs.ext4 -O ^extra_isize /dev/mydevice(OCR 版写作 ^extra_size,实为 extra_isize)。 - large_dir(默认关):提高单目录文件数上限:
mkfs.ext4 -O large_dir /dev/mydevice。 - huge_file(默认开):允许单文件超 2 TB;小文件负载应关闭:
mkfs.ext4 -O ^huge_file /dev/mydevice。 - RAID 对齐:
mkfs.ext4 -E stride=128,stripe-width=256 /dev/mydevice(512K chunk÷4K 块→stride 128;2 数据盘→stripe-width 256)。
- inode size:默认 256;小文件为主且不用 xattr 时可降到 128 省空间:
- 通用挂载选项(atime 族):
atime:交给内核默认行为。relatime:文件被修改/变更才更新访问时间,否则每天最多更新一次(XFS/ext4 默认开启)。noatime:完全不在该文件系统更新 inode 访问时间(文件+目录)。nodiratime:只对目录不更新访问时间。
- XFS 挂载选项(RHEL8 预置项已优化,以下按需增补):
inode64:inode 尽量靠近数据、减少寻道;RHEL8 默认已启用。logbsize:日志缓冲区大小,越大写日志所需 I/O 次数越少;适合 I/O 密集且没有非易失写缓存的负载。默认 32 KB,可选 64/128 KB,最大 256 KB。
- ext4 挂载选项:
i_version:启用 64 位 inode version,适合重度 xattr;默认关。journal_ioprio:日志 I/O 优先级 0~7(0 最高),默认 3(略高于普通 I/O)。
- 基准测试方法:dd/hdparm/bonnie++ 只适合描存储设备吞吐,与真实负载相关性低;应在文件系统层用模拟真实工作负载的例行测试(文件服务器=大文件上传下载;数据库=导库、并发查询、复杂 join 大查询),设计良好的基准才可测、相关、有意义,比较差距再决定选型。
10.1 GE(lab: fs-attributes)
servera(预置 RAID0 md0=vdb+vdc、chunk 512K):需求=处理大视频文件、允许多线程 I/O、inode 加大支持 xattr、目录访问时间不记日志。步骤: ① mkfs.xfs -f -d su=512k,sw=2 -b size=4096 -n size=8192 -i size=512 /dev/mdo(块 4096、目录逻辑块 8192、inode 512);② mkdir /xfsraid、mount /dev/mdo /xfsraid、umount;③ /etc/fstab 加 /dev/mdo /xfsraid xfs nodiratime 0 0,mount /dev/mdo 持久挂载;④ findmnt --target /xfsraid 验证(OPTIONS 含 rw,nodiratime,relatime,attr2,inode64,sunit=1024,swidth=2048(扇区单位,即 su=512K、sw=2)、noquota)→ lab fs-attributes finish。
10.2 Managing File System Journaling(管理文件系统日志)
- 日志用途:每次改动前先把事务记入日志(journal,相当于文件系统账本),操作完成后删除条目。断电后恢复只需检查/重放日志及其影响区,不必扫全盘——文件系统越大价值越高。
- XFS 的 norecovery:挂载指定
norecovery会禁用日志恢复;若文件系统上次非干净卸载,可能不一致、部分文件/目录不可访问,故 norecovery 只允许只读挂载。 - ext4 三种日志模式(挂载
data=选择,默认 ordered):- ordered:只记元数据;所有文件数据落盘后才提交日志条目。
- writeback:只记元数据、不保证数据顺序;号称最快、文件系统内部完整性仍保证,但崩溃恢复后文件里可能出现旧数据。
- journal:数据先全部写日志再落盘;可靠性最好,多数负载性能最差;大量小写负载反而可能变快(磁盘电梯有机会合并写入)。
- 写屏障(barriers):对带板载写缓存的设备强制写顺序;开启后数据与日志条目的提交顺序有保证,崩溃后文件系统可恢复。XFS 与 ext4 默认都开。XFS 自内核 4.10 起 nobarrier 已废弃——屏障始终开启、不可关闭。ext4 可用
barrier/nobarrier(或旧式 barrier=1/0)开关;设备带电池后备缓存时 ext4 可关屏障提性能且仍保证数据完整性。 - 外部日志(external journal):默认日志与数据同盘,大量随机写负载下写操作与日志更新互相争抢磁盘;机械盘架构下把日志放独立设备可减少寻道、提升主盘性能。
- XFS:创建
mkfs.xfs -l logdev=/dev/vdd1 /dev/vdc1(vdc1=数据、vdd1=日志);挂载时还要再指定:mount -o logdev=/dev/vdd1 /dev/vdc1 /mnt。 - ext4:⚠️ 外部日志设备必须与主文件系统同块大小,建两边都显式指定块大小。先建日志设备:
mkfs.ext4 -O journal_dev -b 4096 /dev/vdd1;再建主 FS 指日志:mkfs.ext4 -J device=/dev/vdd1 -b 4096 /dev/vdc1;挂载不用再指日志设备。 - ext4 内转外:
tune2fs -l查块大小 → 同块大小建日志设备 → 先干净卸载(或先 fsck 保证旧日志为空)→tune2fs -O ^has_journal /dev/vdc1摘除旧日志 →tune2fs -j -J device=/dev/vdd1 /dev/vdc1挂外部日志。
- XFS:创建
10.2 GE(lab: fs-journal)
servera:vdb 建 5 GiB 主分区(ext4 数据)、vdc 建 1 GiB 分区(外部日志)——parted mklabel gpt+parted --align=optimal mkpart primary ext4 0% 100%(vdc 到 1GiB)+partx -uv+lsblk 确认 → mkfs.ext4 -O journal_dev -b 4096 /dev/vdc1 建日志设备 → mkfs.ext4 -J device=/dev/vdc1 -b 4096 /dev/vdb1 建主 FS → tune2fs -l /dev/vdb1 看 Journal UUID/device,与 lsblk -f /dev/vdc1(fstype=jbd2、同 UUID)比对 → 挂 /journal(临时 -o data=journal,持久 fstab 加 data=journal)→ findmnt --target /journal 验证(含 nodelalloc,data=journal)→ lab fs-journal finish。
Lab 概要(lab: fs-review)
serverb:① XFS 大文件场景(/bigfiles):vdb 5 GiB 分区作数据、vdc 1 GiB 分区作外部日志;mkfs.xfs -i size=512 -b size=4096 -l logdev=/dev/vdc1 /dev/vdb1;fstab:relatime,logdev=/dev/vdc1(要“访问时间按修改/变更时间记”→relatime);② ext4 小文件场景(/smallfiles):vdd 5 GiB 分区;小文本文件+单线程 I/O→inode 降到 128、启用 large_dir、禁用 huge_file/extra_isize:mkfs.ext4 -I 128 -b 4096 -O large_dir,^huge_file,^extra_isize /dev/vdd1;fstab 加 noatime(目录/文件访问时间都不记);两处都 findmnt 验证后退出 → lab fs-review grade、lab fs-review finish。
命令速查表
| 用途 | 命令 | | XFS 格式化 | mkfs.xfs -d su=512k,sw=2 -b size=4096 -n size=8192 -i size=512 <dev>(对齐/块/目录块/inode) | | XFS 外部日志 | 建:mkfs.xfs -l logdev=/dev/vdd1 /dev/vdc1;挂载:mount -o logdev=/dev/vdd1 /dev/vdc1 /mnt | | XFS norecovery | mount -o norecovery …(只读,禁日志恢复) | | ext4 格式化 | mkfs.ext4 -I 128 -b 4096 -O large_dir,^huge_file,^extra_isize <dev>;对齐 -E stride=128,stripe-width=256 | | ext4 外部日志 | 日志设备:mkfs.ext4 -O journal_dev -b 4096 <dev>;主 FS:mkfs.ext4 -J device=<dev> -b 4096 <dev> | | ext4 内转外 | tune2fs -l 查块大小 → umount/fsck → tune2fs -O ^has_journal → tune2fs -j -J device=<dev> | | 挂载选项 | mount -o noatime\|nodiratime\|relatime\|data=ordered\|writeback\|journal\|barrier\|nobarrier;fstab 持久化 | | XFS 专项挂载 | inode64(默认开)、logbsize=256k;ext4:i_version、journal_ioprio=3 | | SSD discard | fstrim /mymountpoint;systemctl enable --now fstrim.timer;mount -o discard / fstab discard | | 验证挂载 | findmnt --target /xfsraid;tune2fs -l <dev>(Block size/Journal UUID);lsblk -f | | 实验/评分 | lab fs-attributes\|fs-journal\|fs-review start;lab fs-review grade;… finish |
词汇表
| 英文 | 中文 | 速记 |
|---|---|---|
| XFS / ext4 | 本地文件系统 | XFS 默认;ext4 小文件/单线程/可缩容 |
| extent-based allocation | 区段分配 | 大块连续映射 |
| delayed allocation | 延迟分配 | 攒够再落盘、减少碎片 |
| stripe-aware / su / sw | 条带感知/单元/宽度 | 格式时对齐 RAID |
| inode / xattr | 索引节点/扩展属性 | 512 inode 配 xattr |
| directory logical block | 目录逻辑块 | -n size=8192 减目录 I/O |
| large_dir / huge_file / extra_isize | ext4 特性 | 按场景开/关 |
| TRIM / discard | 固态回收命令 | fstrim 批处理/定时/在线 |
| fstrim.timer | 每周 discard 定时器 | Red Hat 推荐优先 |
| atime / relatime / noatime / nodiratime | 访问时间策略 | 默认 relatime |
| logbsize / inode64 | XFS 挂载项 | 日志缓冲/就近 inode |
| i_version / journal_ioprio | ext4 挂载项 | xattr 用/日志 I/O 优先级 |
| journal / journaling | 日志/日志记录 | 事务账本加速恢复 |
| ordered / writeback / journal | ext4 三种日志模式 | 默认 ordered |
| barrier / nobarrier | 写屏障 | XFS 4.10+ 恒开 |
| external journal / logdev / journal_dev | 外部日志 | 独立设备减寻道 |
| tune2fs | ext4 调优工具 | -l 查、-O 开关特性、-j 建日志 |
自测 10 题
- RHEL 默认文件系统?何时选 ext4?(XFS;小文件/单线程 I/O/受限 IOPS 带宽/CPU-bound/需离线缩容)
- XFS 与 ext4 上限差异?(XFS 最大 1 PB;ext4 FS 50 TB、文件 16 TB)
- XFS 能缩容吗?(不能,在线离线都不行;ext4 卸载后可缩)
- xattr 重度负载的 XFS 格式化要点?(inode 512:mkfs.xfs -i size=512;目录逻辑块 8192:-n size=8192)
- discard 三种方式与推荐?(fstrim 批处理/fstrim.timer 每周/在线 discard;优先批处理与每周定时)
- ext4 小文件负载格式化建议?(-I 128;开 large_dir;关 huge_file、extra_isize)
- ext4 三种日志模式及默认?(ordered 默认/writeback 最快不保序/journal 最可靠;小写负载 journal 可能更快)
- XFS 的 nobarrier 何时失效?(内核 4.10 起废弃,屏障恒开)
- 外部日志解决什么问题?(随机写负载下数据与日志同盘争抢;独立设备减寻道)
- XFS 与 ext4 外部日志的挂载差异?(XFS 挂载须再指 logdev;ext4 挂载不用指)
