Redis中的zmalloc

Redis中zmalloc对内存分配函数进行封装,允许按配置使用tcmalloc,jemalloc等快速、内存使用率高的库,并支持统计内存使用率。

tcmalloc是google perftool的一部分,与一般的内存池不同,它直接与os打交道,内存闲置时os会进行回收(stl内存池就不回收),同时使用TLS(Thread local storage)管理内存池,避免一个线程内分配内存都要同步。

jemalloc与tcmalloc相似,作者Jason Evans是Free BSD开发人员,性能与使用率与tcmalloc不相伯仲。tcmalloc更方便与google perftool集成,进行性能评测。

Redis从2.4开始集成jemalloc。

zmalloc.h中有一个宏是HAVE_MALLOC_SIZE,即:使用tcmalloc,jemalloc,或apple系统可以通过调用函数malloc_size(p)直接获得指针p的实际分配大小。

如果使用glibc的malloc,则redis在每个内存块上增加一个size_t大小的size,从而也可以拿到指针对应分配内存的大小,这样在free时可以知道使用内存的大小变化。

zmalloc_used_memory获取redis使用内存大小,zmalloc_get_rss得到占用的rss总大小(一般从/proc/$pid/stat中获取),二者相除就是使用率即zmalloc_get_fragmentation_ratio的返回值。

还有一个函数是zmalloc_get_private_dirty,这是进程fork之后子进程多占用的内存,从/proc/self/smaps中读取Private_Dirty字段的值。这里要说一下Private_Dirty和Private_Clean,进程fork之后,开始内存是共享的,即从父进程那里继承的内存空间都是Private_Clean,运行一段时间之后,子进程对继承的内存空间做了修改,这部分内存就不能与父进程共享了,需要多占用,这部分就是Private_Dirty。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值