强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Btrfs 文件系统运维完全教程 / 第 12 章:性能调优

第 12 章:性能调优

12.1 Btrfs 性能特征

12.1.1 Btrfs 性能优势

特性 说明
COW 写入 避免原地覆盖的竞态条件
透明压缩 减少磁盘 I/O,提升有效吞吐
SSD 优化 异步 TRIM、SSD 调度优化
多线程 后台工作线程(cleaner、scrub、balance)
空间缓存 快速查找空闲空间

12.1.2 Btrfs 性能劣势

特性 说明 影响
COW 碎片 随机写增加碎片化 HDD 影响大,SSD 影响小
元数据开销 校验和、引用计数 小文件场景影响大
写放大 每次修改写入新位置 空间和性能开销
碎片整理 需要定期维护 额外 I/O

12.1.3 基准测试工具

# 安装测试工具
sudo apt install fio bonnie++ sysbench

# fio 随机读测试
fio --name=randread --ioengine=libaio --rw=randread \
    --bs=4k --numjobs=4 --size=1G --runtime=30 \
    --directory=/data/fio-test --direct=1

# fio 顺序写测试
fio --name=seqwrite --ioengine=libaio --rw=write \
    --bs=128k --numjobs=1 --size=1G --runtime=30 \
    --directory=/data/fio-test --direct=1

# dd 简单顺序写测试
dd if=/dev/zero of=/data/testfile bs=1M count=1024 conv=fdatasync

# bonnie++ 全面测试
bonnie++ -d /data/bonnie-test -s 4G -n 100 -u root

12.2 挂载选项优化

12.2.1 常用优化选项

选项 说明 推荐
noatime 不更新文件访问时间 ✅ 所有场景
nodiratime 不更新目录访问时间 ✅ 所有场景
compress=zstd:3 zstd 压缩 ✅ 通用
compress=zstd:1 zstd 快速压缩 SSD 实时场景
ssd SSD 优化模式 ✅ SSD
discard=async 异步 TRIM ✅ SSD(内核 5.10+)
space_cache=v2 v2 空间缓存 ✅ 内核 5.10+
commit=60 提交间隔(秒) 数据不敏感时
autodefrag 自动碎片整理 HDD 桌面
thread_pool=N 线程池大小 多设备时增大
max_inline=2048 内联数据大小限制 小文件多时
metadata_ratio=N 元数据块组比例 大文件系统

12.2.2 场景化推荐配置

桌面系统(SSD)

mount -o \
  compress=zstd:1,\
  noatime,\
  ssd,\
  discard=async,\
  space_cache=v2,\
  commit=120 \
  /dev/sda2 /

数据库服务器(SSD)

# 数据库目录关闭 COW
chattr +C /var/lib/mysql
mount -o \
  noatime,\
  nodiratime,\
  ssd,\
  discard=async,\
  space_cache=v2,\
  commit=60 \
  /dev/sdb1 /var/lib/mysql

文件服务器(HDD RAID 1)

mount -o \
  compress=zstd:3,\
  noatime,\
  space_cache=v2,\
  commit=30,\
  autodefrag \
  /dev/sdb1 /data

归档存储(HDD)

mount -o \
  compress=zstd:9,\
  noatime,\
  space_cache=v2 \
  /dev/sdb1 /archive

12.2.3 commit 参数详解

# commit=N 表示每隔 N 秒同步一次数据到磁盘
# 默认值:30 秒

# 减少 commit 频率(降低写入,增加断电风险)
mount -o commit=120 /dev/sdb1 /data

# 增加 commit 频率(更安全,但写入更多)
mount -o commit=10 /dev/sdb1 /data
commit 值 安全性 写入性能 适用场景
10 较低 关键数据
30(默认) 通用
60-120 较低 较高 非关键数据
300+ 临时数据

12.3 SSD 优化

12.3.1 SSD 特有优化

# 1. 启用 SSD 模式
mount -o ssd /dev/nvme0n1p1 /data

# 2. 启用异步 TRIM(推荐,内核 5.10+)
mount -o discard=async /dev/nvme0n1p1 /data

# 3. 或者定期执行 fstrim(推荐每周一次)
sudo fstrim -v /data
# /data: 50.00 GiB (53687091200 bytes) trimmed

12.3.2 SSD vs HDD 挂载选项对比

选项 SSD HDD 说明
ssd SSD 擦除优化
ssd_spread ✅(可选) 数据尽量连续
discard=async 异步 TRIM
autodefrag SSD 无需碎片整理
compress=zstd:1 低 CPU 开销
compress=zstd:5+ 减少磁盘 I/O
noatime 减少写入

12.3.3 SSD 写入优化

# 1. 减少不必要的元数据更新
mount -o noatime,nodiratime /dev/nvme0n1p1 /data

# 2. 增大 commit 间隔(减少同步写入)
mount -o commit=120 /dev/nvme0n1p1 /data

# 3. 对数据库目录关闭 COW
chattr +C /var/lib/postgresql/data

