落盘机制修改

This commit is contained in:
2026-03-06 11:54:30 +00:00
parent c4e9bedd0a
commit 2e6baf0efe
14 changed files with 1302 additions and 443 deletions

View File

@@ -1,20 +1,5 @@
# 9.1 Kvstore
## 需求
1. ntyco需要作为kvstore的submodule,通过git clone一次下载。 **完成**
2. README需要包含编译步骤测试方案与可行性性能数据。 **完成**
3. 全量持久化保存数据集。 **BUG FIX**
4. 持久化的性能数据。 **完成**
5. 特殊字符可以解决redis的resp协议。 **完成**
6. 实现配置文件把日志级别端口ip主从模式持久化方案。 **完成**
7. 持久化落盘用io_uring加载配置文件用mmap。 **完成**
8. 主从同步的性能开启与关闭性能做到5%?。
9. 主从同步600w条,出现的coredump。 **BUG FIX**
10. 主从同步用ebpf实现。 **完成**
11. 内存池测试qps与虚拟内存物理内存。 **完成**
12. 实现一个内存泄露检测组件。 **完成**
## 环境安装与编译
```shell
# xml
@@ -101,9 +86,9 @@ BATCH (N=9000000) --> time_used=10033 ms, qps=1794079
VIRT 208M
RES 155M
```
![alt text](image11.png)
![alt text](image12.png)
![alt text](image13.png)
![alt text](https://disk.0voice.com/p/wl)
![alt text](https://disk.0voice.com/p/wm)
![alt text](https://disk.0voice.com/p/wO)
#### jemalloc
```shell
@@ -122,9 +107,9 @@ BATCH (N=9000000) --> time_used=9353 ms, qps=1924516
VIRT 356M
RES 119M
```
![alt text](image11.png)
![alt text](image22.png)
![alt text](image23.png)
![alt text](https://disk.0voice.com/p/wl)
![alt text](https://disk.0voice.com/p/wP)
![alt text](https://disk.0voice.com/p/wQ)
#### mypool
```shell
@@ -143,9 +128,9 @@ BATCH (N=3000000) --> time_used=3022 ms, qps=1985440
VIRT 122M
RES 71492
```
![alt text](image31.png)
![alt text](image32.png)
![alt text](image33.png)
![alt text](https://disk.0voice.com/p/wR)
![alt text](https://disk.0voice.com/p/wn)
![alt text](https://disk.0voice.com/p/wo)
### 测试4主从同步
测试条件:
@@ -177,18 +162,56 @@ average qps:777838
ALL TESTS PASSED.
```
### 面试题
1. 为什么会实现kvstore使用场景在哪里
2. reactor, ntyco, io_uring的三种网络模型的性能差异
3. 多线程的kvstore该如何改进
4. 私有协议如何设计会更加安全可靠?
5. 协议改进以后,对已有的代码有哪些改变?
6. kv引擎实现了哪些
7. 每个kv引擎的使用场景以及性能差异
8. 测试用例如何实现并且保证代码覆盖率超过90%
9. 网络并发量如何qps如何
10. 能够跟哪些系统交互使用?
## 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网络模型用户态网络缓冲区的写法。
@@ -356,4 +379,4 @@ TCP协议栈是分界点
7. 每线程独立内存池相对malloc更少的锁竞争。
8. 大块分配自动退化为 malloc 处理。
相比 ptmalloc该设计消除了外部碎片降低了系统调用次数并在多线程场景下显著提升分配性能与内存利用率。
相比 ptmalloc该设计消除了外部碎片降低了系统调用次数并在多线程场景下显著提升分配性能与内存利用率。