我有一个 Redis 集群,其内存碎片率始终保持在 2 左右。
我尝试activedefrag
通过运行CONFIG SET activedefrag yes
来启用redis-cli
,但收到错误消息:
(错误)ERR CONFIG SET‘activedefrag’的参数‘yes’无效 - 无法启用主动碎片整理:它需要一个使用修改后的 Jemalloc 编译的 Redis 服务器,就像 Redis 源分发版默认附带的服务器一样
Ubuntu 22.04 附带的 redis-server 软件包是 6.0,版本字符串看起来像是使用 jemalloc 编译的。
# redis-server --version
Redis server v=6.0.16 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=a3fdef44459b3ad6
ldd 确认它与 libjemalloc 链接。
# ldd `which redis-server`
...
libjemalloc.so.2 => /lib/x86_64-linux-gnu/libjemalloc.so.2 (0x00007f0428b26000)
在配置文件中设置选项时,redis-server 无法启动,并显示类似的错误消息。
我是否遗漏了某些选项,或者我是否需要自己编译 Redis 才能使用碎片整理?我找不到任何配置选项“启用” jemalloc。
答案1
我使用官方redis:6.0
镜像启动了一个 docker 容器,这里的设置有效,并且版本字符串看起来基本相同。
root@42613c835e31:/data# redis-server --version
Redis server v=6.0.19 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=3aa1eb72f68fbe5e
root@42613c835e31:/data# redis-cli
127.0.0.1:6379> CONFIG SET activedefrag yes
OK
但ldd
显示它没有链接到 jemalloc 库:
root@42613c835e31:/data# ldd `which redis-server`
linux-vdso.so.1 (0x00007ffe4a9a2000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5b6aa41000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5b6aa3b000)
libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f5b6a9a8000)
libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f5b6a6b3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5b6a691000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5b6a4bd000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5b6afa2000)
Ubuntu 软件包似乎没有编译所需的修改的jemalloc 库,但使用 Ubuntu 默认库。
所以我目前看到的唯一选择是:
- 使用 Docker Redis 容器镜像
- 自己编译 Redis
- 使用Redis APT 存储库
Redis repo 中的软件包是使用修改后的 jemalloc 编译的,activedefrag 配置可与其配合使用。这似乎是最有希望的选项,因为更新将通过常规系统更新自动处理。接下来我将尝试从 Ubuntu 软件包切换到它。