# 4. 禁用内联数据(大文件场景)
mount -o max_inline=0 /dev/nvme0n1p1 /data

12.3.4 NVMe 优化

# NVMe 设备专用优化
echo none > /sys/class/nvme/nvme0n1/queue/scheduler  # 无调度器
echo 256 > /sys/class/nvme/nvme0n1/queue/nr_requests  # 增大请求队列

# 挂载选项
mount -o \
  ssd,\
  discard=async,\
  noatime,\
  compress=zstd:1,\
  space_cache=v2 \
  /dev/nvme0n1p1 /data

12.4 I/O 调度器

12.4.1 调度器选择

设备 推荐调度器 原因
NVMe none / mq-deadline NVMe 自身有优化
SATA SSD mq-deadline 低延迟
HDD bfq / cfq 公平调度
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# [mq-deadline] kyber bfq none

# 临时修改
echo mq-deadline > /sys/block/sda/queue/scheduler

# 永久修改(GRUB)
# 编辑 /etc/default/grub
# GRUB_CMDLINE_LINUX="elevator=mq-deadline"
# sudo update-grub

# 或者使用 udev 规则
cat << EOF | sudo tee /etc/udev/rules.d/60-ioscheduler.rules
# SSD 使用 mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# HDD 使用 bfq
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
EOF

sudo udevadm control --reload-rules

12.4.2 调度器参数调优

# mq-deadline 参数
echo 150 > /sys/block/sda/queue/iosched/read_expire   # 读超时(ms)
echo 1500 > /sys/block/sda/queue/iosched/write_expire  # 写超时(ms)
echo 8 > /sys/block/sda/queue/iosched/writes_starved   # 读优先级

# bfq 参数
echo 120 > /sys/block/sda/queue/iosched/low_latency    # 启用低延迟

12.5 线程池与并发

12.5.1 线程池配置

# 默认线程池大小取决于 CPU 核心数
# 可以通过挂载选项调整
mount -o thread_pool=32 /dev/sdb1 /data

# 多设备文件系统建议增大线程池
mount -o thread_pool=64 /dev/sdb1 /data

12.5.2 内核参数调优

# vm.dirty_ratio - 脏页占总内存的最大比例
echo 10 > /proc/sys/vm/dirty_ratio

# vm.dirty_background_ratio - 后台回写的脏页比例
echo 5 > /proc/sys/vm/dirty_background_ratio

# vm.dirty_expire_centisecs - 脏页过期时间(0.01秒)
echo 3000 > /proc/sys/vm/dirty_expire_centisecs

# vm.dirty_writeback_centisecs - 回写线程唤醒间隔
echo 500 > /proc/sys/vm/dirty_writeback_centisecs

12.6 压缩与性能

12.6.1 压缩对性能的影响

场景 不压缩 zstd:1 zstd:3 zstd:9
顺序写 (SSD) 基准 -5% -8% -20%
顺序读 (SSD) 基准 +0% +0% +0%
随机写 (SSD) 基准 -3% -5% -15%
顺序写 (HDD) 基准 +20% +30% +10%
顺序读 (HDD) 基准 +15% +20% +5%

💡 提示: 在 HDD 上,压缩可能提升性能,因为压缩后的数据量更小,减少了磁盘 I/O。

12.6.2 压缩算法选择

# 查看当前压缩算法和效果
sudo compsize /data

# 在线切换压缩算法
sudo mount -o remount,compress=zstd:1 /data

12.7 碎片管理

12.7.1 碎片检测

# 查看文件碎片
filefrag /data/largefile
# /data/largefile: 150 extents found

# 查看整个文件系统碎片
sudo btrfs filesystem df /data

12.7.2 碎片整理

# 递归碎片整理
sudo btrfs filesystem defragment -r /data

# 整理并重新压缩
sudo btrfs filesystem defragment -r -czstd /data

# 只整理大于 32MB 的文件
sudo btrfs filesystem defragment -r -t 32M /data

12.8 性能监控

12.8.1 实时监控工具

# iostat - 设备级 I/O 统计
iostat -x 1

# iotop - 进程级 I/O 统计
sudo iotop -o

# btrfs-stats.sh - Btrfs 专用监控
#!/bin/bash
while true; do
    echo "=== $(date) ==="
    sudo btrfs filesystem df /data
    sudo btrfs device stats /data
    sleep 60
done

12.8.2 性能指标

指标 正常范围 关注阈值
读延迟 (SSD) < 0.1ms > 1ms
写延迟 (SSD) < 0.5ms > 5ms
读延迟 (HDD) < 10ms > 50ms
写延迟 (HDD) < 15ms > 100ms
磁盘利用率 < 70% > 90%
IOPS (NVMe) 100K+ < 10K

12.9 本章小结

优化项 建议
访问时间 始终使用 noatime
SSD ssd + discard=async
压缩 SSD 用 zstd:1,HDD 用 zstd:3
空间缓存 使用 space_cache=v2
数据库 关闭 COW (chattr +C)
调度器 SSD 用 mq-deadline,HDD 用 bfq

扩展阅读