PageSourceSearch

https://montplex.com/static/js/async/3716.0fcaa08c.js

js montplex.com collected 2026-10-03 21:16:38 UTC 27,869 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkengula_website=self.webpackChunkengula_website||[]).push([["3716"],{7074:function(e,n,r){r.r(n),r.d(n,{default:()=>j});var s=r(2676),t=r(453);let i=r.p+"static/image/perf-html.160e7016.png",a=r.p+"static/image/generate-html.e8fb5909.png",d=r.p+"static/image/generate-term.50bc6008.png",l=r.p+"static/image/dir-html.660c8827.png",o=r.p+"static/image/dir-term.ae375a6a.png",c=r.p+"static/image/multi-html.92d8070f.png",h=r.p+"static/image/multi-term.d972f4f5.png",u=r.p+"static/image/single-html.64e7ff5c.png",m=r.p+"static/image/single-term.d2c956a2.png";function p(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,t.ah)(),e.components);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.h1,{id:"engula-rdbperf-reducing-rdb-saveload-time",children:["Engula RDBPerf (Reducing RDB save/load time)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#engula-rdbperf-reducing-rdb-saveload-time",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"Engula RDBPerf is provided as a Docker image for comparing the performance of Engula and Redis in RDB file save (SAVE) and load (LOAD/RELOAD) scenarios. It helps you evaluate whether RDB save/load time can be reduced, and observe RDB file size and memory usage characteristics."}),"\n",(0,s.jsxs)(n.h2,{id:"1-tool-overview-and-design-goals",children:["1. Tool Overview and Design Goals",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#1-tool-overview-and-design-goals",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"Goal: Compare Engula and Redis RDB SAVE / LOAD performance, as well as RDB file size and memory usage, under the same data scale."}),"\n",(0,s.jsx)(n.p,{children:"Metric definitions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Save Time"})," — Time to generate the RDB file"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Reload / Load Time"})," — Time to load the RDB file"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RDB Size"})," — Size of the generated RDB file"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Memory Usage"})," — Memory usage after data loading completes"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Two test modes:"}),"\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:"Mode"}),"\n",(0,s.jsx)(n.th,{children:"Use Case"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.tbody,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Mode 1: Compare existing RDB files"}),"\n",(0,s.jsx)(n.td,{children:"Use real business RDB files to evaluate the load/save performance and compatibility of different engines"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Mode 2: Auto-generate data for comparison"}),"\n",(0,s.jsx)(n.td,{children:"Standardized benchmarking, comparing different data scales, types, and memory tiers"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"The tool automatically starts and manages the Redis and Engula service processes, and cleans up automatically when the test finishes — no manual startup required."}),"\n",(0,s.jsxs)(n.h2,{id:"2-notes-and-runtime-environment",children:["2. Notes and Runtime Environment",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#2-notes-and-runtime-environment",children:"#"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"RDB SAVE / LOAD performance results vary with the actual RDB data characteristics (data distribution, value size, compression, key count)."}),"\n",(0,s.jsx)(n.li,{children:"SAVE / LOAD performance is also affected by hardware and is closely related to CPU, memory, and especially disk performance. We recommend testing on a machine with a local SSD and configuring the data directory under the target mount directory to reduce interference from differences in storage media."}),"\n",(0,s.jsxs)(n.li,{children:["Minimum runtime environment:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"CentOS ≥ 7.9 or Ubuntu ≥ 18.04"}),"\n",(0,s.jsx)(n.li,{children:"Docker installed and running normally"}),"\n",(0,s.jsx)(n.li,{children:"Host memory ≥ 64G"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.h2,{id:"3-quick-start-pull-the-image",children:["3. Quick Start (Pull the Image)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#3-quick-start-pull-the-image",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-mode-1-compare-existing-rdb-files",children:["4. Mode 1: Compare Existing RDB Files",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#4-mode-1-compare-existing-rdb-files",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"Use Redis and Engula to load/save the specified RDB file respectively, recording load time, save time, and memory usage."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"/path/to/your/..."})," in the commands below are placeholder paths. Before running, replace them with the actual paths on your machine (the absolute path to the RDB file or directory)."]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"41-a-single-rdb-file",children:["4.1 A Single RDB File",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#41-a-single-rdb-file",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:["The single-RDB-file test displays a TUI progress bar by default, so you must allocate a pseudo-terminal with ",(0,s.jsx)(n.code,{children:"-it"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Terminal result:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:m,alt:"Single-file test terminal result"})}),"\n",(0,s.jsx)(n.p,{children:"HTML report:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:u,alt:"Single-file test HTML report"})}),"\n",(0,s.jsxs)(n.h3,{id:"42-multiple-rdb-files-multiple---rdb",children:["4.2 Multiple RDB Files (Multiple --rdb)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#42-multiple-rdb-files-multiple---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:"Terminal result:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:h,alt:"Multi-file test terminal result"})}),"\n",(0,s.jsx)(n.p,{children:"HTML report:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:c,alt:"Multi-file test HTML report"})}),"\n",(0,s.jsxs)(n.h3,{id:"43-rdb-file-directory---rdb-dir",children:["4.3 RDB File Directory (--rdb-dir)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#43-rdb-file-directory---rdb-dir",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["Use all ",(0,s.jsx)(n.code,{children:".rdb"})," files in the directory as test targets (recursive search):"]}),"\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:"Terminal result:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:o,alt:"Directory test terminal result"})}),"\n",(0,s.jsx)(n.p,{children:"HTML report:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:l,alt:"Directory test HTML report"})}),"\n",(0,s.jsxs)(n.h3,{id:"44-output-artifacts",children:["4.4 Output Artifacts",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#44-output-artifacts",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["After the run finishes, reports are generated in the ",(0,s.jsx)(n.code,{children:"results"})," directory:"]}),"\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 report\n        ├── results.json  # JSON summary\n        └── main.log      # Detailed log (requires --verbose)\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"5-mode-2-auto-generate-data-for-comparison-perf-35",children:["5. Mode 2: Auto-Generate Data for Comparison (perf 3.5)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#5-mode-2-auto-generate-data-for-comparison-perf-35",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"The tool automatically generates Key-Value data of the specified scale and type, then fills, saves, loads, and compares it using Redis and Engula respectively."}),"\n",(0,s.jsxs)(n.h3,{id:"51-full-test-1gb--4gb--8gb-approximately-2040-minutes",children:["5.1 Full Test (1GB + 4GB + 8GB, approximately 20–40 minutes)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#51-full-test-1gb--4gb--8gb-approximately-2040-minutes",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-quick-test-1gb-only-approximately-25-minutes",children:["5.2 Quick Test (1GB only, approximately 2–5 minutes)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#52-quick-test-1gb-only-approximately-25-minutes",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:"Terminal result:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:d,alt:"Auto-generated data test terminal result"})}),"\n",(0,s.jsx)(n.p,{children:"HTML report:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:a,alt:"Auto-generated data test HTML report"})}),"\n",(0,s.jsxs)(n.h3,{id:"53-output-artifacts",children:["5.3 Output Artifacts",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#53-output-artifacts",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 service log\n        ├── redis.log    # Redis service log\n        ├── matrix.json  # Matrix results\n        └── report.html  # HTML report (can be opened directly in a browser)\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"6-data-types-and-test-parameters",children:["6. Data Types and Test Parameters",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#6-data-types-and-test-parameters",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"Supported data types:"}),"\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:"Data Type"}),"\n",(0,s.jsx)(n.th,{children:"Description"}),"\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:"Simple string value"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Hash"}),"\n",(0,s.jsx)(n.td,{children:"Field-value pairs"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"List"}),"\n",(0,s.jsx)(n.td,{children:"List (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:"Set (SADD)"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Test parameter ranges (Mode 2):"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Memory tiers (maxmemory): 1GB, 4GB, 8GB"}),"\n",(0,s.jsx)(n.li,{children:"Value size tier: 256B"}),"\n",(0,s.jsx)(n.li,{children:"Key count: Automatically calculated based on value size and memory tier, ensuring the specified memory is filled to approximately 80%"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Data type \xd7 memory tier matrix:"}),"\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:"Data Type"}),"\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-interpreting-results",children:["7. Interpreting Results",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#7-interpreting-results",children:"#"})]}),"\n",(0,s.jsxs)(n.h3,{id:"71-terminal-table-fields",children:["7.1 Terminal Table Fields",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#71-terminal-table-fields",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:"Field"}),"\n",(0,s.jsx)(n.th,{children:"Description"}),"\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:"Time for Redis to reload (restart and load after SAVE) the RDB file"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"r-save"}),"\n",(0,s.jsx)(n.td,{children:"Time for Redis to save the RDB file"}),"\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 memory usage after loading"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"e-reload"}),"\n",(0,s.jsx)(n.td,{children:"Time for Engula to reload (restart and load after SAVE) the RDB file"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"e-save"}),"\n",(0,s.jsx)(n.td,{children:"Time for Engula to save the RDB file"}),"\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 memory usage after loading"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"72-html-report-contents",children:["7.2 HTML Report Contents",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#72-html-report-contents",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"The HTML report includes a Summary (overall comparison conclusions), Matrix (d
1ata type \xd7 memory tier details), Ratios (Engula-to-Redis time/memory ratios), and Logs (complete test logs), and supports filtering by data type, memory tier, and value size."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)("img",{src:i,alt:"HTML report example"})}),"\n",(0,s.jsx)(n.p,{children:"Performance reference: Save / Reload time ratios (Engula / Redis, lower is better); a memory usage ratio of approximately 40%–70% is normal, and lower is better."}),"\n",(0,s.jsxs)(n.h3,{id:"73-resultsjson-example",children:["7.3 ",(0,s.jsx)(n.code,{children:"results.json"})," Example",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#73-resultsjson-example",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'[\n  {\n    "db": "engula",\n    "keys": 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-measured-benchmark-data",children:["8. Measured Benchmark Data",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#8-measured-benchmark-data",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"This section presents a set of benchmark results under specific conditions. Results vary with data characteristics and hardware, and use a different measurement basis than the \xa76 parameter matrix (value 256B, 1/4/8GB) — the two cannot be directly extrapolated from each other."}),"\n",(0,s.jsx)(n.p,{children:"Test environment and targets:"}),"\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:"Memory: Kingston DDR4 64G"}),"\n",(0,s.jsx)(n.li,{children:"Disk: Samsung SSD 980 PRO"}),"\n",(0,s.jsx)(n.li,{children:"Test targets: Engula 2.2.0 and Redis 7.2.11"}),"\n",(0,s.jsx)(n.li,{children:"Test conditions: 50 million 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:"Metric"}),"\n",(0,s.jsx)(n.th,{children:"Redis"}),"\n",(0,s.jsx)(n.th,{children:"Engula"}),"\n",(0,s.jsx)(n.th,{children:"Improvement"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.tbody,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Save time"}),"\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.8x faster"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Load time"}),"\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.1x faster"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"RDB file size"}),"\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% smaller"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Memory usage"}),"\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% lower"}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:"Key count"}),"\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:"Essentially the same"}),"\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-how-it-works",children:["9. How It Works",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#9-how-it-works",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"Traditional RDB path (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 fast path:"}),"\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-faq",children:["10. FAQ",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#10-faq",children:"#"})]}),"\n",(0,s.jsxs)(n.h3,{id:"101-do-i-need-to-start-redis-and-engula-separately-for-testing",children:["10.1 Do I need to start Redis and Engula separately for testing?",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#101-do-i-need-to-start-redis-and-engula-separately-for-testing",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"No. The tool automatically starts and manages the Redis and Engula service processes inside the container, and cleans up automatically when the test completes."}),"\n",(0,s.jsxs)(n.h3,{id:"102-how-do-i-test-only-specific-data-types",children:["10.2 How do I test only specific data types?",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#102-how-do-i-test-only-specific-data-types",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["In Mode 2, specify them with ",(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-how-do-i-test-only-a-specific-memory-tier",children:["10.3 How do I test only a specific memory tier?",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#103-how-do-i-test-only-a-specific-memory-tier",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-service-fails-to-start-or-connection-times-out",children:["10.4 Service Fails to Start or Connection Times Out",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#104-service-fails-to-start-or-connection-times-out",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"The tool self-manages the Redis/Engula processes and ports inside the container, so you generally do not need to check host ports. Please confirm:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.code,{children:"-v"})," mount paths are correct (RDB files are mounted read-only to ",(0,s.jsx)(n.code,{children:"/rdbs"})," with ",(0,s.jsx)(n.code,{children:":ro"}),", and the results directory is mounted to ",(0,s.jsx)(n.code,{children:"/work/results"}),");"]}),"\n",(0,s.jsx)(n.li,{children:"Host resources are sufficient (memory ≥ 64G, with enough disk space to hold the RDB files and results);"}),"\n",(0,s.jsxs)(n.li,{children:["If you need to expose the in-container services externally, use ",(0,s.jsx)(n.code,{children:"docker run -p"})," to explicitly map the ports."]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"105-whats-the-difference-between-tui-and-console-output",children:["10.5 What's the Difference Between TUI and Console Output?",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#105-whats-the-difference-between-tui-and-console-output",children:"#"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["TUI mode (a single RDB file + ",(0,s.jsx)(n.code,{children:"-it"}),"): Real-time progress bar and dynamic comparison panel."]}),"\n",(0,s.jsxs)(n.li,{children:["Console mode (multiple files or with ",(0,s.jsx)(n.code,{children:"--no-tui"}),"): Static tables, with compact results that are easy to archive."]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"106-non-docker-method",children:["10.6 Non-Docker Method",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#106-non-docker-method",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"If you need to use the non-Docker (binary) method, please contact the Engula team."})]})}function x(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:n}=Object.assign({},(0,t.ah)(),e.components);return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}let j=x;x.__RSPRESS_PAGE_META={},x.__RSPRESS_PAGE_META["en%2Fdocs%2Ftools%2Frdbperf.md"]={toc:[{text:"1. Tool Overview and Design Goals",id:"1-tool-overview-and-design-goals",depth:2},{text:"2. Notes and Runtime Environment",id:"2-notes-and-runtime-environment",depth:2},{text:"3. Quick Start (Pull the Image)",id:"3-quick-start-pull-the-image",depth:2},{text:"4. Mode 1: Compare Existing RDB Files",id:"4-mode-1-compare-existing-rdb-files",depth:2},{text:"4.1 A Single RDB File",id:"41-a-single-rdb-file",depth:3},{text:"4.2 Multiple RDB Files (Multiple --rdb)",id:"42-multiple-rdb-files-multiple---rdb",depth:3},{text:"4.3 RDB File Directory (--rdb-dir)",id:"43-rdb-file-directory---rdb-dir",depth:3},{text:"4.4 Output Artifacts",id:"44-output-artifacts",depth:3},{text:"5. Mode 2: Auto-Generate Data for Comparison (perf 3.5)",id:"5-mode-2-auto-generate-data-for-comparison-perf-35",depth:2},{text:"5.1 Full Test (1GB + 4GB + 8GB, approximately 20–40 minutes)",id:"51-full-test-1gb--4gb--8gb-approximately-2040-minutes",depth:3},{text:"5.2 Quick Test (1GB only, approximately 2–5 minutes)",id:"52-quick-test-1gb-only-approximately-25-minutes",depth:3}
1,{text:"5.3 Output Artifacts",id:"53-output-artifacts",depth:3},{text:"6. Data Types and Test Parameters",id:"6-data-types-and-test-parameters",depth:2},{text:"7. Interpreting Results",id:"7-interpreting-results",depth:2},{text:"7.1 Terminal Table Fields",id:"71-terminal-table-fields",depth:3},{text:"7.2 HTML Report Contents",id:"72-html-report-contents",depth:3},{text:"7.3 `results.json` Example",id:"73-resultsjson-example",depth:3},{text:"8. Measured Benchmark Data",id:"8-measured-benchmark-data",depth:2},{text:"9. How It Works",id:"9-how-it-works",depth:2},{text:"10. FAQ",id:"10-faq",depth:2},{text:"10.1 Do I need to start Redis and Engula separately for testing?",id:"101-do-i-need-to-start-redis-and-engula-separately-for-testing",depth:3},{text:"10.2 How do I test only specific data types?",id:"102-how-do-i-test-only-specific-data-types",depth:3},{text:"10.3 How do I test only a specific memory tier?",id:"103-how-do-i-test-only-a-specific-memory-tier",depth:3},{text:"10.4 Service Fails to Start or Connection Times Out",id:"104-service-fails-to-start-or-connection-times-out",depth:3},{text:"10.5 What's the Difference Between TUI and Console Output?",id:"105-whats-the-difference-between-tui-and-console-output",depth:3},{text:"10.6 Non-Docker Method",id:"106-non-docker-method",depth:3}],title:"Engula RDBPerf (Reducing RDB save/load time)",headingTitle:"Engula RDBPerf (Reducing RDB save/load time)",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.