resp协议定义, xml定义配置文件
This commit is contained in:
93
README.md
93
README.md
@@ -1,71 +1,38 @@
|
||||
# 9.1 Kvstore
|
||||
|
||||
#### 目前KV存储没有持久化,down 之后 就清空。
|
||||
1. 全量持久化。
|
||||
save() -> 全保存数据集。
|
||||
2. 增量持久化。
|
||||
每执行一条,把命令写入文件里。下次允许把日志重新运行。
|
||||
## 环境安装
|
||||
```shell
|
||||
sudo apt install libxml2 libxml2-dev
|
||||
```
|
||||
|
||||
#### 目前KV存储 key value 都是调用的 malloc, 都是系统的内存分配。
|
||||
1. 会出现大量的内存碎片,实现一个内存池,管理内存数据。
|
||||
2. 对比有内存池和没有内存池的性能差异,以及开源内存池 jemalloc 的性能差别。
|
||||
`sudo apt-get install -y libjemalloc-dev`
|
||||
## 需求
|
||||
- ntyco需要作为kvstore的submodule,通过git clone一次下载。 **完成**。
|
||||
- README需要包含编译步骤,测试方案与可行性,性能数据。
|
||||
- 增量持久化需要包含完整的指令。
|
||||
- 全量持久化保存数据集。
|
||||
- 持久化的性能数据。
|
||||
|
||||
测试:
|
||||
- 特殊字符,可以解决redis的resp协议。
|
||||
```
|
||||
简单字符串
|
||||
+OK\r\n
|
||||
错误
|
||||
-ERR message\r\n
|
||||
整数
|
||||
:1000\r\n
|
||||
批量字符串
|
||||
$6\r\nfoobar\r\n
|
||||
数组
|
||||
*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n
|
||||
```
|
||||
|
||||
虚拟内存的占用情况 htop。插入百万条数据集(KV*100w,set 200w del 100w delete 200w set 100w)。
|
||||
|
||||
未运行状态 VIRT 24.8M RES 4004
|
||||

|
||||
|
||||
一次执行100条,执行60000次。
|
||||
|
||||
malloc:\
|
||||
--> time_used=192898 ms, ops=6000000, qps=31104\
|
||||
VIRT 377M RES 367M
|
||||
|
||||
jemalloc:\
|
||||
--> time_used=196866 ms, ops=6000000, qps=30477\
|
||||
VIRT 433M RES 377M --> 11096
|
||||
|
||||
自实现内存池:\
|
||||
--> time_used=180338 ms, ops=6000000, qps=33270\
|
||||
VIRT 721M RES 628M
|
||||
|
||||
--> time_used=170471 ms, ops=6000000, qps=35196\
|
||||
VIRT 567M RES 558M
|
||||
|
||||
|
||||
|
||||
性能分析:
|
||||
1. key :
|
||||
1. A_0: mp_alloc (3+8B) -> 16B, malloc (3B) -> 8B
|
||||
2. A_1000: mp_alloc (6+8B) -> 16B, malloc (3B) -> 8B
|
||||
2. A_100000 : mp_alloc(8+8B) -> 16B, malloc (8B) -> 16B
|
||||
|
||||
内存初始状态 25B, malloc (115-25B) = 90B, mp_alloc(193-25B) = 168B,平均浪费接近50%。
|
||||
|
||||
#### 目前的kv存储是单指令的,一条指令一交互。
|
||||
从单挑指令实现批量处理。
|
||||
|
||||
对于同一个连接,目前缺少对以下情况的处理:
|
||||
1. 收到半包
|
||||
2. 收到多条消息
|
||||
|
||||
对不同连接,隔离他们的消息到不同的缓冲区?要不先不考虑不同的连接的情况?Nytoco代码不是很熟。
|
||||
|
||||
如果read->execute->send->read同步循环,不会出现缓冲区被覆盖的情况。但是可能会有半包或者两个命令都抵达了,才触发事件。所以应用层需要解析到完整请求才执行下一步。
|
||||
|
||||
|
||||
#### 目前KV存储是一个单点服务,实现一个主从同步的功能。
|
||||
主从同步:启动两个KVstore。在a里set,在b里get。
|
||||
|
||||
#### 目前的Key和Value都是单个单词的,实现支持特殊字符。
|
||||
如:空格回车换行。支持插入博客。
|
||||
|
||||
这里需要在协议中定义消息长度而不是特殊字符做分隔来确定哪些数据是key哪些是value。
|
||||
|
||||
还要修改底层,不要用strlen和strcpy,用memcpy。
|
||||
- 实现配置文件,把日志级别,端口ip,主从模式,持久化方案。 **完成**。
|
||||
- 持久化落盘用io_uring,加载配置文件用mmap。
|
||||
- 主从同步的性能,开启与关闭性能做到。
|
||||
- 主从同步60ew条,出现的coredump。
|
||||
- 主从同步用ebpf实现。
|
||||
- 内存池测试qps与虚拟内存,物理内存。
|
||||
- 实现一个内存泄露检测组件。
|
||||
|
||||
|
||||
### 面试题
|
||||
|
||||
Reference in New Issue
Block a user