Всем привет!
Смотрим сейчас tarantool для наших задачек. В данный момент используем редис. По размеру данных подходим к пределам одного сервера.
В тарантул нравится понятная (внешне) master-master репликация с приемлемым резолвом конфликтов и заявленное наличие on-disk хранилища.
Шардированием заниматься лень, т.к. нагрузка на базу вполне исполнима на дисковом хранилище (порядка 1000 записей в сек, и 100 чтений). А шарды увеличивают энтропию сервиса :)
Среда:
ОС: FreeBSD 10.3-RELEASE-p5 #0 r301414
Tarantool из портов.
Tarantool 1.7.3-99-gca4b9c0
Target: FreeBSD-amd64-Rel
Build options: cmake . -DCMAKE_INSTALL_PREFIX=/usr/local -DENABLE_BACKTRACE=OFF
Compiler: /usr/bin/cc /usr/bin/c++
C_FLAGS:-O2 -pipe -fstack-protector -fno-strict-aliasing -Wno-unknown-pragmas -fexceptions -funwind-tables -fno-common -std=c11 -Wall -Wextra -Wno-strict-aliasing -Wno-unused-value
CXX_FLAGS:-O2 -pipe -fstack-protector -fno-strict-aliasing -Wno-unknown-pragmas -fexceptions -funwind-tables -fno-common -std=c++11 -Wall -Wextra -Wno-strict-aliasing -Wno-unused-value
Создаем space:
box.schema.create_space('private_disk2', {engine = 'vinyl'})
Создаем индекс:
box.space.private_disk2:create_index('primary', {parts = {1, 'unsigned'}})
Конфигурация такая:
# echo "box.cfg" | tarantoolctl eval private_disk
---
- snapshot_count: 3
too_long_threshold: 0.5
slab_alloc_factor: 1.06
slab_alloc_minimal: 16
background: true
logger: /var/log/tarantool/private_disk.log
readahead: 16320
wal_dir: /var/db/tarantool/private_disk
listen: public_addr:3301
vinyl:
page_size: 8192
memory_limit: 1
compact_wm: 2
threads: 1
range_size: 1073741824
logger_nonblock: true
vinyl_dir: /var/db/tarantool/private_disk
snap_dir: /var/db/tarantool/private_disk
coredump: false
read_only: false
log_level: 5
slab_alloc_maximal: 52428800
wal_mode: write
hot_standby: false
panic_on_snap_error: true
panic_on_wal_error: true
slab_alloc_arena: 5
snapshot_period: 86400
pid_file: /var/run/tarantool/private_disk.pid
username: tarantool
rows_per_wal: 5000000
wal_dir_rescan_delay: 2
Когда я смотрел memtx, то полный набор моих данных из порядка 120 миллионов умещался в 60Гб.
Пытаюсь заливать свои данные в vinyl.
Где-то на 28 миллионах вставленных записей процесс tarantool потребляет 50Гб оперативной памяти. Дальше тест проводить смысла нет.
По ходу заливки и выделения памяти, было видно, что SIZE примерно равен RES + slab_alloc_maximal, откуда можно сделать вывод, что память выделяется отдельно от арены.
Увидел волшебный параметр vinyl.memory_limit. Пошел на github искать, как он используется.
Но либо я плохо искал, либо он только в vy_conf зачитывается в vinyl.c, но дальше никак не используется.
Искал так:
Собственно, вопросы:
1. Как так получается, что потребление памяти при vinyl выше, чем при использовании memtx?
2. На что vinyl потребляет память?
3. Почему он потребляет существенно больше фактического объема данных?
4. Как ограничить потребление оперативной памяти vinyl?
5. Учитывая то, что затык произошел в самом начале просто на первичном заливании данных, может быть я что-то сделал не так? Как понять? Ведь оно же как-то проходило тестирование перед релизом? :)
Заранее спасибо за ответы.
Эльдар Ко.