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 报告:

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 报告:

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 报告:

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 报告:

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 大小过滤。

性能参考: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(二进制)方式使用,请联系云奈科技工作人员。