前言

我在 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:

[完]

Kioskcached(2) 之 使用tcmalloc 替换 ptmalloc的更多相关文章

  1. 使用tcmalloc替换系统的malloc

    https://blog.csdn.net/educast/article/details/79166553?utm_source=blogxgwz0 今天对服务器进行压测,模拟的请求量到4万次/分的 ...

  2. tcmalloc jemalloc 和ptmalloc 对比

    ptmalloc 是glibc的内存分配管理 tcmalloc 是google的内存分配管理模块 jemalloc 是BSD的提供的内存分配管理 三者的性能对比参考从网上的一个图如下: 自己测试了一下 ...

  3. php Allocator Jemalloc TCMalloc那个内存分配器比较好?

    php Allocator Jemalloc TCMalloc那个内存分配器比较好? php一键安装脚本可以选择是否安装内存优化 You have 3 options for your Memory ...

  4. Redis安装与调试

    Redis安装与调试 Redis安装与调试linux版本:64位CentOS 6.5 Redis版本:2.8.17  (更新到2014年10月31日) Redis官网:http://redis.io/ ...

  5. 如何节省 1TB 图片带宽?解密极致图像压缩

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:Gophery 本文由 腾讯技术工程官方号 发布在云+社区 图像已经发展成人类沟通的视觉语言.无论传统互联网还是移动互联网,图像一直占据着 ...

  6. Linux的虚拟内存管理-如何分配和释放内存,以提高服务器在高并发情况下的性能,从而降低了系统的负载

    Linux的虚拟内存管理有几个关键概念: Linux 虚拟地址空间如何分布?malloc和free是如何分配和释放内存?如何查看堆内内存的碎片情况?既然堆内内存brk和sbrk不能直接释放,为什么不全 ...

  7. 内存优化总结:ptmalloc、tcmalloc和jemalloc(转)

    转载于:http://www.cnhalo.net/2016/06/13/memory-optimize/ 概述 需求 系统的物理内存是有限的,而对内存的需求是变化的, 程序的动态性越强,内存管理就越 ...

  8. 【原创】MySQL5.7.18(ptmalloc VS tcmalloc VS jemalloc)性能测试

    ptmalloc(glibc的malloc)是Linux提供的内存分配管理模块,目前我们MySQL默认使用的内存分配模块. tcmalloc是Google提供的内存分配管理模块. jemalloc是F ...

  9. ptmalloc、tcmalloc和jemalloc

    内存优化总结:ptmalloc.tcmalloc和jemalloc 转载 2017年09月05日 18:57:12 3674 转载于:http://www.cnhalo.net/2016/06/13/ ...

随机推荐

  1. Orchard Core Framework Samples

    解决方案包含内容 多租户应用 一个ASP.NET Core MVC应用程序,它引用模块项目,并为两个启用了不同模块的租户提供支持. 此Web应用程序的主页提供了更多信息,并链接到两个租户和模块端点.租 ...

  2. JavaScript进阶面向对象ES6

    类和对象 对象:万物皆对象,对象是一个具体的事物,看得见摸得着的实物 对象是由属性和方法组成的: 属性:事物的特征,再对象中用属性来表示(常用名词) 方法:事物的行为,再对象中用方法来表示(常用动词) ...

  3. Matlab使用随记

    Matlab 2020 想要看图像每一点的值大小 工具--->数据提示 想要导出的分辨率提高 导出设置--->渲染--->600dpi Matlab 2017b 程序运行后,画出图, ...

  4. vue 熟悉项目结构 创建第一个自己的组件

    * vue开发环境搭建 * 项目入口文件 ./src/main.js // The Vue build version to load with the `import` command // (ru ...

  5. javascript / PHP [Design Patterns - Facade Pattern]

    This pattern involves a single class which provides simplified methods required by client and delega ...

  6. Java两种基础结构

    顺序结构 JAVA的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行 顺序结构是最简单的算法结构 语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的 ...

  7. JS 开发中数组常用的方法

    大家有没有想过,js数组为什么会有这么多的方法,没错,就是为了不同场景下处理数据的需要,就像设计模式一样,都是为了能更好的处理当前场景的需要. 首先怎么创建一个数组呢, // 两种方式 // 1,构造 ...

  8. SpringCloud升级之路2020.0.x版-27.OpenFeign的生命周期-创建代理

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,我们开始分析 OpenFeign 的生命周期,结合 OpenFeign 本身的源代 ...

  9. FastAPI 学习之路(八)路径参数和数值的校验

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  10. Perl 编程 基础用法

    Perl 编程 标准头部写法 #!/usr/bin/perl -w # 标准的头部写法,-w意为显示警告 变量 $a=$b+10 # $a和$b都不需要定义,拿过来就用 Note: $flag=0 如 ...