|
| 1 | +# NovaDb 性能测试报告 |
| 2 | + |
| 3 | +## 1. 测试环境 |
| 4 | + |
| 5 | +| 项目 | 详情 | |
| 6 | +|------|------| |
| 7 | +| 操作系统 | Linux Ubuntu 24.04.3 LTS (Noble Numbat) | |
| 8 | +| CPU | Intel Xeon Platinum 8370C CPU 2.80GHz, 1 CPU, 4 逻辑核 / 2 物理核 | |
| 9 | +| .NET SDK | 10.0.102 | |
| 10 | +| 运行时 | .NET 8.0.23 (RyuJIT x86-64-v4) | |
| 11 | +| 测试框架 | BenchmarkDotNet v0.15.8 | |
| 12 | +| GC 模式 | Concurrent Workstation | |
| 13 | +| 预置数据 | 每个测试表/引擎预插入 1,000 条记录 | |
| 14 | + |
| 15 | +## 2. 测试概述 |
| 16 | + |
| 17 | +本报告使用 BenchmarkDotNet 对 NovaDb 的三大引擎(关系引擎、KV 引擎、时序引擎)在**嵌入模式**和**独立服务模式**下的核心操作进行基准测试,覆盖吞吐量(Op/s)和内存分配(Allocated)两个关键维度。 |
| 18 | + |
| 19 | +### 测试项目 |
| 20 | + |
| 21 | +| 引擎 | 模式 | 测试内容 | |
| 22 | +|------|------|---------| |
| 23 | +| SQL 关系引擎 | 嵌入模式 | INSERT / SELECT(主键/范围) / UPDATE / DELETE / 聚合查询 | |
| 24 | +| KV 键值引擎 | 嵌入模式 | Set / Get / Set+Get 混合 / Delete | |
| 25 | +| Flux 时序引擎 | 嵌入模式 | Append 单条 / AppendBatch 批量 / QueryRange 范围查询 | |
| 26 | +| SQL 关系引擎 | 服务模式 | INSERT / SELECT(主键/范围) / UPDATE / 聚合查询 | |
| 27 | + |
| 28 | +--- |
| 29 | + |
| 30 | +## 3. 嵌入模式 — SQL 关系引擎 |
| 31 | + |
| 32 | +测试 SQL 引擎在 `WalMode.None`(无 WAL,最高吞吐)和 `WalMode.Normal`(异步 WAL,平衡安全与性能)两种模式下的表现。 |
| 33 | + |
| 34 | +| 操作 | WAL 模式 | 平均耗时 | 吞吐 (Op/s) | 内存分配 | |
| 35 | +|------|---------|---------|------------|---------| |
| 36 | +| Insert 单行插入 | None | 6.17 μs | **162,017** | 3.95 KB | |
| 37 | +| Select 主键查询 | None | 337.47 μs | 2,963 | 589.30 KB | |
| 38 | +| Select 范围查询 | None | 424.70 μs | 2,355 | 639.51 KB | |
| 39 | +| Update 单行更新 | None | 1,048.69 μs | 954 | 590.53 KB | |
| 40 | +| Delete + 重插 | None | 1,953.47 μs | 512 | 1,586.33 KB | |
| 41 | +| 聚合 COUNT/AVG | None | 373.05 μs | 2,681 | 606.61 KB | |
| 42 | +| Insert 单行插入 | Normal | 6.73 μs | **148,499** | 4.09 KB | |
| 43 | +| Select 主键查询 | Normal | 341.25 μs | 2,930 | 589.30 KB | |
| 44 | +| Select 范围查询 | Normal | 424.73 μs | 2,354 | 639.51 KB | |
| 45 | +| Update 单行更新 | Normal | 1,070.15 μs | 934 | 590.67 KB | |
| 46 | +| Delete + 重插 | Normal | 1,924.38 μs | 520 | 1,586.60 KB | |
| 47 | +| 聚合 COUNT/AVG | Normal | 373.36 μs | 2,678 | 606.61 KB | |
| 48 | + |
| 49 | +### 分析 |
| 50 | + |
| 51 | +- **INSERT 吞吐极高**:单行插入仅需 ~6 μs,WalMode.None 下达 **16.2 万 Op/s**,WalMode.Normal 下为 **14.8 万 Op/s**,开启异步 WAL 对写入性能的影响约 8.4%。 |
| 52 | +- **读操作稳定**:SELECT 主键查询和范围查询不受 WAL 模式影响,耗时一致(~337 μs / ~425 μs)。 |
| 53 | +- **内存分配**:INSERT 仅分配 ~4 KB,读/更新操作约 590-640 KB(包含 SQL 解析、AST 构建、结果集封装的完整链路)。 |
| 54 | + |
| 55 | +--- |
| 56 | + |
| 57 | +## 4. 嵌入模式 — KV 键值引擎 |
| 58 | + |
| 59 | +对比 64 字节和 1024 字节两种 Value 大小下的 KV 引擎性能。 |
| 60 | + |
| 61 | +| 操作 | Value 大小 | 平均耗时 | 吞吐 (Op/s) | 内存分配 | |
| 62 | +|------|-----------|---------|------------|---------| |
| 63 | +| Set 写入 | 64 B | 2,400.85 ns | **416,519** | 1,746 B | |
| 64 | +| Get 读取 | 64 B | 25.83 ns | **38,713,209** | 0 B | |
| 65 | +| Set+Get 混合 | 64 B | 2,392.44 ns | 417,983 | 1,128 B | |
| 66 | +| Delete 删除 | 64 B | 3,133.33 ns | 319,149 | 1,904 B | |
| 67 | +| Set 写入 | 1024 B | 7,389.83 ns | 135,321 | 6,658 B | |
| 68 | +| Get 读取 | 1024 B | 25.98 ns | **38,495,538** | 0 B | |
| 69 | +| Set+Get 混合 | 1024 B | 7,497.16 ns | 133,384 | 6,658 B | |
| 70 | +| Delete 删除 | 1024 B | 7,941.37 ns | 125,923 | 6,816 B | |
| 71 | + |
| 72 | +### 分析 |
| 73 | + |
| 74 | +- **Get 读取极快**:纯内存 Dictionary 查找仅 ~26 ns,达到 **3,870 万 Op/s**,**零内存分配**。 |
| 75 | +- **Set 写入**:64B value 写入约 2.4 μs(含持久化日志),达 **41.6 万 Op/s**。1024B 随 value 增大,写入耗时和分配线性增长。 |
| 76 | +- **Value 大小影响**:从 64B 到 1024B(16 倍),写入耗时增长约 3 倍,分配增长约 3.8 倍,表明引擎在序列化和持久化上有较好的效率。 |
| 77 | + |
| 78 | +--- |
| 79 | + |
| 80 | +## 5. 嵌入模式 — Flux 时序引擎 |
| 81 | + |
| 82 | +| 操作 | 平均耗时 | 吞吐 (Op/s) | 内存分配 | |
| 83 | +|------|---------|------------|---------| |
| 84 | +| Append 单条写入 | 261.23 μs | **3,828** | 1.88 KB | |
| 85 | +| AppendBatch 批量写入 (100 条) | 55,041.81 μs | 18 | 208.29 KB | |
| 86 | +| QueryRange 时间范围查询 | 2.67 μs | **374,334** | 2.21 KB | |
| 87 | + |
| 88 | +### 分析 |
| 89 | + |
| 90 | +- **范围查询极快**:2.67 μs 即可完成时间范围查询,达 **37.4 万 Op/s**,内存仅 2.21 KB。 |
| 91 | +- **单条写入**:由于时序引擎包含分区键计算、消息 ID 自增、持久化等逻辑,单条写入约 261 μs。 |
| 92 | +- **批量写入**:100 条批量写入约 55 ms(含持久化),单条均摊约 550 μs。随着数据累积,持久化开销线性增长(测试过程中数据量不断增大)。 |
| 93 | +- **内存效率**:单条写入仅 1.88 KB,批量写入每条均摊约 2.08 KB,分配比例稳定。 |
| 94 | + |
| 95 | +--- |
| 96 | + |
| 97 | +## 6. 独立服务模式 — SQL 关系引擎 |
| 98 | + |
| 99 | +通过 TCP 网络(NovaServer + ApiServer)进行远程 SQL 执行,对比嵌入模式的额外网络开销。 |
| 100 | + |
| 101 | +| 操作 | 平均耗时 | 吞吐 (Op/s) | 内存分配 | |
| 102 | +|------|---------|------------|---------| |
| 103 | +| Server Insert 插入 | 154.53 μs | **6,471** | 11.41 KB | |
| 104 | +| Server Select 主键查询 | 508.32 μs | 1,967 | 601.57 KB | |
| 105 | +| Server Select 范围查询 | 886.77 μs | 1,128 | 999.66 KB | |
| 106 | +| Server Update 更新 | 1,239.66 μs | 807 | 597.88 KB | |
| 107 | +| Server 聚合查询 | 540.02 μs | 1,852 | 617.93 KB | |
| 108 | + |
| 109 | +### 嵌入 vs 服务模式对比 |
| 110 | + |
| 111 | +| 操作 | 嵌入模式 (WalNone) | 服务模式 | 倍率 | |
| 112 | +|------|-------------------|---------|------| |
| 113 | +| Insert | 6.17 μs | 154.53 μs | 25.0× | |
| 114 | +| Select 主键 | 337.47 μs | 508.32 μs | 1.5× | |
| 115 | +| Select 范围 | 424.70 μs | 886.77 μs | 2.1× | |
| 116 | +| Update | 1,048.69 μs | 1,239.66 μs | 1.2× | |
| 117 | +| 聚合查询 | 373.05 μs | 540.02 μs | 1.4× | |
| 118 | + |
| 119 | +### 分析 |
| 120 | + |
| 121 | +- **Insert 差距最大**(25×):嵌入模式 INSERT 仅 6 μs,而服务模式需经过序列化 → TCP 传输 → 反序列化 → 执行 → 返回,额外约 148 μs。 |
| 122 | +- **读操作差距较小**(1.2-2.1×):原始查询本身耗时较长(数百 μs),网络开销占比降低。 |
| 123 | +- **内存分配**:服务模式因网络缓冲区和协议封装,每次操作额外分配约 7-360 KB。 |
| 124 | +- **服务模式适用场景**:多客户端并发访问、跨进程数据共享、需要集群复制的生产环境。 |
| 125 | + |
| 126 | +--- |
| 127 | + |
| 128 | +## 7. 综合性能总结 |
| 129 | + |
| 130 | +### 各引擎峰值吞吐(嵌入模式) |
| 131 | + |
| 132 | +| 引擎 | 最高吞吐操作 | Op/s | 耗时 | |
| 133 | +|------|------------|------|------| |
| 134 | +| SQL 关系引擎 | INSERT (WalNone) | 162,017 | 6.17 μs | |
| 135 | +| KV 键值引擎 | GET (64B) | 38,713,209 | 25.83 ns | |
| 136 | +| Flux 时序引擎 | QueryRange | 374,334 | 2.67 μs | |
| 137 | + |
| 138 | +### 内存效率 |
| 139 | + |
| 140 | +| 引擎 | 最低分配操作 | 分配量 | |
| 141 | +|------|------------|-------| |
| 142 | +| KV 键值引擎 | GET | **0 B**(零分配) | |
| 143 | +| SQL 关系引擎 | INSERT | 3.95 KB | |
| 144 | +| Flux 时序引擎 | Append 单条 | 1.88 KB | |
| 145 | + |
| 146 | +### WAL 模式影响 |
| 147 | + |
| 148 | +| WAL 模式 | INSERT 吞吐 | 相对 None 模式 | |
| 149 | +|---------|------------|--------------| |
| 150 | +| None | 162,017 Op/s | 100% | |
| 151 | +| Normal | 148,499 Op/s | 91.6% | |
| 152 | + |
| 153 | +--- |
| 154 | + |
| 155 | +## 8. 运行基准测试 |
| 156 | + |
| 157 | +### 运行全部测试 |
| 158 | + |
| 159 | +```bash |
| 160 | +dotnet run --project Benchmark/Benchmark.csproj -c Release -- --filter '*' |
| 161 | +``` |
| 162 | + |
| 163 | +### 运行单个引擎测试 |
| 164 | + |
| 165 | +```bash |
| 166 | +# 嵌入模式 SQL 引擎 |
| 167 | +dotnet run --project Benchmark/Benchmark.csproj -c Release -- --filter '*EmbeddedSqlBenchmark*' |
| 168 | + |
| 169 | +# KV 引擎 |
| 170 | +dotnet run --project Benchmark/Benchmark.csproj -c Release -- --filter '*KvStoreBenchmark*' |
| 171 | + |
| 172 | +# 时序引擎 |
| 173 | +dotnet run --project Benchmark/Benchmark.csproj -c Release -- --filter '*FluxEngineBenchmark*' |
| 174 | + |
| 175 | +# 独立服务模式 |
| 176 | +dotnet run --project Benchmark/Benchmark.csproj -c Release -- --filter '*ServerModeBenchmark*' |
| 177 | +``` |
| 178 | + |
| 179 | +### 导出报告 |
| 180 | + |
| 181 | +```bash |
| 182 | +# 导出 Markdown 和 HTML 报告 |
| 183 | +dotnet run --project Benchmark/Benchmark.csproj -c Release -- --filter '*' --exporters markdown html |
| 184 | + |
| 185 | +# 报告输出目录:BenchmarkDotNet.Artifacts/results/ |
| 186 | +``` |
| 187 | + |
| 188 | +--- |
| 189 | + |
| 190 | +## 9. 注意事项 |
| 191 | + |
| 192 | +1. **测试环境差异**:CI 环境的性能数据仅供参考,实际生产环境的性能取决于硬件配置、磁盘类型、并发级别等因素。 |
| 193 | +2. **数据规模**:本次测试使用 1,000 条预置数据,大数据量场景下性能特征可能不同(如索引深度增加、内存压力等)。 |
| 194 | +3. **InProcess 模式**:为兼容项目构建配置,基准测试使用 InProcess 工具链,可能存在微小的测量偏差。 |
| 195 | +4. **服务模式端口**:服务模式测试使用随机端口,避免与本地服务冲突。 |
0 commit comments