Engula RDBPerf(缩短 RDB save/load 耗时)

Engula RDBPerf 以 Docker 镜像形式提供,用于对比 Engula 与 Redis 在 RDB 文件保存(SAVE)与加载(LOAD/RELOAD)场景下的性能差异,帮助评估是否能缩短 RDB save/load 耗时,并观察 RDB 文件体积与内存占用表现。

1. 工具简介与设计目标

目标:在相同数据规模下对比 Engula 与 Redis 的 RDB SAVE / LOAD 性能,以及 RDB 文件大小与内存占用。

指标说明:

  • Save Time — 生成 RDB 文件耗时
  • Reload / Load Time — 加载 RDB 文件耗时
  • RDB Size — 生成后的 RDB 文件大小
  • Memory Usage — 数据加载完成后的内存占用

两种测试模式:

模式 适用场景
模式一:对比已有 RDB 文件 用真实业务 RDB 评估不同引擎的加载/保存性能与兼容性
模式二:自动生成数据进行对比 标准化基准测试,对比不同数据规模、类型、内存档位

工具会自动启动并管理 Redis 与 Engula 服务进程,测试结束自动清理,无需手动单独启动。

2. 注意事项与运行环境

  • RDB SAVE / LOAD 性能结果会随实际 RDB 数据特征(数据分布、value 大小、压缩情况、key 数量)变化。
  • SAVE / LOAD 性能同时受硬件影响,与 CPU、内存、尤其磁盘性能密切相关。建议在本地 SSD 机器上测试,并将数据目录配置在目标挂载目录下,减少存储介质差异干扰。
  • 最低运行环境:
    • CentOS ≥ 7.9 或 Ubuntu ≥ 18.04
    • Docker 已安装并正常运行
    • 主机内存 ≥ 64G

3. 快速开始(拉取镜像)

1docker pull registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest

4. 模式一:对比已有 RDB 文件

用 Redis 和 Engula 分别加载/保存指定的 RDB 文件,记录加载时间、保存时间与内存占用。

下方命令中的 /path/to/your/... 是占位路径,运行前请替换为你机器上的实际路径(RDB 文件或目录的绝对路径)。

4.1 单个 RDB 文件

1mkdir -p $(pwd)/results
2
3docker run --rm -it \
4  -v /path/to/your/dump.rdb:/rdbs/dump.rdb:ro \
5  -v $(pwd)/results:/work/results \
6  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \
7  proof tool rdb-save-load --rdb /rdbs/dump.rdb --results-dir /work/results

单个 RDB 文件测试默认显示 TUI 进度条,必须使用 -it 分配伪终端。

终端结果:

单文件测试终端结果

HTML 报告:

单文件测试 HTML 报告

4.2 多个 RDB 文件(多次 --rdb)

1docker run --rm \
2  -v /path/to/your/rdbs:/rdbs:ro \
3  -v $(pwd)/results:/work/results \
4  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \
5  proof tool rdb-save-load \
6    --rdb /rdbs/file1.rdb \
7    --rdb /rdbs/file2.rdb \
8    --rdb /rdbs/file3.rdb \
9    --results-dir /work/results

终端结果:

多文件测试终端结果

HTML 报告:

多文件测试 HTML 报告

4.3 RDB 文件目录(--rdb-dir)

将目录下所有 .rdb 文件作为测试对象(递归搜索):

1docker run --rm \
2  -v /path/to/your/rdb-files:/rdbs:ro \
3  -v $(pwd)/results:/work/results \
4  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \
5  proof tool rdb-save-load --rdb-dir /rdbs --results-dir /work/results

终端结果:

目录测试终端结果

HTML 报告:

目录测试 HTML 报告

4.4 结果产物

运行结束后在 results 目录生成报告:

1results/
2└── tool-rdb-save-load/
3    └── 20260508T070920/
4        ├── report.html   # HTML 报告
5        ├── results.json  # JSON 摘要
6        └── main.log      # 详细日志(需要 --verbose)

5. 模式二:自动生成数据进行对比(perf 3.5)

工具自动生成指定规模、指定类型的 Key-Value 数据,分别用 Redis 和 Engula 填充、保存、加载并对比。

5.1 完整测试(1GB + 4GB + 8GB,约 20–40 分钟)

1mkdir -p $(pwd)/results
2
3docker run --rm \
4  -v $(pwd)/results:/work/results \
5  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \
6  proof test perf --sub 3.5 --results-dir /work/results

5.2 快速测试(仅 1GB,约 2–5 分钟)

1mkdir -p $(pwd)/results
2
3docker run --rm \
4  -v $(pwd)/results:/work/results \
5  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \
6  proof test perf --sub 3.5 --results-dir /work/results --perf-rdb-maxmemory 1gb

终端结果:

自动生成数据测试终端结果

HTML 报告:

自动生成数据测试 HTML 报告

5.3 结果产物

1results/
2└── perf-3.5-rdb-save-load-logs/
3    └── 20260508T123456/
4        ├── engula.log   # Engula 服务日志
5        ├── redis.log    # Redis 服务日志
6        ├── matrix.json  # 矩阵结果
7        └── report.html  # HTML 报告(可直接在浏览器打开)

