元数据引擎性能对比测试

首先展示结论:

  • 对于纯元数据操作,MySQL 耗时约为 Redis 的 2~4 倍;TiKV 性能与 MySQL 接近,大部分场景下略优于 MySQL
  • 对于小 IO(~100 KiB)压力,使用 MySQL 引擎的操作总耗时大约是使用 Redis 引擎总耗时的 1~3 倍;TiKV 耗时与 MySQL 接近
  • 对于大 IO(~4 MiB)压力,使用不同元数据引擎的总耗时未见明显差异(此时对象存储成为瓶颈)

注意

  1. Redis 可以通过将 appendfsync 配置项由 always 改为 everysec,牺牲少量可靠性来换取一定的性能提升;更多信息可参见这里
  2. 测试中 Redis 和 MySQL 数据均仅在本地存储单副本,TiKV 数据会在三个节点间通过 Raft 协议存储三副本

以下提供了测试的具体细节。这些测试都运行在相同的对象存储(用来存放数据),客户端和元数据节点上;只有元数据引擎不同。

测试环境

JuiceFS 版本

juicefs version 0.16-dev (2021-07-20 9efa870)

对象存储

Amazon S3

客户端节点

  • Amazon c5.xlarge: 4 vCPUs, 8 GiB Memory, Up to 10 Gigabit Network
  • Ubuntu 18.04.4 LTS

元数据节点

  • Amazon c5d.xlarge: 4 vCPUs, 8 GiB Memory, Up to 10 Gigabit Network, 100 GB SSD(为元数据引擎提供本地存储)
  • Ubuntu 18.04.4 LTS
  • SSD 数据盘被格式化为 ext4 文件系统并挂载到 /data 目录

元数据引擎

Redis

  • 版本: 6.2.3
  • 配置:
    • appendonly: yes
    • appendfsync: 分别测试了 always 和 everysec
    • dir: /data/redis

MySQL

  • 版本: 8.0.25
  • /var/lib/mysql 目录被绑定挂载到 /data/mysql

TiKV

  • 版本: 5.1.0
  • 配置:
    • deploy_dir: /data/tikv-deploy
    • data_dir: /data/tikv-data

测试工具

每种元数据引擎都会运行以下所有测试。

Golang Benchmark

在源码中提供了简单的元数据基准测试: pkg/meta/benchmarks_test.go

JuiceFS Bench

JuiceFS 提供了一个基础的性能测试命令:

  1. $ ./juicefs bench /mnt/jfs

mdtest

  • 版本: mdtest-3.4.0+dev

在3个客户端节点上并发执行测试:

  1. $ cat myhost
  2. client1 slots=4
  3. client2 slots=4
  4. client3 slots=4

测试命令:

  1. # meta only
  2. $ mpirun --use-hwthread-cpus --allow-run-as-root -np 12 --hostfile myhost --map-by slot /root/mdtest -b 3 -z 1 -I 100 -u -d /mnt/jfs
  3. # 12000 * 100KiB files
  4. $ mpirun --use-hwthread-cpus --allow-run-as-root -np 12 --hostfile myhost --map-by slot /root/mdtest -F -w 102400 -I 1000 -z 0 -u -d /mnt/jfs

fio

  • 版本: fio-3.1
  1. fio --name=big-write --directory=/mnt/jfs --rw=write --refill_buffers --bs=4M --size=4G --numjobs=4 --end_fsync=1 --group_reporting

测试结果

Golang Benchmark

  • 展示了操作耗时(单位为 微秒/op),数值越小越好
  • 括号内数字是该指标对比 Redis-Always 的倍数(alwayseverysec 均是 Redis 配置项 appendfsync 的可选值)
  • 由于元数据缓存缘故,目前 Read 接口测试数据均小于 1 微秒,暂无对比意义
Redis-AlwaysRedis-EverysecMySQLTiKV
mkdir986700 (0.7)2274 (2.3)1961 (2.0)
mvdir1116940 (0.8)3690 (3.3)2145 (1.9)
rmdir981817 (0.8)2980 (3.0)2300 (2.3)
readdir_10376378 (1.0)1365 (3.6)965 (2.6)
readdir_1k18041819 (1.0)15449 (8.6)6776 (3.8)
mknod968665 (0.7)2325 (2.4)1997 (2.1)
create957703 (0.7)2291 (2.4)1971 (2.1)
rename10821040 (1.0)3701 (3.4)2162 (2.0)
unlink842710 (0.8)3293 (3.9)2217 (2.6)
lookup118127 (1.1)409 (3.5)571 (4.8)
getattr108120 (1.1)358 (3.3)285 (2.6)
setattr568490 (0.9)1239 (2.2)1720 (3.0)
access109116 (1.1)354 (3.2)283 (2.6)
setxattr237113 (0.5)1197 (5.1)1508 (6.4)
getxattr110108 (1.0)326 (3.0)279 (2.5)
removexattr244116 (0.5)847 (3.5)1856 (7.6)
listxattr_1111106 (1.0)336 (3.0)286 (2.6)
listxattr_10112111 (1.0)376 (3.4)303 (2.7)
link715574 (0.8)2610 (3.7)1949 (2.7)
symlink952702 (0.7)2583 (2.7)1960 (2.1)
newchunk235113 (0.5)1 (0.0)1 (0.0)
write816564 (0.7)2788 (3.4)2138 (2.6)
read_100 (0.0)0 (0.0)0 (0.0)
read_1000 (0.0)0 (0.0)0 (0.0)

JuiceFS Bench

Redis-AlwaysRedis-EverysecMySQLTiKV
Write big312.81 MiB/s303.45 MiB/s310.26 MiB/s310.90 MiB/s
Read big348.06 MiB/s525.78 MiB/s493.45 MiB/s477.78 MiB/s
Write small26.0 files/s27.5 files/s22.7 files/s24.2 files/s
Read small1431.6 files/s1113.4 files/s608.0 files/s415.7 files/s
Stat file6713.7 files/s6885.8 files/s2144.9 files/s1164.5 files/s
FUSE operation0.45 ms0.32 ms0.41 ms0.40 ms
Update meta1.04 ms0.79 ms3.36 ms1.74 ms

mdtest

  • 展示了操作速率(每秒 OPS 数),数值越大越好
Redis-AlwaysRedis-EverysecMySQLTiKV
EMPTY FILES
Directory creation4149.6459261.1901603.2982023.177
Directory stat172665.701243307.52715678.64315029.717
Directory removal4687.0279575.7061420.1241772.861
File creation4257.3678994.2321632.2252119.616
File stat158793.214287425.36815598.03114466.477
File read38872.11647938.79214004.08317149.941
File removal3831.42110538.675983.3381497.474
Tree creation100.403108.65744.15415.615
Tree removal127.257143.62551.80421.005
SMALL FILES
File creation317.999317.925272.272280.493
File stat54063.61757798.96313882.94010984.141
File read56891.01057548.88916038.7167155.426
File removal3638.8098490.490837.5101184.253
Tree creation54.523119.31723.3365.233
Tree removal73.36682.19522.7834.918

fio

Redis-AlwaysRedis-EverysecMySQLTiKV
Write bandwidth350 MiB/s360 MiB/s360 MiB/s358 MiB/s