Redis2.6之后 默认使用 jemalloc 作为内存分配器来提升内存管理性能。
出现这个报错的原因是:
默认情况下,Redis 的构建系统(Makefile)并不会自动使用这个内置的 jemalloc,而是优先尝试使用系统的 jemalloc,如果系统没有jemalloc就会报这个错。
Redis构建系统的行为逻辑:
Redis 的 Makefile 在决定使用哪种内存分配器时,大致按以下顺序判断:
-
是否设置了
MALLOC=xxx环境变量? -
如果没有,尝试检测系统是否安装了 jemalloc
-
如果检测到:就用系统的 jemalloc,并定义宏
USE_JEMALLOC -
如果没检测到:才使用内置的
deps/jemalloc
-
-
如果都不行,回退到
libc malloc
但由于检测机制不完善,有时会“误判”——即使你没装系统 jemalloc,它也以为你装了,于是尝试包含头文件,结果失败。
解决方法:
由于redis源码中自带了jemalloc在目录deps/中,所以我们可以强制使用Redis内置的jemalloc
步骤:
进入redis源码目录中运行make MALLOC=libc(如果你查过相关的资料会发现这个其实是指定使用系统的malloc但是我们现在要用的是jemalloc)
Redis 的构建系统有一个“隐藏逻辑”:
-
当你指定
MALLOC=libc时,Redis 会跳过对系统 jemalloc 的检测。 -
然后它会自动启用 内置的 jemalloc(来自
deps/jemalloc),而不是真的用libc malloc!
这是 Redis 官方的一种“绕过检测”的技巧。



366

被折叠的 条评论
为什么被折叠?



