ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis - 适配全国产操作系统的那些坑

2021-05-31 17:06:04  阅读:223  来源: 互联网

标签:jemalloc 操作系统 适配 Redis 编译 内存 libatomic JEMALLOC 字节


文章目录


在这里插入图片描述


概述

简明扼要,本文主要分析及解决以下两个问题

  1. 因操作系统缺少基础的动态库,比如libatomic 引起的编译和运行失败
  2. 因操作系统PAGE SIZE差异,导致的启动报错 [jemalloc] unsupported system page size

JEMALLOC

我们先看JEMALLOC

JEMALLOC是什么呢?

github: https://github.com/jemalloc/jemalloc

jemalloc is a general purpose malloc(3) implementation that emphasizes fragmentation avoidance and scalable concurrency support

通俗来说,也是内存管理算法, 但是在避免内存碎片与并发扩展要好

在这里插入图片描述

内存分配器ptmalloc,jemalloc,tcmalloc调研与对比


内存碎片

既然在jemalloc避免内存碎片与并发扩展要好, 那什么是内存碎片呢?

假设一个简单的玩具示例,你有10个字节的内存:

 |   |   |   |   |   |   |   |   |   |   |
 0   1   2   3   4   5   6   7   8   9

现在让我们分配三个三字节块,名称A,B和C:

 | A | A | A | B | B | B | C | C | C |   |
 0   1   2   3   4   5   6   7   8   9

现在解除分配块B:

 | A | A | A |   |   |   | C | C | C |   |
 0   1   2   3   4   5   6   7   8   9

现在如果我们尝试分配一个四字节的块D会发生什么?

虽然内存空间里有四个字节的内存空闲,但没有四个连续的内存字节,所以不能分配D!同时,也不能移动C来腾出空间,因为程序中的某些变量很可能指向C,所以我们无法自动查找和更改所有这些值。

在这里插入图片描述


Redis 中的 Jemalloc

Redis在2.4及2.4以后的版本中,内存管理默认使用Facebook开源的jemalloc

我们从源码中的Makefile文件可以看到
在这里插入图片描述

ifeq ($(uname_S),Linux)
  ifneq ($(FORCE_LIBC_MALLOC),yes)
    USE_JEMALLOC=yes
  endif
endif

如果是Linux操作系统,且没有强制使用GLIBC , 则使用JEMALLOC

你如果找2.4.0之前版本的MakeFile ,是没有这个逻辑的。

在这里插入图片描述


libatomic 缺失,引起的编译失败

运行时动态库的搜索路径的先后顺序是:

  • 1)编译目标代码时指定的动态库搜索路径;
  • 2)环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
  • 3)配置文件/etc/ld.so.conf中指定的动态库搜索路径;
  • 4)默认的动态库搜索路径/lib和/usr/lib;

5.0.8 及 5.0.8以后的版本中,redis源码中的Makefile ,增加了这么一段逻辑

在这里插入图片描述

ARM架构(V8 ,V6)下 ,使用libatomic。

那怎么解决呢?

如果必须使用,则需要将对应的 rpm包安装以后, /usr/lib64建立软连接

在这里插入图片描述

然后,make distclean 后再 make

在这里插入图片描述

5.0.7 及 5.0.7 一下版本,未使用到

在这里插入图片描述


[jemalloc] unsupported system page size

3个常见的页大小

  • 4096 4k
  • 16384 16K
  • 65536 64k

4K环境上编译的,无法在16和64上运行,
反之可以。

为避免出问题,建议统一在64K的 机器上编译

getconf PAGESIZE 可查看页大小

在这里插入图片描述


扩展

Google TCMalloc:Thread-Caching Malloc

https://github.com/google/tcmalloc


小结
  • 作为基础库的ptmalloc是最为稳定的内存管理器,无论在什么环境下都能适应,但是分配效率相对较低。
  • tcmalloc针对多核情况有所优化,性能有所提高,但是内存占用稍高,大内存分配容易出现CPU飙升。
  • jemalloc的内存占用更高,但是在多核多线程下的表现也最为优异。

在这里插入图片描述


标签:jemalloc,操作系统,适配,Redis,编译,内存,libatomic,JEMALLOC,字节
来源: https://blog.51cto.com/u_15239532/2835952

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有