Redis采用不同内存分配器碎片率对比

我们知道Redis并没有自己实现内存池,没有在标准的系统内存分配器上再加上自己的东西。所以系统内存分配器的性能及碎片率会对Redis造成一些性能上的影响。
在Redis的 zmalloc.c 源码中,我们可以看到如下代码:
48 / Explicitly override malloc/free etc when using tcmalloc. /
49 #if defined(USE_TCMALLOC)
50 #define malloc(size) tc_malloc(size)
51 #define calloc(count,size) tc_calloc(count,size)
52 #define realloc(ptr,size) tc_realloc(ptr,size)
53 #define free(ptr) tc_free(ptr)
54 #elif defined(USE_JEMALLOC)
55 #define malloc(size) je_malloc(size)
56 #define calloc(count,size) je_calloc(count,size)
57 #define realloc(ptr,size) je_realloc(ptr,size)
58 #define free(ptr) je_free(ptr)
59 #endif
从上面的代码中我们可以看到,Redis在编译时,会先判断是否使用tcmalloc,如果是,会用tcmalloc对应的函数替换掉标准的libc中的函数实现。其次会判断jemalloc是否使得,最后如果都没有使用才会用标准的libc中的内存管理函数。
而在最新的2.4.4版本中,jemalloc已经作为源码包的一部分包含在源码包中,所以可以直接被使用。而如果你要使用tcmalloc的话,是需要自己安装的。
下面简单说一下如何安装tcmalloc包,tcmalloc是google-proftools中的一部分,所以我们实际上需要安装google-proftools。如果你是在64位机器上进行安装,需要先安装其依赖的libunwind库。
wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
tar zxvf libunwind-0.99-alpha.tar.gz
cd libunwind-0.99-alpha/
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
然后再进行google-preftools的安装:
wget http://google-perftools.googlecode.com/files/google-perftools-1.8.1.tar.gz
tar zxvf google-perftools-1.8.1.tar.gz
cd google-perftools-1.8.1/
./configure –disable-cpu-profiler –disable-heap-profiler –disable-heap-checker –disable-debugalloc –enable-minimal
make && make install

sudo echo “/usr/local/lib” > /etc/ld.so.conf.d/usr_local_lib.conf #如果没有这个文件,自己建一个
sudo /sbin/ldconfig
然后再进行Redis的安装,在make时指定相应的参数以启用tcmalloc
$ curl -O http://redis.googlecode.com/files/redis-2.4.4.tar.gz
$ tar xzvf redis-2.4.4.tar.gz
$ cd redis-2.4.4
$ make USE_TCMALLOC=yes FORCE_LIBC_MALLOC=yes
$ sudo make install
再启动Redis后通过info命令就能看到使用的内存分配器了。
下面回到本文的主题,对于tcmalloc,jemalloc和libc对应的三个内存分配器。其性能和碎片率如何呢?下面是一个简单测试结果,使用Redis自带的redis-benchmark写入等量数据进行测试,数据摘自采用不同分配器时Redis info信息。我们可以看到,采用tcmalloc时碎片率是最低的,为1.01,jemalloc为1.02,而libc的分配器碎片率为1.31,如下所未:
used_memory:708391440
used_menory_human:675.57M
used_memory_rss:715169792
used_memory_peak:708814040
used_memory_peak_human:675.98M
mem_fragmentation_ratio:1.01
mem_allocator:tcmalloc-1.7
used_memory:708381168
used_menory_human:675.56M
used_memory_rss:723587072
used_memory_peak:708803768
used_memory_peak_human:675.97M
mem_fragmentation_ratio:1.02
mem_allocator:jemalloc-2.2.1
used_memory:869000400
used_menory_human:828.74M
used_memory_rss:1136689152
used_memory_peak:868992208
used_memory_peak_human:828.74M
mem_fragmentation_ratio:1.31
mem_allocator:libc
上面的测试数据都是小数据,也就是说单条数据并不大,下面我们尝试设置benchmark的-d参数,将value值调整为1k大小,测试结果发生了一些变化:
used_memory:830573680
used_memory_human:792.10M
used_memory_rss:849068032
used_memory_peak:831436048
used_memory_peak_human:792.92M
mem_fragmentation_ratio:1.02
mem_allocator:tcmalloc-1.7
used_memory:915911024
used_memory_human:873.48M
used_memory_rss:927047680
used_memory_peak:916773392
used_memory_peak_human:874.30M
mem_fragmentation_ratio:1.01
mem_allocator:jemalloc-2.2.1
used_memory:771963304
used_memory_human:736.20M
used_memory_rss:800583680
used_memory_peak:772784056
used_memory_peak_human:736.98M
mem_fragmentation_ratio:1.04
mem_allocator:libc
可以看出,在分配大块内存和小块内存上,几种分配器的碎片率差距还是比较大的,大家在使用Redis的时候,还是尽量用自己真实的数据去做测试,以选择最适合自己数据的分配器。

