前言:本文仅仅是作者自己在学习过程中的一次实验而已,或许因为各种因素会导致实验结果与你之前的认知不太一样,因此请你带着批判的眼光看待本文(本文不具有实际环境的参考性)。

一:测试目的

在了解了一些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,要是优化的话先从它们入手,我自己可以处理的是mallocstd::_Hashtable::_M_find_before_node

四:改进方法

  • 重新找寻Hash函数,做适配替代目前的Hash函数。
  • 使用tcmalloc等第三方性能优于glibc ptmalloc的内存分配器。

[完]

Kioskcached(1)之 Memcached & Redis & Kioskcached 性能测试对比的更多相关文章

  1. Python自动化 【第十一篇】:Python进阶-RabbitMQ队列/Memcached/Redis

     本节内容: RabbitMQ队列 Memcached Redis 1.  RabbitMQ 安装 http://www.rabbitmq.com/install-standalone-mac.htm ...

  2. PostgreSQL单机、同步复制、异步复制性能测试对比

    测试环境: •测试机:PC •内存:8GB •CPU:Intel(R) Core(TM) i5-3450 3.10GHz •硬盘:HDD •数据量:20GB •测试工具:pgbench •Postgr ...

  3. [转帖]Docker五种存储驱动原理及应用场景和性能测试对比

    Docker五种存储驱动原理及应用场景和性能测试对比 来源:http://dockone.io/article/1513 作者: 陈爱珍 布道师@七牛云   Docker最开始采用AUFS作为文件系统 ...

  4. redis、rabitmq对比

    redis.rabitmq对比 原文地址 简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性 ...

  5. tcmalloc jemalloc glibc内存分配管理模块性能测试对比

    tcmalloc是谷歌提供的内存分配管理模块 jemalloc是FreeBSD提供的内存分配管理模块 glibc是Linux提供的内存分配管理模块 并发16个线程,分配压测3次,每次压15分钟,可以看 ...

  6. sqlsugar freesql hisql 三个ORM框架性能测试对比

    hisql与目前比较流行的ORM框架性能测试对比 总体测试结果 插入记录数 hisql(耗时) sqlsugar(耗时) freesql(耗时) 5条 0.0107秒 0.0312秒 0.02675秒 ...

  7. c# sqlsugar,hisql,freesql orm框架全方位性能测试对比 sqlserver 性能测试

    在2022年1月份本人做过一次sqlsugar,hisql,freesql三个框架的性能测试,上次主要是测的sqlserver下的常规插入(非bulkcopy的方式数据插入),hisql与目前比较流行 ...

  8. memcached与redis实现的对比

    版权声明:本文由田京昆原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/129 来源:腾云阁 https://www.qclo ...

  9. 内存数据库:memcached与redis技术的对比试验

    本文以高性能nginx服务器为应用背景,想利用缓存技术来减轻系统负荷,加快响应时间,从而增加web服务器的吞吐量. redis是一种分布式内存数据库,memcached是一种内存缓存技术,它们都采用k ...

随机推荐

  1. Typescript, ES6

    * typescript 中文文档 https://www.tslang.cn/docs/home.html * ECMAScript 6 入门 http://es6.ruanyifeng.com/# ...

  2. 深入浅出WPF-10.Resource(资源)

    资源 对象级资源:每个WPF的界面元素都有一个名为Resources的属性,这个属性继承自FrameworkElement类,其类型为ResourceDictionary,采用键值对的形式存储资源,当 ...

  3. canvas 实现简单的画板功能添加手机端效果 1.01

    在上次的基础上,加了一些代码,手机端可操作 访问网址:https://chandler712.github.io/Item/ <!-- 简单版画板 --> <!DOCTYPE htm ...

  4. SpringIOC 理论推导

    IOC理论实现 UserDao接口 public interface UserDao { void say(); } UserDaoImpl实现类 public class UserDaoImpl i ...

  5. 创建HTML文档

    目录 创建HTML文档 构筑基本的文档结构 DOCTYPE元素 DOCTYPE元素 代码清单1 使用DOCTYPE元素 html元素 html元素 代码清单2 使用html元素 head元素 head ...

  6. redis两种持久化策略/存储模式

    redis的持久化策略   RDB,即 Redis DataBase,以快照形式将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的dump文件,达到数据恢复. 默认开启,见redis ...

  7. Probius+Prometheus通过API集成POD监控

    上一篇文章Probius+Kubernetes任务系统如虎添翼讲了我们把Kubernetes集成进了任务系统Probius,上线后小伙伴反馈虽然摆脱了Kubernetes-Dashboard,但还是得 ...

  8. Markdown Reference

    Markdown For Typora Overview Markdown is created by Daring Fireball; the original guideline is here. ...

  9. Kali安装OWASP

    我是2019版的kali,里面并没有自带OWASP工具,因为OWASP不再更新的因素,所以新版kali将它移除了  安装OWASP apt-get install zaproxy #以下都是安装软件时 ...

  10. 【数据结构与算法Python版学习笔记】图——强连通分支

    互联网 我们关注一下互联网相关的非常巨大图: 由主机通过网线(或无线)连接而形成的图: 以及由网页通过超链接连接而形成的图. 网页形成的图 以网页(URI作为id)为顶点,网页内包含的超链接作为边,可 ...