2019独角兽企业重金招聘Python工程师标准>>>

更好的内存管理-jemalloc

2011-05-31 11:23:23|  分类: 软件技术(杂)|字号 订阅

今年年初由于facebook而火起来的jemalloc广为人之,但殊不知,它在malloc界里面很早就出名了。Jemalloc的创始人Jason Evans也是在FreeBSD很有名的开发人员。此人就在2006年为提高低性能的malloc而写的jemalloc。Jemalloc是从2007年开始以FreeBSD标准引进来的。软件技术革新很多是FreeBSD发起的。在FreeBSD应用广泛的技术会慢慢导入到linux。

目前jemalloc在firefox中也在使用。在firefox2中出现了内存碎片问题之后,便在firefox3中使用了jemalloc。在safari和chrome中使用的是google的tcmalloc。

Jemalloc的技特性

Jemalloc聚集了malloc的使用过程中所验证的很多技术。忽略细节,从架构着眼,最出色的部分仍是arena和thread cache。(事实上,这两个与tcmalloc的架构几乎相同。Jemalloc only的部分将会在另一次posting中继续探讨。)

Arena

与其像malloc一样集中管理一整块内存,不如将其分成许多个小块来分而治之。此小块便称为arena。让我们想象一下,给几个小朋友一张大图纸,让他们随意地画点。结果可想而知,他们肯定相互顾忌对方而不敢肆意地画(synchronization),从而影响画图效率。但是如果老师事先在大图纸上划分好每个人的区域,小朋友们就可以又快又准地在各自地领域上画图。这样的概念就是arena。

Thread cache

如果是开辟小块内存,为使不参照arena而直接malloc,给各自的线程thread cache领域。此idea是google的tcmalloc的核心部分,亦在jemalloc中体现。

再拿上面的例子,这次给小朋友们除了一张大图纸外,再各自给A4纸一张。这样,小朋友们在不画大面积的点时,只在自己的A4纸上心情地画即可(no arena seeking)。可以在自己手上的纸上画或涂(using thread cache),完全不用顾忌别人(no synchronization, no locking),迅速有效地画。

下图是jemalloc的核心layout。看着复杂,其实都是上面说明的部分。

实际jemalloc的性能呢?

 

最左边的就是glibc的malloc,最右边的就是jemalloc。从图表上可以看出,jemalloc的性能有glibc的两倍以上。非常压倒性的性能差异。因此,使用了jemalloc的应用程序自然会快很多。Jemalloc旁边的就是tcmalloc。Tcmalloc的性能与其相差甚微,低jemalloc2.1.0慢4.5%。图上和tcmalloc的1.4版本,而如今它已经到了1.6版本,因此实际上这两者应该是不相仲伯的。Jemalloc的创始人jason evans也意识到这一点,说在cpu core 8以上的计算机上jemalloc效率更高。

程序的最后的免午餐 – kth分布式技术lab      

2005年发表了一篇文章“免费午餐的时代结束了”。在之前,程序就算不用费脑子,随着cpu时钟速度增加,程序性能自己就会上去。但现在不同,现在cpu时钟趋于稳定,而核数不断地增加。程序员需要适应这样的多线程多进程的环境,并要开发出适合的程序。文章讲的大概是这样的内容。

6年之后的如今,这篇文章完全变成现实了。事实上cpu时钟停留在3GHz,而核不断上升。现在程序要适应多线程多进程的分布式计算,速度才能上升。但是这样的程序很难。

现在在多线程的环境下,给程序员们的最后一道午餐便是tcmalloc,jemalloc这样的malloc library。对于使用多线程的程序而言,性能会提高数十%。

共享一下我本人的经验。我本人在kth技术研究所分布式技术lab中承担iLock(分布式同步工具,请参考google的chubby)。在iLock中用了google的tcmalloc的结果,性能提升了18~22%。

最大的优点就是你不需要做任何复杂的工作便可得到这样的效果。不需要代码重编译。只需在执行二进制之前,在cmd窗口中输入

$ LD_PRELOAD=”tcmalloc所设置的文件夹/libtcmalloc.so”

这样在之后执行的应用程序会使用tcmalloc或jemalloc,从而代替glibc标准malloc(ptmalloc)。这需设置此处,我们便可得到性能20%的提升,这真可谓是送给我们的最后的免费午餐。

如今,在分布式技术lab中使用google的tcmalloc。原因在于性能上两者差不多,但google的tcmalloc所提供的程序分析工具非常(heap profiler, cpu profiler)丰富。所以tcmalloc可能更方便一些。

