Skip to content

Commit e9d2b3a

Browse files
Copilotnnhy
andcommitted
docs: 新增性能测试报告 Doc/性能测试报告.md
Co-authored-by: nnhy <506367+nnhy@users.noreply.github.com>
1 parent e865acd commit e9d2b3a

1 file changed

Lines changed: 195 additions & 0 deletions

File tree

Doc/性能测试报告.md

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
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

Comments
 (0)