项目(1):kv存储(一):性能测试
·
虚拟机配置(主机、从机):4内核+8内存
测试函数:开7个线程发起客户端请求
一、简单的回显服务器参照
qps:6万左右


二、kv存储服务器
1. single-full:单主机模式(全量持久化)
qps:接近6万

2. sing-aof:单主机模式(增量持久化)
qps:接近6万

3. master:主从同步中作为主机
未同步数据给从机时:
qps:接近6万

同步数据给从机时:即边同步数据给从机,边有客户端请求
qps:最高5万,波动幅度大
原因:大概率时虚拟机CPU资源不够的问题(核数不支持线程独享一个CPU资源)
- 主机线程数:4线程 (客户端请求,日志异步写入,监听从机,n个线程同步n个从机)
- 从机线程数:3线程 (客户端请求,日志异步写入,同步主机)
- 测试函数线程数:7线程


)
4. slave:主从同步中作为从机
主机未有数据同步时:
qps:5万多,接近6万


主机有数据同步:即主机同步数据的同时,客户端发送请求(这里同步的数据量跟客户端的请求量相同)
1. 从机未启动备份引擎
qps:最高差不多5万,但是波动大
两个原因:
- CPU资源不够
- 同步数据跟客户端请求访问同一个引擎,有锁的竞争,同步数据频繁时,锁竞争激烈,qps会有波动。



2. 有引擎副本专门同步
qps:稳定在5万左右
原因:引擎副本专门同步数据,同步完一轮之后,与开放给客户端的引擎做一个置换(只需简单的指针置换即可,对锁的占用时间极低)。因此qps比较稳定。
仍有小概率的大幅波动实属正常现象(CPU资源不够)


