性能测试

This commit is contained in:
2026-03-07 07:29:32 +00:00
parent 2e6baf0efe
commit 6ede44bd80
8 changed files with 587 additions and 904 deletions

107
README.md
View File

@@ -19,7 +19,61 @@ make
```
## 测试
## REDIS 对比测试
### 数据口径2026-03-07 大 key 5轮复测
- 参数:`requests=1000000 pipeline=128 keyspace=1000000 value-size=256`
- 轮次:每个策略 `5` 轮,按场景剔除 `1` 个异常轮次后取 `4` 轮均值
- kvstore 源数据:`test-redis/results/hash_bench_fair_summary_20260307_062549.csv`
- redis 源数据:`test-redis/results/redis_bigkey_summary_20260307_063158.csv`
- 去异常结果:
- `test-redis/results/hash_bench_fair_trimmed_20260307_062549.csv`
- `test-redis/results/redis_bigkey_trimmed_20260307_063158.csv`
### kvstore 协议开销基线nopersist去异常后
| 策略 | set 均值QPS | set 均值us/op | get 均值QPS | get 均值us/op |
|---|---:|---:|---:|---:|
| nopersist | 150084.25 | 6.67 | 163760.25 | 6.11 |
| persist_no | 140206.50 | 7.13 | 164554.25 | 6.08 |
| persist_everysec | 133105.75 | 7.52 | 163358.25 | 6.12 |
| 相对 nopersist 的开销 | set QPS 变化 | set us/op 变化 | get QPS 变化 | get us/op 变化 |
|---|---:|---:|---:|---:|
| persist_no | -6.58% | +6.90% | +0.48% | -0.49% |
| persist_everysec | -11.31% | +12.74% | -0.25% | +0.16% |
### Redis 协议开销基线none去异常后
| 策略 | set 均值QPS | set 均值us/op | get 均值QPS | get 均值us/op |
|---|---:|---:|---:|---:|
| none | 207470.00 | 4.82 | 217642.50 | 4.59 |
| aof_no | 143399.50 | 6.98 | 214023.50 | 4.68 |
| aof_everysec | 141893.00 | 7.05 | 208713.75 | 4.79 |
| 相对 none 的开销 | set QPS 变化 | set us/op 变化 | get QPS 变化 | get us/op 变化 |
|---|---:|---:|---:|---:|
| aof_no | -30.88% | +44.81% | -1.66% | +1.96% |
| aof_everysec | -31.61% | +46.27% | -4.10% | +4.36% |
结论:本轮数据下,持久化开销仍主要体现在 `set``get` 相对更稳Redis 的 AOF 写路径开销显著高于无持久化。
## 调用开销
### gprof Flat ProfileTop 12按 self time
| 排名 | 函数 | self time % | self seconds | calls |
|---:|---|---:|---:|---:|
| 1 | `rbtree_node_get_key` | 58.34 | 0.56 | 103209091 |
| 2 | `rbtree_search` | 7.29 | 0.07 | 1874362 |
| 3 | `kvs_keycmp` | 5.73 | 0.06 | 74287566 |
| 4 | `ascii_casecmp` | 3.13 | 0.03 | 21490996 |
| 5 | `task_init` | 3.13 | 0.03 | 1397974 |
| 6 | `mp_page_create` | 3.13 | 0.03 | 23556 |
| 7 | `need` | 2.08 | 0.02 | 14042759 |
| 8 | `parse_i64` | 2.08 | 0.02 | 7029783 |
| 9 | `mp_page_alloc` | 2.08 | 0.02 | 5122487 |
| 10 | `rbtree_node_size` | 2.08 | 0.02 | 1860739 |
| 11 | `submit_write` | 2.08 | 0.02 | 1394599 |
| 12 | `rbtree_insert` | 2.08 | 0.02 | 926531 |
## 其他测试
### 测试1性能测试
测试条件:
1. 不启用持久化。
@@ -162,57 +216,6 @@ average qps:777838
ALL TESTS PASSED.
```
## REDIS 对比测试
### 数据口径2026-03-06 09:00:30
- 轮次3 轮(取均值)
- 参数requests=1000000 pipeline=128 keyspace=1000000 value-size=32
- 数据来源:`test-redis/results/hash_bench_summary_20260306_090030.csv`
### 仅看 mypool 与 Redis
| 系统 | 场景 | set 均值QPS | set 均值us/op | get 均值QPS | get 均值us/op |
|---|---|---:|---:|---:|---:|
| kvstore (mypool) | none | 165554.00 | 6.04 | 169509.33 | 5.91 |
| kvstore (mypool) | incremental(oplog_sync=none) | 168248.67 | 5.96 | 181076.67 | 5.53 |
| kvstore (mypool) | incremental(oplog_sync=every_sec) | 164801.67 | 6.08 | 178469.33 | 5.60 |
| redis | none | 221558.00 | 4.52 | 254807.33 | 3.92 |
| redis | aof_no | 177826.67 | 5.63 | 256099.00 | 3.91 |
| redis | aof_everysec | 179159.67 | 5.59 | 243906.00 | 4.11 |
| redis | aof_always | 66807.33 | 14.97 | 236824.67 | 4.23 |
### oplog 与 AOF 安全性级别
1. `oplog_sync=none`kvstore 仅异步写入,不做周期 fsync安全级别仍接近 Redis `aof_no`
2. `oplog_sync=every_sec`kvstore 每秒执行一次“flush + 每个 uring worker 提交 fsync(drain) 并等待回调”,可提供接近 Redis `aof_everysec` 的周期性落盘保证(仍可能丢失最近 1 秒窗口)。
3. 与 Redis 相比,当前 kvstore 仍缺少 AOF 尾部校验/截断等恢复增强机制,崩溃恢复鲁棒性上略弱于 Redis AOF 体系。
### 落盘性能退化写路径set
1. kvstore(mypool)`none 165554.00 -> incremental(oplog_sync=none) 168248.67`,变化 `+1.63%`(本轮无退化,属抖动范围)。
2. kvstore(mypool)`none 165554.00 -> incremental(oplog_sync=every_sec) 164801.67`,退化 `0.45%`
3. redis`none 221558.00 -> aof_no 177826.67`,退化 `19.74%`
4. redis`none 221558.00 -> aof_everysec 179159.67`,退化 `19.14%`
5. redis`none 221558.00 -> aof_always 66807.33`,退化 `69.85%`
6. 对应 set 平均时延(us/op)变化kvstore every_sec `6.04 -> 6.08``+0.61%`redis aof_no `4.52 -> 5.63``+24.72%`redis aof_everysec `4.52 -> 5.59``+23.69%`redis aof_always `4.52 -> 14.97``+231.51%`)。
结论:本轮下 kvstore(mypool) 的 `every_sec` 持久化性能代价远低于 Redis AOF 系列,同时安全性目标已从 `aof_no` 抬升到接近 `aof_everysec` 的级别。
## 调用开销
### gprof Flat ProfileTop 12按 self time
| 排名 | 函数 | self time % | self seconds | calls |
|---:|---|---:|---:|---:|
| 1 | `rbtree_node_get_key` | 58.34 | 0.56 | 103209091 |
| 2 | `rbtree_search` | 7.29 | 0.07 | 1874362 |
| 3 | `kvs_keycmp` | 5.73 | 0.06 | 74287566 |
| 4 | `ascii_casecmp` | 3.13 | 0.03 | 21490996 |
| 5 | `task_init` | 3.13 | 0.03 | 1397974 |
| 6 | `mp_page_create` | 3.13 | 0.03 | 23556 |
| 7 | `need` | 2.08 | 0.02 | 14042759 |
| 8 | `parse_i64` | 2.08 | 0.02 | 7029783 |
| 9 | `mp_page_alloc` | 2.08 | 0.02 | 5122487 |
| 10 | `rbtree_node_size` | 2.08 | 0.02 | 1860739 |
| 11 | `submit_write` | 2.08 | 0.02 | 1394599 |
| 12 | `rbtree_insert` | 2.08 | 0.02 | 926531 |
## 项目收获
#### reactor网络模型用户态网络缓冲区的写法。