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 |
扩展阅读