Невозможно установить activedefrag yes на сервере Redis
У меня есть кластер Redis, коэффициент фрагментации памяти которого постоянно составляет около 2.
Я пытался включитьactivedefrag
запустивCONFIG SET activedefrag yes
вredis-cli
, но я получил сообщение об ошибке:
(ошибка) ERR Неверный аргумент «да» для CONFIG SET «activedefrag» — активную дефрагментацию невозможно включить: для этого требуется сервер Redis, скомпилированный с модифицированным Jemalloc, подобный тому, который по умолчанию поставляется с исходным кодом Redis.
Пакет redis-server, поставляемый с Ubuntu 22.04, имеет версию 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
image, и здесь настройка работает, и строка версии выглядит практически идентично.
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 скомпилирован с модифицированным jemalloc, с ним работает конфиг activedefrag. Это кажется наиболее многообещающим вариантом, поскольку обновления будут обрабатываться автоматически вместе с регулярными обновлениями системы. Далее я попробую переключиться с пакета Ubuntu на него.