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