一定要使用最新的malloc?一定要的!

转载于:https://my.oschina.net/u/1388024/blog/174525

更好的内存管理-jemalloc (redis 默认使用的)相关推荐

  1. C++智能指针:更简单、更高效的内存管理方法

    C++智能指针:从新手到高手的心理密码C++ Smart Pointers: Psychological Passcodes from Beginner to Expert 智能指针简介 (Intro ...

  2. redis 缓存过期默认时间_Redis 过期时间与内存管理

    http://www.redis.cn/commands/expire.html http://www.redis.cn/topics/lru-cache.html 内存管理 当 Redis 作为缓存 ...

  3. redis lua 设置过期_详解 Redis 内存管理机制和实现

    Redis是一个基于内存的键值数据库,其内存管理是非常重要的.本文内存管理的内容包括:过期键的懒性删除和过期删除以及内存溢出控制策略. 最大内存限制 Redis使用 maxmemory 参数限制最大可 ...

  4. redis 数据结构 内存管理 持久化

    为什么80%的码农都做不了架构师?>>>    Redis 内存数据结构与编码 OBJECT encoding key.DEBUG OBJECT key 简单动态字符串(simple ...

  5. Redis 数据结构与内存管理策略(上)

    Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

  6. c# redis 如何设置过期时间_Redis 过期时间与内存管理

    http://www.redis.cn/commands/expire.html http://www.redis.cn/topics/lru-cache.html 内存管理 当 Redis 作为缓存 ...

  7. Spark源码分析之九:内存管理模型

    Spark是现在很流行的一个基于内存的分布式计算框架,既然是基于内存,那么自然而然的,内存的管理就是Spark存储管理的重中之重了.那么,Spark究竟采用什么样的内存管理模型呢?本文就为大家揭开Sp ...

  8. FreeRTOS高级篇7---FreeRTOS内存管理分析

    内存管理对应用程序和操作系统来说都非常重要.现在很多的程序漏洞和运行崩溃都和内存分配使用错误有关.         FreeRTOS操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理 ...

  9. multiprocessing.manager管理的对象需要加锁吗_iOS内存管理布局-理论篇

    苹果设备备受欢迎的背后离不开iOS优秀的内存管理机制,那iOS的内存布局及管理方案是怎样的呢?我们一起研究下. 内存管理分为五大块 栈区(stack):线性结构,内存连续,系统自己管理内存,程序运行记 ...

最新文章

  1. Struts2 验证规则配置文件
  2. 电脑新安装JDK版本并运行使用该JDK版本问题
  3. 【转】mysql-status和variables区别
  4. Ubuntu关闭anaconda自动进入base虚拟环境
  5. svd降维 python案例_PCA降维的原理、方法、以及python实现。
  6. TCP/UDP网络性能测试工具 - Netperf (zz) ..网络测试工具
  7. NYOJ 10 skiing
  8. 前端学习(3025):vue+element今日头条管理-侧边导航菜单
  9. AI应用开发基础傻瓜书系列目录
  10. 关于Java成员变量、局部变量、方法,在JVM的内存空间分配
  11. Apex 获取真正的IP地址
  12. 以前积攒的一个用Java程序生成验证码的代码
  13. ​十大骨传导耳机品牌,骨传导耳机推荐跑步用
  14. Firefox downloadhelper 视频下载助手
  15. 草图大师SketchUp pro 2018中文版
  16. sql server 2005 修改表的模式 schema 为dbo
  17. 快讯分类_如何从Google快讯创建RSS Feed
  18. linux 命令详解 大于号_Linux 命令出现号(大于号)如何退出[组图]
  19. EDM初级:什么是EDM邮件营销?EDM营销的定义
  20. 在线一键重装Win11系统步骤

热门文章

  1. java round number,Java Number Math 类
  2. linux 26,Linux常用26条命令
  3. 对比测试LM358, LMV358双运放基本参数,测试之后发现是假货
  4. 无线节能信标调试说明-2021-3-3
  5. C翻译汇编语言,[求助]求人帮忙把汇编语言程序翻译成C或者C++
  6. java线程条件变量_多线程同步条件变量(转载)
  7. python无法处理特别大的数据文件_Python实现快速大文件比较代码解析
  8. java访问手机里的通讯录,访问手机通讯录(示例代码)
  9. java保存不了_在使用Java写入文件时,文件不能保存在文件夹中
  10. 未设置服务器核心文件,[问题3] dhcpd.conf是DHCP服务器的配置的核心,每次启动DH..._考试资料网...