三、该kv存储服务器是否有内存泄露
使用valgrind测试
valgrind --tool=memcheck \
--leak-check=full \
--show-reachable=yes \
--track-origins=yes \
--errors-for-leak-kinds=all \
./kvstore
主机测试结果:
==12942==
==12942== HEAP SUMMARY:
==12942== in use at exit: 1,140,288 bytes in 3 blocks
==12942== total heap usage: 184,818 allocs, 184,815 frees, 4,672,852 bytes allocated
==12942==
==12942== 288 bytes in 1 blocks are possibly lost in loss record 1 of 3
==12942== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==12942== by 0x40147D9: calloc (rtld-malloc.h:44)
==12942== by 0x40147D9: allocate_dtv (dl-tls.c:375)
==12942== by 0x40147D9: _dl_allocate_tls (dl-tls.c:634)
==12942== by 0x48F77B4: allocate_stack (allocatestack.c:430)
==12942== by 0x48F77B4: pthread_create@@GLIBC_2.34 (pthread_create.c:647)
==12942== by 0x12D5D0: ms_start (in /home/panda/share/kvstore_project/bin/kvstore)
==12942== by 0x1230ED: main (in /home/panda/share/kvstore_project/bin/kvstore)
==12942==
==12942== 12,000 bytes in 1 blocks are still reachable in loss record 2 of 3
==12942== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==12942== by 0x121782: kvs_malloc (in /home/panda/share/kvstore_project/bin/kvstore)
==12942== by 0x127029: reactor_entry (in /home/panda/share/kvstore_project/bin/kvstore)
==12942== by 0x12312F: main (in /home/panda/share/kvstore_project/bin/kvstore)
==12942==
==12942== 1,128,000 bytes in 1 blocks are still reachable in loss record 3 of 3
==12942== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==12942== by 0x121782: kvs_malloc (in /home/panda/share/kvstore_project/bin/kvstore)
==12942== by 0x1252DC: get_connlist (in /home/panda/share/kvstore_project/bin/kvstore)
==12942== by 0x126F73: reactor_entry (in /home/panda/share/kvstore_project/bin/kvstore)
==12942== by 0x12312F: main (in /home/panda/share/kvstore_project/bin/kvstore)
==12942==
==12942== LEAK SUMMARY:
==12942== definitely lost: 0 bytes in 0 blocks
==12942== indirectly lost: 0 bytes in 0 blocks
==12942== possibly lost: 288 bytes in 1 blocks
==12942== still reachable: 1,140,000 bytes in 2 blocks
==12942== suppressed: 0 bytes in 0 blocks
==12942==
==12942== For lists of detected and suppressed errors, rerun with: -s
==12942== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
| 泄漏类型 | 状态 | 解读 |
|---|---|---|
| definitely lost(确定泄漏) | 0 bytes(无) | 核心业务(KV 引擎、主从同步、AOF)无任何真正泄漏,这是关键保障。 |
| indirectly lost(间接泄漏) | 0 bytes(无) | 无因父内存块泄漏导致的子内存块无法释放。 |
| possibly lost(可能泄漏) | 288 bytes / 1 块 | 系统线程 TLS(线程本地存储)相关资源(无法追踪),非用户代码 bug,良性。 |
| still reachable(仍可访问) | 1.14MB / 2 块(无变化) | Reactor 框架的全局资源(事件缓冲区、连接列表),未主动释放,良性。 |
| ERROR SUMMARY | 3 个错误(均来自上述 3 个块) | 无 “使用未初始化值” 等代码规范错误 |
从机测试结果:
==10650==
==10650== HEAP SUMMARY:
==10650== in use at exit: 1,140,000 bytes in 2 blocks
==10650== total heap usage: 214,243 allocs, 214,241 frees, 4,288,624 bytes allocated
==10650==
==10650== 12,000 bytes in 1 blocks are still reachable in loss record 1 of 2
==10650== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==10650== by 0x1217A2: kvs_malloc (in /home/panda/share/kvstore_project/bin/kvstore)
==10650== by 0x12704E: reactor_entry (in /home/panda/share/kvstore_project/bin/kvstore)
==10650== by 0x1231CF: main (in /home/panda/share/kvstore_project/bin/kvstore)
==10650==
==10650== 1,128,000 bytes in 1 blocks are still reachable in loss record 2 of 2
==10650== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==10650== by 0x1217A2: kvs_malloc (in /home/panda/share/kvstore_project/bin/kvstore)
==10650== by 0x125301: get_connlist (in /home/panda/share/kvstore_project/bin/kvstore)
==10650== by 0x126F98: reactor_entry (in /home/panda/share/kvstore_project/bin/kvstore)
==10650== by 0x1231CF: main (in /home/panda/share/kvstore_project/bin/kvstore)
==10650==
==10650== LEAK SUMMARY:
==10650== definitely lost: 0 bytes in 0 blocks
==10650== indirectly lost: 0 bytes in 0 blocks
==10650== possibly lost: 0 bytes in 0 blocks
==10650== still reachable: 1,140,000 bytes in 2 blocks
==10650== suppressed: 0 bytes in 0 blocks
==10650==
==10650== For lists of detected and suppressed errors, rerun with: -s
==10650== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
| 泄漏类型 | 状态 | 解读 |
|---|---|---|
| definitely lost(确定泄漏) | 0 bytes(无) | 核心业务(KV 引擎、主从同步、AOF、从节点连接)无任何真正泄漏,这是最关键的保障。 |
| indirectly lost(间接泄漏) | 0 bytes(无) | 无因父内存块泄漏导致的子内存块无法释放,内存引用链完整。 |
| possibly lost(可能泄漏) | 0 bytes(无) | 无内存块存在 “中间引用” 导致 Valgrind 无法确定是否泄漏 |
| still reachable(仍可访问) | 1.14MB / 2 块(无变化) | Reactor 框架的全局资源(事件缓冲区、连接列表),未主动释放,良性无害。 |
| ERROR SUMMARY | 2 个错误(仅对应 2 个良性块) | 无任何代码规范错误(未初始化、越界等),所有 “错误” 均为 Valgrind 对 “未主动释放但可访问内存” 的标记。 |
reactor框架是全局资源,即运作于整个程序的生命周期,因此并非泄露,这里代码简化处理,由程序关闭时自动回收!!!
总结:该服务器无内存泄露风险,可长期运作。
更多推荐



所有评论(0)