PageSourceSearch

https://montplex.com/static/js/async/643.b64df14f.js

js montplex.com collected 2026-10-03 21:17:21 UTC 26,645 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkengula_website=self.webpackChunkengula_website||[]).push([["643"],{7392:function(e,n,r){r.r(n),r.d(n,{default:()=>g});var s=r(2676),d=r(453);let l=r.p+"static/image/perf-html.160e7016.png",i=r.p+"static/image/generate-html.e8fb5909.png",h=r.p+"static/image/generate-term.50bc6008.png",t=r.p+"static/image/dir-html.660c8827.png",a=r.p+"static/image/dir-term.ae375a6a.png",c=r.p+"static/image/multi-html.92d8070f.png",x=r.p+"static/image/multi-term.d972f4f5.png",j=r.p+"static/image/single-html.64e7ff5c.png",o=r.p+"static/image/single-term.d2c956a2.png";function u(e){let n=Object.assign({h1:"h1",a:"a",p:"p",h2:"h2",ul:"ul",li:"li",strong:"strong",table:"table",thead:"thead",tr:"tr",th:"th",tbody:"tbody",td:"td",pre:"pre",code:"code",blockquote:"blockquote",h3:"h3",img:"img"},(0,d.ah)(),e.components);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.h1,{id:"engula-rdbperf缩短-rdb-saveload-耗时",children:["Engula RDBPerf(缩短 RDB save/load 耗时)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#engula-rdbperf缩短-rdb-saveload-耗时",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"Engula RDBPerf 以 Docker 镜像形式提供,用于对比 Engula 与 Redis 在 RDB 文件保存(SAVE)与加载(LOAD/RELOAD)场景下的性能差异,帮助评估是否能缩短 RDB save/load 耗时,并观察 RDB 文件体积与内存占用表现。"}),"\n",(0,s.jsxs)(n.h2,{id:"1-工具简介与设计目标",children:["1. 工具简介与设计目标",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#1-工具简介与设计目标",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"目标:在相同数据规模下对比 Engula 与 Redis 的 RDB SAVE / LOAD 性能,以及 RDB 文件大小与内存占用。"}),"\n",(0,s.jsx)(n.p,{children:"指标说明:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Save Time"})," — 生成 RDB 文件耗时"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Reload / Load Time"})," — 加载 RDB 文件耗时"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RDB Size"})," — 生成后的 RDB 文件大小"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Memory Usage"})," — 数据加载完成后的内存占用"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"两种测试模式:"}),"\n",(0,s.jsxs)(n.table,{children:["\n",(0,s.jsxs)(n.thead,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.th,{children:"模式"}),"\n",(0,s.jsx)(n.th,{children:"适用场景"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.tbody,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"模式一:对比已有 RDB 文件"}),"\n",(0,s.jsx)(n.td,{children:"用真实业务 RDB 评估不同引擎的加载/保存性能与兼容性"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"模式二:自动生成数据进行对比"}),"\n",(0,s.jsx)(n.td,{children:"标准化基准测试,对比不同数据规模、类型、内存档位"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"工具会自动启动并管理 Redis 与 Engula 服务进程,测试结束自动清理,无需手动单独启动。"}),"\n",(0,s.jsxs)(n.h2,{id:"2-注意事项与运行环境",children:["2. 注意事项与运行环境",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#2-注意事项与运行环境",children:"#"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"RDB SAVE / LOAD 性能结果会随实际 RDB 数据特征(数据分布、value 大小、压缩情况、key 数量)变化。"}),"\n",(0,s.jsx)(n.li,{children:"SAVE / LOAD 性能同时受硬件影响,与 CPU、内存、尤其磁盘性能密切相关。建议在本地 SSD 机器上测试,并将数据目录配置在目标挂载目录下,减少存储介质差异干扰。"}),"\n",(0,s.jsxs)(n.li,{children:["最低运行环境:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"CentOS ≥ 7.9 或 Ubuntu ≥ 18.04"}),"\n",(0,s.jsx)(n.li,{children:"Docker 已安装并正常运行"}),"\n",(0,s.jsx)(n.li,{children:"主机内存 ≥ 64G"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.h2,{id:"3-快速开始拉取镜像",children:["3. 快速开始(拉取镜像)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#3-快速开始拉取镜像",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker pull registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"4-模式一对比已有-rdb-文件",children:["4. 模式一:对比已有 RDB 文件",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#4-模式一对比已有-rdb-文件",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"用 Redis 和 Engula 分别加载/保存指定的 RDB 文件,记录加载时间、保存æ—
1¶é—´ä¸Žå†…存占用。"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["下方命令中的 ",(0,s.jsx)(n.code,{children:"/path/to/your/..."})," 是占位路径,运行前请替换为您机器上的实际路径(RDB 文件或目录的绝对路径)。"]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"41-单个-rdb-文件",children:["4.1 单个 RDB 文件",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#41-单个-rdb-文件",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"mkdir -p $(pwd)/results\n\ndocker run --rm -it \\\n  -v /path/to/your/dump.rdb:/rdbs/dump.rdb:ro \\\n  -v $(pwd)/results:/work/results \\\n  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \\\n  proof tool rdb-save-load --rdb /rdbs/dump.rdb --results-dir /work/results\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["单个 RDB 文件测试默认显示 TUI 进度条,必须使用 ",(0,s.jsx)(n.code,{children:"-it"})," 分配伪终端。"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"终端结果:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:o,alt:"单文件测试终端结果"})}),"\n",(0,s.jsx)(n.p,{children:"HTML 报告:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:j,alt:"单文件测试 HTML 报告"})}),"\n",(0,s.jsxs)(n.h3,{id:"42-多个-rdb-文件多次---rdb",children:["4.2 多个 RDB 文件(多次 --rdb)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#42-多个-rdb-文件多次---rdb",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker run --rm \\\n  -v /path/to/your/rdbs:/rdbs:ro \\\n  -v $(pwd)/results:/work/results \\\n  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \\\n  proof tool rdb-save-load \\\n    --rdb /rdbs/file1.rdb \\\n    --rdb /rdbs/file2.rdb \\\n    --rdb /rdbs/file3.rdb \\\n    --results-dir /work/results\n"})}),"\n",(0,s.jsx)(n.p,{children:"终端结果:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:x,alt:"多文件测试终端结果"})}),"\n",(0,s.jsx)(n.p,{children:"HTML 报告:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:c,alt:"多文件测试 HTML 报告"})}),"\n",(0,s.jsxs)(n.h3,{id:"43-rdb-文件目录--rdb-dir",children:["4.3 RDB 文件目录(--rdb-dir)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#43-rdb-文件目录--rdb-dir",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["将目录下所有 ",(0,s.jsx)(n.code,{children:".rdb"})," 文件作为测试对象(递归搜索):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker run --rm \\\n  -v /path/to/your/rdb-files:/rdbs:ro \\\n  -v $(pwd)/results:/work/results \\\n  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \\\n  proof tool rdb-save-load --rdb-dir /rdbs --results-dir /work/results\n"})}),"\n",(0,s.jsx)(n.p,{children:"终端结果:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:a,alt:"目录测试终端结果"})}),"\n",(0,s.jsx)(n.p,{children:"HTML 报告:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:t,alt:"目录测试 HTML 报告"})}),"\n",(0,s.jsxs)(n.h3,{id:"44-结果产物",children:["4.4 结果产物",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#44-结果产物",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["运行结束后在 ",(0,s.jsx)(n.code,{children:"results"})," 目录生成报告:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"results/\n└── tool-rdb-save-load/\n    └── 20260508T070920/\n        ├── report.html   # HTML 报告\n        ├── results.json  # JSON 摘要\n        └── main.log      # 详细日志(需要 --verbose)\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"5-模式二自动生成数据进行对比perf-35",children:["5. 模式二:自动生成数据进行对比(perf 3.5)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#5-模式二自动生成数据进行对比perf-35",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"工具自动生成指定规模、指定类型的 Key-Value 数据,分别用 Redis 和 Engula 填充、保存、加载并对比。"}),"\n",(0,s.jsxs)(n.h3,{id:"51-完整测试1gb--4gb--8gb约-2040-分钟",children:["5.1 完整测试(1GB + 4GB + 8GB,约 20–40 分钟)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#51-完整测试1gb--4gb--8gb约-2040-分钟",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"mkdir -p $(pwd)/results\n\ndocker run --rm \\\n  -v $(pwd)/results:/work/results \\\n  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \\\n  proof test perf --sub 3.5 --results-dir /work/results\n"})}),"\n",(0,s.jsxs)(n.h3,{id:"52-快速测试仅-1gb约-25-分钟",children:["5.2 快速测试(仅 1GB,约 2–5 分钟)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#52-快速测试仅-1gb约-25-分钟",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"mkdir -p $(pwd)/results\n\ndocker run --rm \\\n  -v $(pwd)/results:/work/results \\\n  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \\\n  proof test perf --sub 3.5 --results-dir /work/results 
1--perf-rdb-maxmemory 1gb\n"})}),"\n",(0,s.jsx)(n.p,{children:"终端结果:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:h,alt:"自动生成数据测试终端结果"})}),"\n",(0,s.jsx)(n.p,{children:"HTML 报告:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:i,alt:"自动生成数据测试 HTML 报告"})}),"\n",(0,s.jsxs)(n.h3,{id:"53-结果产物",children:["5.3 结果产物",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#53-结果产物",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"results/\n└── perf-3.5-rdb-save-load-logs/\n    └── 20260508T123456/\n        ├── engula.log   # Engula 服务日志\n        ├── redis.log    # Redis 服务日志\n        ├── matrix.json  # 矩阵结果\n        └── report.html  # HTML 报告(可直接在浏览器打开)\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"6-数据类型与测试参数",children:["6. 数据类型与测试参数",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#6-数据类型与测试参数",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"支持的数据类型:"}),"\n",(0,s.jsxs)(n.table,{children:["\n",(0,s.jsxs)(n.thead,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.th,{children:"数据类型"}),"\n",(0,s.jsx)(n.th,{children:"说明"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.tbody,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"String"}),"\n",(0,s.jsx)(n.td,{children:"简单字符串值"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Hash"}),"\n",(0,s.jsx)(n.td,{children:"字段值对"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"List"}),"\n",(0,s.jsx)(n.td,{children:"列表(LPUSH/RPOP)"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Set"}),"\n",(0,s.jsx)(n.td,{children:"集合(SADD)"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"测试参数范围(模式二):"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"内存档位(maxmemory):1GB、4GB、8GB"}),"\n",(0,s.jsx)(n.li,{children:"Value 大小档位:256B"}),"\n",(0,s.jsx)(n.li,{children:"Key 数量:根据 value 大小与内存档位自动计算,确保填满指定内存约 80%"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"数据类型 \xd7 内存档位矩阵:"}),"\n",(0,s.jsxs)(n.table,{children:["\n",(0,s.jsxs)(n.thead,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.th,{children:"数据类型"}),"\n",(0,s.jsx)(n.th,{children:"1GB"}),"\n",(0,s.jsx)(n.th,{children:"4GB"}),"\n",(0,s.jsx)(n.th,{children:"8GB"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.tbody,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"String"}),"\n",(0,s.jsx)(n.td,{children:"✓"}),"\n",(0,s.jsx)(n.td,{children:"✓"}),"\n",(0,s.jsx)(n.td,{children:"✓"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Hash"}),"\n",(0,s.jsx)(n.td,{children:"✓"}),"\n",(0,s.jsx)(n.td,{children:"✓"}),"\n",(0,s.jsx)(n.td,{children:"✓"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"List"}),"\n",(0,s.jsx)(n.td,{children:"✓"}),"\n",(0,s.jsx)(n.td,{children:"✓"}),"\n",(0,s.jsx)(n.td,{children:"✓"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Set"}),"\n",(0,s.jsx)(n.td,{children:"✓"}),"\n",(0,s.jsx)(n.td,{children:"✓"}),"\n",(0,s.jsx)(n.td,{children:"✓"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.h2,{id:"7-结果解读",children:["7. 结果解读",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#7-结果解读",children:"#"})]}),"\n",(0,s.jsxs)(n.h3,{id:"71-终端表格字段",children:["7.1 终端表格字段",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#71-终端表格字段",children:"#"})]}),"\n",(0,s.jsxs)(n.table,{children:["\n",(0,s.jsxs)(n.thead,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.th,{children:"字段"}),"\n",(0,s.jsx)(n.th,{children:"说明"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.tbody,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"r-reload"}),"\n",(0,s.jsx)(n.td,{children:"Redis 重载(SAVE 后重启加载)RDB 文件耗时"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"r-save"}),"\n",(0,s.jsx)(n.td,{children:"Redis 保存 RDB 文件耗时"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"r-mem"}),"\n",(0,s.jsx)(n.td,{children:"Redis 加载后内存占用"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"e-reload"}),"\n",(0,s.jsx)(n.td,{children:"Engula 重载(SAVE 后重启加载)RDB 文件耗时"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"e-save"}),"\n",(0,s.jsx)(n.td,{children:"Engula 保存 RDB 文件耗时"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"e-mem"}),"\n",(0,s.jsx)(n.td,{children:"Engula 加载后内存占用"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"72-html-报告内容",children:["7.2 HTML 报告内容",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#72-html-报告内容",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"HTML 报告包含 Summary(整体对比结论)、Matrix(数据类型 \xd7 内存档位明细)、Ratios(Engula 与 Redis 的时间/内存比值)、Logs(完整测试日志),并支持按数据类型、内存档位、Value 大小过滤。"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:l,alt:"HTML 报告示例"})}),"\n",(0,s.jsx)(n.p,{children:"性能参考:Save / Reload 时间比值(Engula / Redis,越低越好);内存占用比值约 40%–70% 为正常,越低越好。"}),"\n",(0,s.jsxs)(n.h3,{id:"73-resultsjson-示例",children:["7.3 ",(0,s.jsx)(n.code,{children:"results.json"})," 示例",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#73-resultsjson-示例",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'[\n  {\n    "db": "engula",\n    "ke
1ys": 50000000,\n    "valueLength": 128,\n    "saveTimeSec": 3.54,\n    "loadTimeSec": 4.05,\n    "rdbSizeMB": 6287.0,\n    "usedMemoryMB": 6275.9,\n    "dbSize": 50004700,\n    "saveStatus": "ok"\n  },\n  {\n    "db": "redis",\n    "keys": 50000000,\n    "valueLength": 128,\n    "saveTimeSec": 34.85,\n    "loadTimeSec": 24.50,\n    "rdbSizeMB": 6919.8,\n    "usedMemoryMB": 10813.5,\n    "dbSize": 50004000,\n    "saveStatus": "ok"\n  }\n]\n'})}),"\n",(0,s.jsxs)(n.h2,{id:"8-实测基准数据",children:["8. 实测基准数据",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#8-实测基准数据",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"本节为一组特定条件下的基准结果,结果会随数据特征与硬件变化;与 \xa76 参数矩阵(value 256B、1/4/8GB)是不同测试口径,不可直接互推。"}),"\n",(0,s.jsx)(n.p,{children:"测试环境与对象:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"13th Gen Intel(R) Core(TM) i5-13600K"}),"\n",(0,s.jsx)(n.li,{children:"内存 Kingston DDR4 64G"}),"\n",(0,s.jsx)(n.li,{children:"磁盘 Samsung SSD 980 PRO"}),"\n",(0,s.jsx)(n.li,{children:"测试对象:Engula 2.2.0 与 Redis 7.2.11"}),"\n",(0,s.jsx)(n.li,{children:"测试条件:5000 万 keys、value = 128B"}),"\n"]}),"\n",(0,s.jsxs)(n.table,{children:["\n",(0,s.jsxs)(n.thead,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.th,{children:"指标"}),"\n",(0,s.jsx)(n.th,{children:"Redis"}),"\n",(0,s.jsx)(n.th,{children:"Engula"}),"\n",(0,s.jsx)(n.th,{children:"提升效果"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.tbody,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Save 时间"}),"\n",(0,s.jsx)(n.td,{children:"34.85s"}),"\n",(0,s.jsx)(n.td,{children:"3.54s"}),"\n",(0,s.jsx)(n.td,{children:"快 9.8 倍"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Load 时间"}),"\n",(0,s.jsx)(n.td,{children:"24.50s"}),"\n",(0,s.jsx)(n.td,{children:"4.05s"}),"\n",(0,s.jsx)(n.td,{children:"快 6.1 倍"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"RDB 文件大小"}),"\n",(0,s.jsx)(n.td,{children:"6919.8 MB"}),"\n",(0,s.jsx)(n.td,{children:"6287.0 MB"}),"\n",(0,s.jsx)(n.td,{children:"缩小 9%"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"内存占用"}),"\n",(0,s.jsx)(n.td,{children:"10813.5 MB"}),"\n",(0,s.jsx)(n.td,{children:"6275.9 MB"}),"\n",(0,s.jsx)(n.td,{children:"减少 42%"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Keys 数量"}),"\n",(0,s.jsx)(n.td,{children:"50,004,000"}),"\n",(0,s.jsx)(n.td,{children:"50,004,700"}),"\n",(0,s.jsx)(n.td,{children:"基本一致"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"Engula:  save=3.54s   load=4.05s   rdb=6287.0MB  mem=6275.9MB\nRedis:   save=34.85s  load=24.50s  rdb=6919.8MB  mem=10813.5MB\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"9-原理说明",children:["9. 原理说明",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#9-原理说明",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"传统 RDB 路径(Redis/Valkey):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"Save: redisDB → robj serialize → RDB encode (LZF) → disk\nLoad: disk → RDB decode (LZF decompress) → robj deserialize → redisDB\n"})}),"\n",(0,s.jsx)(n.p,{children:"Engula RDB 快速路径:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"Save: memblocks → sequential batch write (zero decompression) → hashtable snapshot\nLoad: sequential batch read → rebuild index (zero compression) → hashtable restore\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"10-常见问题",children:["10. 常见问题",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#10-常见问题",children:"#"})]}),"\n",(0,s.jsxs)(n.h3,{id:"101-测试时需要单独启动-redis-和-engula-吗",children:["10.1 测试时需要单独启动 Redis 和 Engula 吗?",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#101-测试时需要单独启动-redis-和-engula-吗",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"不需要。工具会在容器内自动启动并管理 Redis 与 Engula 服务进程,测试完成后自动清理。"}),"\n",(0,s.jsxs)(n.h3,{id:"102-如何只测试特定数据类型",children:["10.2 如何只测试特定数据类型?",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#102-如何只测试特定数据类型",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["模式二用 ",(0,s.jsx)(n.code,{children:"--rdb-types"})," 指定:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker run --rm -v $(pwd)/results:/work/results \\\n  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \\\n  proof test perf --sub 3.5 --results-dir /work/results 
1--rdb-types string,hash\n"})}),"\n",(0,s.jsxs)(n.h3,{id:"103-如何只测试特定内存档位",children:["10.3 如何只测试特定内存档位?",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#103-如何只测试特定内存档位",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker run --rm -v $(pwd)/results:/work/results \\\n  registry.ap-southeast-1.aliyuncs.com/montplex/engula-rdb-perf:latest \\\n  proof test perf --sub 3.5 --results-dir /work/results --perf-rdb-maxmemory 4gb\n"})}),"\n",(0,s.jsxs)(n.h3,{id:"104-服务启动失败或连接超时",children:["10.4 服务启动失败或连接超时",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#104-服务启动失败或连接超时",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"工具在容器内自管 Redis/Engula 进程与端口,一般无需检查主机端口。请确认:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-v"})," 挂载路径正确(RDB 文件以 ",(0,s.jsx)(n.code,{children:":ro"})," 只读挂载到 ",(0,s.jsx)(n.code,{children:"/rdbs"}),",结果目录挂载到 ",(0,s.jsx)(n.code,{children:"/work/results"}),");"]}),"\n",(0,s.jsx)(n.li,{children:"主机资源充足(内存 ≥ 64G,磁盘空间足够容纳 RDB 与结果);"}),"\n",(0,s.jsxs)(n.li,{children:["如需将容器内服务对外暴露,使用 ",(0,s.jsx)(n.code,{children:"docker run -p"})," 显式映射端口。"]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"105-tui-和控制台输出有什么区别",children:["10.5 TUI 和控制台输出有什么区别?",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#105-tui-和控制台输出有什么区别",children:"#"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["TUI 模式(单个 RDB 文件 + ",(0,s.jsx)(n.code,{children:"-it"}),"):实时进度条与动态对比面板。"]}),"\n",(0,s.jsxs)(n.li,{children:["控制台模式(多个文件或加 ",(0,s.jsx)(n.code,{children:"--no-tui"}),"):静态表格,结果紧凑便于存档。"]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"106-非-docker-方式",children:["10.6 非 Docker 方式",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#106-非-docker-方式",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"如需非 Docker(二进制)方式使用,请联系云奈科技工作人员。"})]})}function p(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:n}=Object.assign({},(0,d.ah)(),e.components);return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}let g=p;p.__RSPRESS_PAGE_META={},p.__RSPRESS_PAGE_META["zh%2Fdocs%2Ftools%2Frdbperf.md"]={toc:[{text:"1. 工具简介与设计目标",id:"1-工具简介与设计目标",depth:2},{text:"2. 注意事项与运行环境",id:"2-注意事项与运行环境",depth:2},{text:"3. 快速开始(拉取镜像)",id:"3-快速开始拉取镜像",depth:2},{text:"4. 模式一:对比已有 RDB 文件",id:"4-模式一对比已有-rdb-文件",depth:2},{text:"4.1 单个 RDB 文件",id:"41-单个-rdb-文件",depth:3},{text:"4.2 多个 RDB 文件(多次 --rdb)",id:"42-多个-rdb-文件多次---rdb",depth:3},{text:"4.3 RDB 文件目录(--rdb-dir)",id:"43-rdb-文件目录--rdb-dir",depth:3},{text:"4.4 结果产物",id:"44-结果产物",depth:3},{text:"5. 模式二:自动生成数据进行对比(perf 3.5)",id:"5-模式二自动生成数据进行对比perf-35",depth:2},{text:"5.1 完整测试(1GB + 4GB + 8GB,约 20–40 分钟)",id:"51-完整测试1gb--4gb--8gb约-2040-分钟",depth:3},{text:"5.2 快速测试(仅 1GB,约 2–5 分钟)",id:"52-快速测试仅-1gb约-25-分钟",depth:3},{text:"5.3 结果产物",id:"53-结果产物",depth:3},{text:"6. 数据类型与测试参数",id:"6-数据类型与测试参数",depth:2},{text:"7. 结果解读",id:"7-结果解读",depth:2},{text:"7.1 终端表格字段",id:"71-终端表格字段",depth:3},{text:"7.2 HTML 报告内容",id:"72-html-报告内容",depth:3},{text:"7.3 `results.json` 示例",id:"73-resultsjson-示例",depth:3},{text:"8. 实测基准数据",id:"8-实测基准数据",depth:2},{text:"9. 原理说明",id:"9-原理说明",depth:2},{text:"10. 常见问题",id:"10-常见问题",depth:2},{text:"10.1 测试时需要单独启动 Redis 和 Engula 吗?",id:"101-测试时需要单独启动-redis-和-engula-吗",depth:3},{text:"10.2 如何只测试特定数据类型?",id:"102-如何只测试特定数据类型",depth:3},{text:"10.3 如何只测试特定内存档位?",id:"103-如何只测试特定内存档位",depth:3},{text:"10.4 服务启动失败或连接超时",id:"104-服务启动失败或连接超时",depth:3}
1,{text:"10.5 TUI 和控制台输出有什么区别?",id:"105-tui-和控制台输出有什么区别",depth:3},{text:"10.6 非 Docker 方式",id:"106-非-docker-方式",depth:3}],title:"Engula RDBPerf(缩短 RDB save/load 耗时)",headingTitle:"Engula RDBPerf(缩短 RDB save/load 耗时)",frontmatter:{}}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.