前言

我在 Kioskcached(1)之 Memcached & Redis & Kioskcached 性能测试对比 中找到的一个问题是 malloc,对于一个内存型数据库,很容易理解,当数据量不断增大的过程中,我们势必需要大量的malloc内存,但是如果malloc不给力,性能就会受到影响。glibc中使用ptmalloc作为默认的内存分配器,但是还有一些性能更好的第三方工具,例如 TCMallocjemalloc ,本篇博客就是我使用TCMalloc替换掉ptmalloc之后做的一些测试(同样:本文不具有实际环境的参考性)。

一、为什么要使用TCMalloc?

我直接翻译gperftools的文档如下 :

TCMalloc is faster than the glibc 2.3 malloc (available as a separate library called ptmalloc2) and other mallocs that I have tested. ptmalloc2 takes approximately 300 nanoseconds to execute a malloc/free pair on a 2.8 GHz P4 (for small objects). The TCMalloc implementation takes approximately 50 nanoseconds for the same operation pair. Speed is important for a malloc implementation because if malloc is not fast enough, application writers are inclined to write their own custom free lists on top of malloc. This can lead to extra complexity, and more memory usage unless the application writer is very careful to appropriately size the free lists and scavenge idle objects out of the free list

TCMallocglibc 2.3 malloc (又名ptmalloc2)以及我测试过的其他mallocs都快。ptmalloc大概花费300ns完成一次malloc/free对在一个2.8GHz 4核的机器上(对于小对象),但是TCMalloc只花费大概50ns的时间,malloc的速度是非常重要的,程序员倾向于在malloc上自定义内存分配算法,这可能导致额外的复杂性和更多的内存使用,除非程序员非常小心的调整空闲链表的大小并清除空闲链表的空闲对象。

注意: 对于小对象

有关tcmalloc的介绍和与其它内存分配器的对比:

http://blog.csdn.net/chosen0ne/article/details/9338591

http://www.360doc.com/content/13/0915/09/8363527_314549128.shtml

二、如何使用

1: 安装方法

$ sudo yum install gperftools-*   //RHEL
$ sudo apt-get install gperftools-* //Ubuntu

如果不能安装成功,centos用户去更换下源:

http://blog.csdn.net/yangbodong22011/article/details/54175193

2:使用方法

非常简单,直接在编译的时候-ltcmalloc就会自动替换掉ptmalloc

$ gcc xxx.c xxx.c -ltcmalloc

之后可以使用ldd命令查看可执行文件需要动态链接的库

$ ldd a.out

第三行,可以看到libtcmalloc.so.4被链接。

三、测试对比

(1):当value为100字节时

使用ptmalloc

1:测试得到的 QPS=365797

2:使用gperftools测试CPU使用效率:

发现果然_int_malloc是CPU利用率最高的函数,我们看替换成tcmalloc之后会有什么效果?

使用tcmalloc

1:测试得到的 QPS=384126

2:使用gperftools测试CPU使用效率:

可以看到QPS提升了 %5,此时_int_malloc已经不是影响性能的主要因素,而是Hash函数查找定位的问题。

(2):当value为1000字节时

使用ptmalloc

1:测试得到的 QPS=212892

2:使用gperftools测试CPU使用效率:

目前read成为了CPU利用率最高的,接着是malloc

使用tcmalloc

1:测试得到的 QPS=231351

2:使用gperftools测试CPU使用效率:

虽然消耗CPU前三位的函数是一样的,但是QPS提升了8 %.

(3):当value为5000字节时

使用ptmalloc

1:测试得到的 QPS=101878

2:使用gperftools测试CPU使用效率:

使用CPU的前三位的函数已经没有变化了。

使用tcmalloc

1:测试得到的 QPS=105017

2:使用gperftools测试CPU使用效率:

这时候消耗CPU的前三个函数已经是一样的了,而且QPS也没有多大提升了。

四、总结

使用tcmalloc替换掉ptmalloc之后,对于小字节,key100字节的时候,消耗CPU最多的函数已经不是_int_malloc,说明还是非常有效果的。

当然,我的测试只是插入了100万条数据,效果不太明显,我还测试插入1000万条数据,性能提升了%16

ptmalloc:

tcmalloc:

[完]

最新文章

  1. Node.js基础与实战
  2. POJ1014 解题报告(DFS)
  3. Linux下更新时间
  4. MVC控制器常用方法返回类型
  5. Apache-Maven学习(转)
  6. json字符串转map
  7. sass sublime text 2 gulp ionic
  8. 再谈 retain,copy,mutableCopy(官方SDK,声明NSString都用copy非retain)
  9. trac的安装和配置
  10. 输出1到最大的N位数
  11. TimesTen更改CacheGroup管理用户ORACLE结束和TT结束password【TimesTen操作和维修基地】
  12. 把ipad作为电脑的第二显示器
  13. Spring Cloud官方文档中文版-Spring Cloud Config(下)-客户端等
  14. patch 请求时,关于id的报错问题
  15. react的Virtual DOM
  16. 小白的python之路11/3内存 进程 二进制软件包 rpm yum
  17. GitHub超全机器学习工程师成长路线图,开源两日收获3700+Star!【转】
  18. magento直接操作数据库
  19. JavaScript学习(2)call&apply&bind&eval用法
  20. Android笔记-2-TextView的属性详解

热门文章

  1. Docker系列(2)- Docker中的名词概念
  2. windows 根据 端口号 找到进程ID PID
  3. 压测中的QPS与TPS区别
  4. Python - Context Manager 上下文管理器
  5. 牛客练习赛89E-牛牛小数点【数论】
  6. CF605E-Intergalaxy Trips【期望dp】
  7. IdentityServer4[5]简化模式
  8. 四、mybatis动态sql
  9. Redis对象
  10. MR 01 - MapReduce 计算框架入门