Kioskcached(1)之 Memcached & Redis & Kioskcached 性能测试对比
前言:本文仅仅是作者自己在学习过程中的一次实验而已,或许因为各种因素会导致实验结果与你之前的认知不太一样,因此请你带着批判的眼光看待本文(本文不具有实际环境的参考性)。
一:测试目的
在了解了一些NoSQL
的知识之后,我发现Memcached
是一个多线程的模型,对于一个NoSQL
数据库,如果不考虑数据持久化功能(读写磁盘),剩余的内存操作应该是非常快的。但是多线程就意味着需要互斥和同步,锁是必须的,因此我设想多线程或许还会影响其性能而没有单线程快,这也是我为了验证自己的想法做的测试,因此也有了我标题中提到的我自己的项目 Kioskcached——一款单线程的简易key-value数据库。
二:测试环境
OS : RedHat 7
Kernel : Linux version 3.10.0-514.el7.x86_64
CPU : Intel(R) Core(TM) i5 CPU M 520 @ 2.40GHz
Mem : 8G//备注:除了测试三个数据库的QPS,我还使用Google的 gperftools 工具我的项目做了
CPU PROFILER
,找出了代码中占用CPU最多的函数,并考虑优化它。
三:测试过程及结果
1.Memcached
1:启动Memcached,使用默认大小64M就够了,我们存取的数据量大概是10M左右,(100B(key+value)*100000(nums) = 10M)。
2:测试代码如下:
https://github.com/yangbodong22011/kioskcached/tree/master/test/Memcached
3: 编译运行
$ g++ testFoot.cpp -lmemcached -lprofiler
$ ./a.out 100000 //插入10万条数据
测试得到 QPS 为: 33673.7
2.Redis
1:源码安装Redis之后,./redis-server
启动Redis服务器
2:在src
目录下有 redis-benchmark 可执行文件,这是官方自带的Redis性能测试工具。
$ ./redis-benchmark -h 127.0.0.1 -c 1 -n 100000 -d 100
-c : client的数量,1表示只有一个客户端
-n : 100000 : 表示10万次请求
-d : 100 : 表示一次数据量为100字节
3:测试结果
测试得到 QPS 为: 41631.97
3.Kioskcached
1:一款内存缓存型数据库,采用C/C++
开发,网络库部分使用Redis
源码,单线程IO多路复用模型避免了锁的争用,保证了操作的原子性。使用C++11 unordered_set管理内存数据结构。
2: Kioskcached的测试情况:
- 当value的值为100字节时 : QPS = 316275
使用gperftools
找出使用CPU前几位的函数为:
$ cat output.txt
Total: 259 samples
34 13.1% 13.1% 56 21.6% std::_Hashtable::_M_find_before_node
21 8.1% 21.2% 22 8.5% _int_malloc
17 6.6% 27.8% 23 8.9% std::_Hashtable::_M_rehash_aux
...... 剩余的省略
输出结果说明(按照列数往下):
序号 | 说明 |
---|---|
1 | 分析样本数量(不包含其他函数调用) |
2 | 分析样本百分比(不包含其他函数调用) |
3 | 目前为止的分析样本百分比(不包含其他函数调用) |
4 | 分析样本数量(包含其他函数调用) |
5 | 分析样本百分比(包含其他函数调用) |
6 | 函数名 |
- 当value的值为1000字节时 : QPS = 203203
使用gperftools
找出使用CPU前几位的函数为:
Total: 426 samples
78 18.3% 18.3% 78 18.3% __read_nocancel
64 15.0% 33.3% 70 16.4% _int_malloc
28 6.6% 39.9% 57 13.4% std::_Hashtable::_M_find_before_node
...... 剩余的省略
可以发现与100字节相比较,此时read系统调用占用CPU已经成为了第一。
- 当value的值为10000字节时
使用gperftools
找出使用CPU前几位的函数为:
Total: 521 samples
102 19.6% 19.6% 102 19.6% __read_nocancel
79 15.2% 34.7% 83 15.9% _int_malloc
42 8.1% 42.8% 42 8.1% __GI_epoll_wait
29 5.6% 48.4% 52 10.0% std::_Hashtable::_M_find_before_node
malloc 还是我们的难题和瓶颈。
...... 剩余的省略
3 : 总结
可以看出像:
_int_malloc
std::_Hashtable::_M_find_before_node
std::_Hashtable::_M_rehash_aux
__read_nocancel
这些都消耗非常多的CPU,要是优化的话先从它们入手,我自己可以处理的是malloc
和 std::_Hashtable::_M_find_before_node
。
四:改进方法
- 重新找寻Hash函数,做适配替代目前的Hash函数。
- 使用tcmalloc等第三方性能优于glibc ptmalloc的内存分配器。
[完]
Kioskcached(1)之 Memcached & Redis & Kioskcached 性能测试对比的更多相关文章
- Python自动化 【第十一篇】:Python进阶-RabbitMQ队列/Memcached/Redis
本节内容: RabbitMQ队列 Memcached Redis 1. RabbitMQ 安装 http://www.rabbitmq.com/install-standalone-mac.htm ...
- PostgreSQL单机、同步复制、异步复制性能测试对比
测试环境: •测试机:PC •内存:8GB •CPU:Intel(R) Core(TM) i5-3450 3.10GHz •硬盘:HDD •数据量:20GB •测试工具:pgbench •Postgr ...
- [转帖]Docker五种存储驱动原理及应用场景和性能测试对比
Docker五种存储驱动原理及应用场景和性能测试对比 来源:http://dockone.io/article/1513 作者: 陈爱珍 布道师@七牛云 Docker最开始采用AUFS作为文件系统 ...
- redis、rabitmq对比
redis.rabitmq对比 原文地址 简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性 ...
- tcmalloc jemalloc glibc内存分配管理模块性能测试对比
tcmalloc是谷歌提供的内存分配管理模块 jemalloc是FreeBSD提供的内存分配管理模块 glibc是Linux提供的内存分配管理模块 并发16个线程,分配压测3次,每次压15分钟,可以看 ...
- sqlsugar freesql hisql 三个ORM框架性能测试对比
hisql与目前比较流行的ORM框架性能测试对比 总体测试结果 插入记录数 hisql(耗时) sqlsugar(耗时) freesql(耗时) 5条 0.0107秒 0.0312秒 0.02675秒 ...
- c# sqlsugar,hisql,freesql orm框架全方位性能测试对比 sqlserver 性能测试
在2022年1月份本人做过一次sqlsugar,hisql,freesql三个框架的性能测试,上次主要是测的sqlserver下的常规插入(非bulkcopy的方式数据插入),hisql与目前比较流行 ...
- memcached与redis实现的对比
版权声明:本文由田京昆原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/129 来源:腾云阁 https://www.qclo ...
- 内存数据库:memcached与redis技术的对比试验
本文以高性能nginx服务器为应用背景,想利用缓存技术来减轻系统负荷,加快响应时间,从而增加web服务器的吞吐量. redis是一种分布式内存数据库,memcached是一种内存缓存技术,它们都采用k ...
随机推荐
- spring入门2-aop和集成测试
1.AOP开发 1.1.简述 作用:面向切面编程:在程序运行期间,在不修改源码的情况下对代码进行增强 优势:减少代码重复,提高开发效率,便于维护 底层:动态代理实现(jdk动态代理,cglib动态代理 ...
- 小白一看就懂的postman教程
Postman的安装和注册 下载 直接在官网下载 https://www.postman.com/downloads/ postman有两种形式 客户端,下载后安装使用 网页版,在浏览器登录postm ...
- jqGride的基本使用
1. 定义:jqGrid是一个在jQuery基础上封装一个表格控件,以ajax的方式和服务器端通信. 2. 使用方式: 2.1 项目中引入jqGride的文件: 2.2 搭建开发页面: 2.3 构建 ...
- 接口管理工具swagger
swagger,一款致力于解决接口规范化.标准化.文档化的开源库,一款真正的开发神器. swagger三大部分 Editor https://swagger.io/tools/swagger-edit ...
- 『GoLang』面向对象
我们总结一下前面看到的:Go 没有类,而是松耦合的类型.方法对接口的实现. 面向对象语言最重要的三个方面分别是:封装,继承和多态,在 Go 中它们是怎样表现的呢? Go实现面向对象的两个关键是stru ...
- 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 百篇博客分析OpenHarmonyOS | v2.07
百篇博客系列篇.本篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核 ...
- 03-Jwt在.netcore中的实现
1)jwt的加密解密过程 jwt验证的核心就是加密解密的过程,掌握了这个过程,也就掌握了jwt的原理.jwt的三部分中,header和payload是明文的,能够直接读出来,签名Signature部分 ...
- 【C++ Primer Plus】编程练习答案——第8章
1 void ch8_1_print(const std::string & str, int n = 0 ) { 2 using namespace std; 3 static int fl ...
- redis在微服务领域的贡献
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 前言 说到redis,可能大家的脑海中蹦出的关键词是:NoSQL.KV.高性能.缓存等.但今天 ...
- Dapr + .NET Core实战(十四)虚拟机集群部署 mDNS + Consul
前面我们说了在单机模式下和K8S集群下的Dapr实战,这次我们来看看如何在不使用K8S的情况下,在一个传统的虚拟机集群里来部署Dapr. 1.环境准备 我们准备两台centos7虚拟机 Dapr1:1 ...