Original: https://www.cnblogs.com/ylqmf/archive/2012/12/24/2830788.html
Author: tudou@NorthWind
Title: Redis采用不同内存分配器碎片率对比

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529402/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • npm常用命令

    npm install npm install=npm i。在git clone项目的时候,项目文件中并没有 node_modules文件夹,项目的依赖文件可能很大。直接执行,np…

    Linux 2023年6月13日
    0113
  • 什么是草台班子?

    有个朋友最近想跳槽,他对管理的兴趣不大,而且认为自己的性格也不适合做管理,更想成为技术专家。基于这些考虑,他希望能进入知名大厂,如果面试不顺利,去小而美公司也行。他的面试经验不多,…

    Linux 2023年6月6日
    0116
  • CentOS7.6 单用户模式下修改root密码

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0104
  • 《卡死你3000》批量修改被控机密码,秘钥

    批量生成密码之产生随机数: 默认产生16位大小写加数字密码 批量生成密码,并写入nodelist.csv: cs产生所有被控机旧密码并写入nodelist.ps1 运行这个脚本后,…

    Linux 2023年6月13日
    080
  • CPU架构对redis的性能影响

    CPU架构对redis的性能影响 主流CPU架构 一个CPU处理器中通常有多个运行核心,每一个运行核心称为一个物理核,每个物理核都可以运行应用程序。每个物理核都拥有 私有的一级缓存…

    Linux 2023年5月28日
    0114
  • CentOS通过Xshell连接密码错误

    环境:CentOS6.7虚拟机,Xshell7 问题说明:通过Xshell7进行远程登录时,一直提示密码错误。 问题分析排查过程: 1、开始以为是密码错了,经过SVN版本检查等未发…

    Linux 2023年5月28日
    0112
  • windows 使用挂载盘提供FTP服务

    环境说明: NFS服务器:centos7.0 IP:192.168.18.10 FTP服务器:windows server 2008 IP:192.168.18.41 准备工作: …

    Linux 2023年6月8日
    0174
  • jenkins pipeline中获取shell命令的输出

    //获取标准输出//第一种result = sh returnStdout: true ,script: ” Original: https://www.cnblogs…

    Linux 2023年5月28日
    094
  • Docker最常用的镜像命令和容器命令

    一、镜像相关命令 官方文档:https://docs.docker.com/referenc 1.1查看镜像 [root@localhost ~]# docker images R…

    Linux 2023年5月27日
    0107
  • mac redis安装与使用,连接远程服务器 redis

    brew install redis@6.2 #后面@接版本号可指定版本,也可以不指定版本 brew services start redis redis-cli redis-cl…

    Linux 2023年5月28日
    0105
  • 剑指offer计划19( 搜索与回溯算法中等)—java

    1.1、题目1 剑指 Offer 64. 求1+2+…+n 1.2、解法 这题看评论区真的绝了,都是人才,各个说话都好听,我看到个还有用异常来结束的就离谱。这题用了&a…

    Linux 2023年6月11日
    096
  • 对象缓存服务的思考和实现

    写在前面 目前在很多业务中,存储都大量的依赖了云存储,比如阿里云的 oss、华为云的 obs 等。但是如果有大量的上传/下载任务,云存储上的网络 I/0 就变成了一个很大的瓶颈。 …

    Linux 2023年6月14日
    099
  • Redis处理高并发 加锁

    在程序开发过程中,通常会遇到需要独占式的访问一些资源的情形,比如商品秒杀时扣减库存。这时就需要对资源加锁。实现锁的方式有很多,比如数据库锁、文件锁等等。本文简单介绍PHP中使用re…

    Linux 2023年5月28日
    089
  • Gumbel_Softmax 概要

    解决argmax不可导,无法进行反向传播的问题 出现的原因: argmax(x,y)不可导的根本原因是其向量空间不是光滑的,有尖锐的点和面;而是某些任务中,argmax会被插入到反…

    Linux 2023年6月7日
    0114
  • 插入排序算法C语言实现

    插入排序算法C语言实现 我写出来的排序算法用printf一步步解读,与google algorithm APP上模拟的单步执行不一致。 于是参考了https://www.cnblo…

    Linux 2023年6月14日
    0130
  • 宝塔配置vnc+wine实现Q群机器人

    图形界面必备 X Window System yum -y groupinstall "X Window System" 安装epel源 yum -y inst…

    Linux 2023年5月27日
    0103
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球