6. 数据类型与测试参数

支持的数据类型:

数据类型 说明
String 简单字符串值
Hash 字段值对
List 列表(LPUSH/RPOP)
Set 集合(SADD)

测试参数范围(模式二):

  • 内存档位(maxmemory):1GB、4GB、8GB
  • Value 大小档位:256B
  • Key 数量:根据 value 大小与内存档位自动计算,确保填满指定内存约 80%

数据类型 × 内存档位矩阵:

数据类型 1GB 4GB 8GB
String
Hash
List
Set

7. 结果解读

7.1 终端表格字段

字段 说明
r-reload Redis 重载(SAVE 后重启加载)RDB 文件耗时
r-save Redis 保存 RDB 文件耗时
r-mem Redis 加载后内存占用
e-reload Engula 重载(SAVE 后重启加载)RDB 文件耗时
e-save Engula 保存 RDB 文件耗时
e-mem Engula 加载后内存占用

7.2 HTML 报告内容

HTML 报告包含 Summary(整体对比结论)、Matrix(数据类型 × 内存档位明细)、Ratios(Engula 与 Redis 的时间/内存比值)、Logs(完整测试日志),并支持按数据类型、内存档位、Value 大小过滤。

HTML 报告示例

性能参考:Save / Reload 时间比值(Engula / Redis,越低越好);内存占用比值约 40%–70% 为正常,越低越好。

7.3 results.json 示例

1[
2  {
3    "db": "engula",
4    "keys": 50000000,
5    "valueLength": 128,
6    "saveTimeSec": 3.54,
7    "loadTimeSec": 4.05,
8    "rdbSizeMB": 6287.0,
9    "usedMemoryMB": 6275.9,
10    "dbSize": 50004700,
11    "saveStatus": "ok"
12  },
13  {
14    "db": "redis",
15    "keys": 50000000,
16    "valueLength": 128,
17    "saveTimeSec": 34.85,
18    "loadTimeSec": 24.50,
19    "rdbSizeMB": 6919.8,
20    "usedMemoryMB": 10813.5,
21    "dbSize": 50004000,
22    "saveStatus": "ok"
23  }
24]

8. 实测基准数据

本节为一组特定条件下的基准结果,结果会随数据特征与硬件变化;与 §6 参数矩阵(value 256B、1/4/8GB)是不同测试口径,不可直接互推。

测试环境与对象:

  • 13th Gen Intel(R) Core(TM) i5-13600K
  • 内存 Kingston DDR4 64G
  • 磁盘 Samsung SSD 980 PRO
  • 测试对象:Engula 2.2.0 与 Redis 7.2.11
  • 测试条件:5000 万 keys、value = 128B
指标 Redis Engula 提升效果
Save 时间 34.85s 3.54s 快 9.8 倍
Load 时间 24.50s 4.05s 快 6.1 倍
RDB 文件大小 6919.8 MB 6287.0 MB 缩小 9%
内存占用 10813.5 MB 6275.9 MB 减少 42%
Keys 数量 50,004,000 50,004,700 基本一致
1Engula:  save=3.54s   load=4.05s   rdb=6287.0MB  mem=6275.9MB
2Redis:   save=34.85s  load=24.50s  rdb=6919.8MB  mem=10813.5MB

9. 原理说明

传统 RDB 路径(Redis/Valkey):

1Save: redisDB → robj serialize → RDB encode (LZF) → disk
2Load: disk → RDB decode (LZF decompress) → robj deserialize → redisDB

Engula RDB 快速路径:

1Save: memblocks → sequential batch write (zero decompression) → hashtable snapshot
2Load: sequential batch read → rebuild index (zero compression) → hashtable restore

10. 常见问题

10.1 测试时需要单独启动 Redis 和 Engula 吗?

不需要。工具会在容器内自动启动并管理 Redis 与 Engula 服务进程,测试完成后自动清理。

10.2 如何只测试特定数据类型?

模式二用 --rdb-types 指定:

1docker run --rm -v $(pwd)/results:/work/results \
2  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \
3  proof test perf --sub 3.5 --results-dir /work/results --rdb-types string,hash

10.3 如何只测试特定内存档位?

1docker run --rm -v $(pwd)/results:/work/results \
2  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \
3  proof test perf --sub 3.5 --results-dir /work/results --perf-rdb-maxmemory 4gb

10.4 服务启动失败或连接超时

工具在容器内自管 Redis/Engula 进程与端口,一般无需检查主机端口。请确认:

  • -v 挂载路径正确(RDB 文件以 :ro 只读挂载到 /rdbs,结果目录挂载到 /work/results);
  • 主机资源充足(内存 ≥ 64G,磁盘空间足够容纳 RDB 与结果);
  • 如需将容器内服务对外暴露,使用 docker run -p 显式映射端口。

10.5 TUI 和控制台输出有什么区别?

  • TUI 模式(单个 RDB 文件 + -it):实时进度条与动态对比面板。
  • 控制台模式(多个文件或加 --no-tui):静态表格,结果紧凑便于存档。

10.6 非 Docker 方式

如需非 Docker(二进制)方式使用,请联系云奈科技工作人员。