前提
近期我更换了我的群晖 NAS 里的硬盘,在选择存储空间的文件系统时不知该选 ext4 还是 Btrfs,我主要考量的是磁盘的读写性能,于是就写了个脚本测试了下我的群晖 NAS 在两种文件系统下的磁盘读写速度,顺便也测试了下其在不同 RAID 类型下的磁盘读写速度。
目录
- 说明
- 一些结论
- TL;DR
- 细节对比
- 测试硬件
- 群晖 NAS
- 硬盘
- 测试使用的脚本
- 测试脚本使用的命令
- hdparm 读取测试
- dd 读写测试
- dd 读取测试
- dd 写入测试
- fio 读写测试
- 测试结果
- ext4 和 Btrfs 文件系统的对比
- BASIC 单盘
- JBOD 四盘
- RAID0 四盘
- RAID1 四盘
- RAID10 四盘
- RAID5 四盘
- SHR 四盘(相当于 RAID5 )
- RAID6 四盘
- SHR2 四盘(相当于 RAID6 )
- ext4 在不同 RAID 类型下的对比
- ext4 和 Btrfs 文件系统的对比
- 原始数据
说明
- 测试使用的命令和参数是从网上搜刮来的,可能并不完善。
- 测试并未严格控制变量,也未多次重复测试取平均值,结果可能存在误差,仅供参考。
- 本文使用的数据单位采用 SI 和 IEC 标准:
- 1000 进制的 SI 标准单位:kB (1000 字节), MB (1000^2 字节), GB (1000^3 字节) ...
- 1024 进制的 IEC 标准单位:KiB (1024 字节), MiB (1024^2 字节), GiB (1024^3 字节) ...
- 测试了 ext4 和三种选项下 Btrfs 的磁盘读写速度:
- ext4
- Btrfs
- Btrfs + 校验:启用了 文件自我修复功能(启用数据总和检查码以实现高级数据完整性)
- Btrfs + 校验 + 压缩:启用了 文件自我修复功能 + 文件压缩功能
一些结论
TL;DR
- 我最后还是选用了 ext4。
- 大部分情况下,当读写块较大时,Btrfs 的读写速度和 ext4 相差不大;但当读写块较小时,Btrfs 的速度明显劣于 ext4。
- 一些情况下,文件自我修复功能(数据总和检查码)对 Btrfs 的读写速度有影响。
- 文件压缩功能对 Btrfs 的实际读写速度无可见影响。
- RAID0 性能最佳,但提升不及预期,四盘 RAID0 性能大部分情况下达不到单盘的两倍。
- JBOD 大部分情况下性能与单盘一致,在少数小块写入测试中写入速度有明显提升。
- RAID1 在部分测试下性能略低于单盘,未见理论上的读取速度提升。
- 部分情况下,RAID10 / RAID5 / SHR / RAID6 / SHR2 的性能相比单盘有提升。
- 大部分情况下,群晖自己的 SHR / SHR2 (Synology Hybrid RAID) 与普通的 RAID5 / RAID6 相比差别不大。
细节对比
-
[ext4] vs [Btrfs] vs [Btrfs + 校验] vs [Btrfs + 校验 + 压缩]:
- hdparm 读取测试:
- 四者无显著差别。
- dd 读取测试:
- 四者差别似乎不是非常明显,在不同 RAID 类型下有些许波动。
- dd 写入测试:
- 当测试使用大读写块( 1 GiB、128 MiB )时,ext4 和 Btrfs 的写入速度无显著差别,有时 Btrfs 还会略高于 ext4。
- 当测试使用的读写块大小从 1 MiB 逐步降低时,Btrfs 的写入速度开始显著低于 ext4。最严重的情况下( RAID5 / RAID6 + 512 字节块大小),Btrfs 的写入速度只是 ext4 的九分之一( 20 kB/s vs 180 kB/s )。
- 大部分情况下,文件自我修复功能对 Btrfs 的写入速度无影响。
- Btrfs 开启文件压缩功能后,因为 dd 写入测试写入的数据都是 0,所以会导致测试出的写入速度虚高。
- fio 连续读取测试:
- 大部分情况下,Btrfs 略低于 ext4。
- 开启文件自我修复功能后,Btrfs 的读取速度会更低些。
- fio 连续写入测试:
- 大部分情况下,未开启文件自我修复功能的 Btrfs 略慢于 ext4。
- 在 RAID5 / SHR / RAID6 / SHR2 下,文件自我修复功能对 Btrfs 的写入速度基本无影响。
- 在其它 RAID 类型下,开启文件自我修复功能后,Btrfs 的写入速度明显下降,大概只有 ext4 的一半。
- fio 随机读取测试:
- 1 MiB 块大小时,四者差别不大。
- 4 KiB 块大小时:
- BASIC / JBOD / RAID1:四者差别不大。
- RAID0 / RAID10 / RAID5 / SHR / RAID 5 / SHR2:开启文件自我修复功能后,Btrfs 的随机读取速度大幅度下降,可下降到 ext4 的十分之一( SHR2 )。
- fio 随机写入测试:
- 1 MiB 块大小时:
- BASIC / JBOD / RAID1 / RAID5 / SHR / SHR2:四者差别不大。
- RAID0:特例,无校验 Btrfs 的随机写入速度是 ext4 的 140%,但在开启校验后速度下降到一半。
- RAID10:ext4 > Btrfs >> Btrfs + 校验 ≈ Btrfs + 校验 + 压缩
- RAID6:ext4 的随机写入速度是其它三者的两倍。
- 4 KiB 块大小时:
- 出于某种原因,开启了校验的 Btrfs 的随机写入速度反而是 ext4 的两倍以上。
- 1 MiB 块大小时:
- hdparm 读取测试:
-
ext4 在不同 RAID 类型下的对比:
- 大读写块连续读取测试:
- JBOD 和 RAID1 基本和 BASIC 单盘的读取速度一致。
- RAID0 确实对读取速度有明显提升,但可能受制于我的群晖的机能,提升远不及理论值,四盘 RAID0 的速度只是单盘的 1.5 倍到 2 倍。
- RAID10 / RAID5 / SHR / RAID6 / SHR2 相比单盘速度有部分提升,有的速度与 RAID0 相近。
- 小读写块连续读取测试:
- 所有 RAID 类型的速度无明显差别。
- dd 写入测试:
- RAID0 写入速度最好,块越小越明显,512 字节块大小时,其写入速度是单盘的 10 倍。
- JBOD 在块小时的写入速度也有明显提升。
- 其余 RAID 类型的写入速度相近,约为单盘速度。
- fio 连续写入测试:
- 1 MiB 块大小时:
- RAID0 >> BASIC / JBOD / RAID10 > RAID1 / RAID5 / SHR / RAID6 / SHR2
- 4 KiB 块大小时:
- BASIC / JBOD > RAID0 / RAID1 / RAID10 >> RAID5 / SHR / RAID6 / SHR2
- RAID5 / SHR / RAID6 / SHR2 只是单盘速度的近七分之一。
- 1 MiB 块大小时:
- fio 随机读取测试:
- 1 MiB 块大小时:
- RAID0 略快一些。
- 其它 RAID 类型速度相近。
- 4 KiB 块大小时:
- BASIC / JBOD / RAID1 速度相近。
- 其它 RAID 类型速度提升明显,是单盘的 10 倍左右。
- 1 MiB 块大小时:
- fio 随机写入测试:
- 1 MiB 块大小时:
- RAID0 提升明显,是单盘速度的 2.5 倍。
- RAID10 是单盘的 2 倍。
- 其它 RAID 类型差别不大。
- 4 KiB 块大小时:
- RAID0 相对于单盘略有提升。
- RAID5 / SHR / RAID6 / SHR2 速度明显下降,是单盘速度的 35% 左右。
- 1 MiB 块大小时:
- 大读写块连续读取测试:
测试硬件
群晖 NAS
我的群晖 NAS 是 2013 年款的 DS1513+,五盘位,CPU 是 Intel Atom D2700 Dual Core 2.13 GHz,内存扩充到了 4 GiB,群晖系统版本是 DSM 6.2。
硬盘
测试使用的硬盘是四个 HGST 昱科的 Deskstar NAS 充氦硬盘(HGST Deskstar NAS 3.5" 10TB 7200 RPM 256MB Cache),型号是 HDN721010ALE604,容量是 10 TB,转速是 7200 RPM,缓存是 256 MiB,网上这款硬盘的评测。
测试使用的脚本
使用方法:
- 保存
synology_disk_benchmark.sh和xfio.conf到 NAS 上。 - 授予脚本执行权限:
chmod +x synology_disk_benchmark.sh
- 运行测试:
sudo ./synology_disk_benchmark.sh 测试名
- 测试根据机能和磁盘速度的不同可能会花费数十分钟。
- 测试结束后会生成一个结果报告文件:
测试名.md。
测试脚本使用的命令
hdparm 读取测试
sudo hdparm -Tt $device
dd 读写测试
dd 读取测试
# 生成一个 1 GiB 大小的随机数据测试文件
head -c 1G </dev/urandom >test
# 清除缓存
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null
# 从 test 文件读取,每次读取 1 MiB 数据,读取 1024 次,共读取 1 GiB 数据
dd if=test of=/dev/null bs=1M count=1024
dd 写入测试
# 写入 0 到 test 文件,每次写入 x 数据,写入 y 次,共写入 x*y 数据( dsync 不缓存)
dd if=/dev/zero of=test bs=$x count=$y oflag=dsync
分别测试了 bs 读写块大小为 1 GiB、128 MiB、1 MiB、128 KiB、4 KiB、512 bytes 时的写入速度。
fio 读写测试
fio xfio.conf
fio 测试使用的配置文件:xfio.conf
进行了以下测试:
- 连续读取和写入,1 MiB 块大小
- 连续读取和写入,4 KiB 块大小
- 随机读取和写入,1 MiB 块大小
- 随机读取和写入,4 KiB 块大小
注:群晖内置了 fio 命令。
测试结果
ext4 和 Btrfs 文件系统的对比
BASIC 单盘
















JBOD 四盘
















RAID0 四盘
















RAID1 四盘
















RAID10 四盘
















RAID5 四盘
















SHR 四盘(相当于 RAID5 )
















RAID6 四盘
















SHR2 四盘(相当于 RAID6 )
















ext4 在不同 RAID 类型下的对比















