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

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:3zstd 压缩✅ 通用
compress=zstd:1zstd 快速压缩SSD 实时场景
ssdSSD 优化模式✅ SSD
discard=async异步 TRIM✅ SSD(内核 5.10+)
space_cache=v2v2 空间缓存✅ 内核 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 挂载选项对比

选项SSDHDD说明
ssdSSD 擦除优化
ssd_spread✅(可选)数据尽量连续
discard=async异步 TRIM
autodefragSSD 无需碎片整理
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 调度器选择

设备推荐调度器原因
NVMenone / mq-deadlineNVMe 自身有优化
SATA SSDmq-deadline低延迟
HDDbfq / 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:1zstd:3zstd: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
SSDssd + discard=async
压缩SSD 用 zstd:1,HDD 用 zstd:3
空间缓存使用 space_cache=v2
数据库关闭 COW (chattr +C)
调度器SSD 用 mq-deadline,HDD 用 bfq

扩展阅读