落盘机制修改
This commit is contained in:
95
README.md
95
README.md
@@ -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
|
||||
```
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
#### jemalloc
|
||||
```shell
|
||||
@@ -122,9 +107,9 @@ BATCH (N=9000000) --> time_used=9353 ms, qps=1924516
|
||||
VIRT 356M
|
||||
RES 119M
|
||||
```
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
#### mypool
|
||||
```shell
|
||||
@@ -143,9 +128,9 @@ BATCH (N=3000000) --> time_used=3022 ms, qps=1985440
|
||||
VIRT 122M
|
||||
RES 71492
|
||||
```
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### 测试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 Profile(Top 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,该设计消除了外部碎片,降低了系统调用次数,并在多线程场景下显著提升分配性能与内存利用率。
|
||||
|
||||
Reference in New Issue
Block a user