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。

你可能感兴趣的:(redis,内存,malloc,TCMALLOC,jemalloc,zm)