暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

BTRFS能否用于数据库OLTP场景?

先说结论:对于OLTP高频事务处理的场景,也就是我们最常使用的关系型数据库,应优先选择 Ext4/XFS;BTRFS在这方面表现不佳。

下面我们详细介绍BTRFS的特性,及在OLTP场景下的测试表现。

BTRFS核心优势

1.数据完整性保障
BTRFS 支持 CRC32C 校验和,可检测和修复静默数据损坏,避免因硬件错误或位翻转导致的数据不一致。写入时复制(CoW) 机制在修改数据时保留原始副本,提升崩溃恢复能力,减少事务中断风险。

2.快照与备份功能
支持可写/只读快照,便于实现数据库的实时备份与快速恢复,适用于需要频繁备份的场景(如开发测试环境)。

3.动态资源管理
动态inode分配 避免传统文件系统因 inode 耗尽导致的问题,适合存储大量小文件(如日志数据库)。

4.压缩与存储优化
内置文件系统级压缩(如 LZO、Zstd),可减少存储占用并提升 I/O 效率,对读密集型数据库(如数据仓库)有显著增益。

我们既然知道了BTRFS在这些场景下的优势,那么在OLTP场景下表现如何呢?我们利用sysbench进行如下基准测试。

I/O基准测试

我们对BTRFS、Ext4、XFS三种文件系统,在相同硬件环境下进行I/O基准测试。
为了快速得到一个模糊的答案,测试设计得较为简单,但也能以小见大。

几次测试相同的变量如下:

变量
文件数量 128
文件总大小 100G
运行时间 300s

测试结果如下:

测试1:顺序写

fs类型 write(mb/s) write IOPS fsync IOPS 平均耗时(ms) 95%耗时(ms)
ext4 1363.68 83232.33 106537.58 0.01 0.01
xfs 1443.58 88109.27 112780.2 0 0.01
btrfs 892.21 54456.34 69704.34 0.01 0.01

测试2:顺序读

fs类型 read(mb/s) read IOPS 平均耗时(ms) 95%耗时(ms)
ext4 7108.09 433843.56 0 0
xfs 7007.14 427681.91 0 0
btrfs 6713.93 409786.06 0 0

测试3:随机写

fs类型 write(mb/s) write IOPS fsync IOPS 平均耗时(ms) 95%耗时(ms)
ext4 214.81 13110.68 16782.01 0.03 0.08
xfs 212.82 12989.54 16626.88 0.03 0.09
btrfs 56.49 3448.17 4413.99 0.13 0.39

测试4:随机读

fs类型 read(mb/s) read IOPS 平均耗时(ms) 95%耗时(ms)
ext4 5590.98 341246.44 0 0
xfs 5767.35 352011.24 0 0
btrfs 2721.05 166079.95 0.01 0.01

测试5:混合随机读写3:1

fs类型 read(mb/s) read IOPS write(mb/s) write IOPS fsync IOPS 平均耗时(ms) 95%耗时(ms)
ext4 484.99 29601.62 161.66 9867.21 50520.13 0.01 0.05
xfs 279.05 17031.62 186.03 11354.41 36334.19 0.02 0.04
btrfs 53.73 3279.52 35.82 2186.34 6996.7 0.08 0.32

从结果中可以初步看到,BTRFS在同等文件大小的情况下:
顺序读的测试表现与Ext4/XFS相差不多,结合自身FS级别的压缩,在实际应用中应该能提升效率;
但是在随机读和写方面性能较差。

OLTP基准测试

我们继续对BTRFS、Ext4、XFS三种文件系统,在相同硬件环境下进行OLTP基准测试。
测试环境是硬RAID5,相同的SSD(生产环境一般是RAID10)。
为了快速得到一个模糊的答案,测试设计得较为简单,但也能以小见大。

几次测试相同的变量如下:

变量
单表数据量 10万条
运行时间 300s

测试1:正常读写
表数量10张,线程数为4:

fs类型 qps tps 平均耗时(ms) 95%耗时(ms)
ext4 48321.47 2416.07 1.65 1.86
xfs 51788.66 2589.43 1.54 1.73
btrfs 34722.76 1736.14 2.3 3.62

表数量100张,线程数为4:

fs类型 qps tps 平均耗时(ms) 95%耗时(ms)
ext4 42541.2 2127.06 1.88 2.35
xfs 46185.59 2309.28 1.17 2.3
btrfs 22686.21 1134.31 3.52 7.17

表数量100张,线程数为8:

fs类型 qps tps 平均耗时(ms) 95%耗时(ms)
ext4 77024.47 3851.22 2.08 3.07
xfs 83204.94 4160.25 1.92 2.52
btrfs 43834.08 2191.7 3.65 5.88

测试2:读多
表数量100张,线程数为8:

fs类型 qps tps 平均耗时(ms) 95%耗时(ms)
ext4 95817.46 5988.59 1.33 1.58
xfs 95150.18 5946.89 1.34 1.64
btrfs 92378.45 5773.65 1.38 1.73

测试3:写多
表数量100张,线程数为8:

fs类型 qps tps 平均耗时(ms) 95%耗时(ms)
ext4 49582.06 8263.68 0.97 1.67
xfs 51011.44 8501.91 0.94 1.79
btrfs 14439.01 2406.5 3.32 4.65

测试4:更新二级索引
表数量100张,线程数为8:

fs类型 qps tps 平均耗时(ms) 95%耗时(ms)
ext4 29242.12 29242.12 0.27 0.43
xfs 28508.02 28508.02 0.28 0.52
btrfs 5862.2 5862.2 1.36 2.52

从结果中可以初步看到:
1.在数据库事务处理场景下,btrfs整体性能弱于ext4和xfs。
2.随着系统复杂度提高,btrfs性能下降速度比其他快。
3.随着线程数提高,btrfs性能提高比ext4和xfs弱,且但个事务或查询的耗时更长。
4.对于随机写场景,btrfs性能劣势更大。

BTRFS的缺陷

1.随机写入性能瓶颈
在高并发随机写入场景(如数据库OLTP场景)中,BTRFS的性能显著落后于Ext4/XFS,从上面的基准测试即可看出。
根据网上的其他测试显示,其随机寻道速度仅为Ext3的1/4,且频繁的 CoW 操作可能导致碎片化,进一步降低吞吐量。

2.碎片化问题
BTRFS的CoW机制易导致大文件碎片化,需定期手动整理,否则顺序读取性能(如全表扫描)可能下降30% 以上。

3.资源消耗与复杂性
校验和计算与数据巡检 依赖 CPU 和内存资源,尤其在非 ECC 内存环境下,可能因位错误引发数据一致性问题。功能复杂性(如内置 RAID、去重)增加了运维难度,需专门配置与监控。

4.兼容性与稳定性争议
BTRFS在数据库领域的稳定性仍存争议。部分用户反馈其在高负载下易出现元数据损坏,且修复工具不如 Ext4成熟。

适用场景总结

推荐使用BTRFS的场景:

  • 读密集型分析数据库:如ClickHouse等列式存储,受益于压缩与快照功能。
  • 开发/测试环境:利用快照快速回滚,缩短迭代周期。
  • 中小型非关键业务:对数据完整性要求高但负载较低的场景。

不推荐使用BTRFS的场景:

  • 高频事务处理(OLTP):如MySQL、PostgreSQL的主库,优先选择 Ext4/XFS。
  • 高并发随机写入:如Kafka日志存储,避免碎片化导致的性能衰减。
  • 资源受限环境:缺乏ECC内存或低配硬件可能放大其缺陷。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论