Вложенный модуль box.slab
Вложенный модуль box.slab
предоставляет доступ к статистике распределения slab. Механизм распределения slab представляет собой основной тип распределения для хранения кортежей. Такое распределение можно использовать для отслеживания использования памяти и фрагментации памяти.
Ниже приведен перечень всех функций модуля box.slab
.
Имя | Использование |
---|---|
box.runtime.info() | Отображение отчета по использованию памяти во время исполнения Lua-кода |
box.slab.info() | Отображение обобщенного отчета по использованию памяти для распределения slab |
box.slab.stats() | Отображение подробного отчета по использованию памяти для распределения slab |
-
box.runtime.
info
() Отображение отчета по использованию памяти (в байтах) во время исполнения Lua-кода.
возвращается: lua
– это размер динамической памяти сборщика мусора в Lua;maxalloc
– это максимальная квота памяти, которую можно выделить для Lua;used
– объем памяти, используемый Lua в данный момент.
тип возвращаемого значения: таблица
Пример:
tarantool> box.runtime.info() --- - lua: 913710 maxalloc: 4398046510080 used: 12582912 ... tarantool> box.runtime.info().used --- - used: 12582912 ...
-
box.slab.
info
() Отображение обобщенного отчета по использованию памяти (в байтах) для распределения slab. Данный отчет используется для оценки риска нехватки памяти.
box.slab.info
выдает несколько показателей:- items_used_ratio
- arena_used_ratio
- quota_used_ratio
При мониторинге используемой памяти в memtx’е есть два возможных сценария:
1 сценарий: 0.5 <
items_used_ratio
< 0.9Очевидно, память сильно фрагментирована. Проверьте, сколько у вас классов slab, подсчитав количество различных классов с помощью
box.slab.stats()
. Если классов slab много (больше нескольких десятков), то память может закончиться, даже если её занято не так много. На каждом slab может быть использовано мало элементов. Но всякий раз при выделении кортежа, размер которого отличается от любого существующего класса, Tarantool’у может понадобиться новый slab из области распределения slab. И если осталось мало пустых slab, то произойдет попытка увеличения квоты, что, в свою очередь, может привести к ошибке нехватки памяти из-за низкой оставшейся квоты памяти.2 сценарий:
items_used_ratio
> 0.9Память заканчивается. Высокие показатели использования памяти. Память не фрагментирована, но каждый уровень механизма распределения slab почти пуст. Следует подумать об увеличении лимита памяти Tarantool’а (``box.cfg.memtx_memory`).
Вывод: основной показатель нехватки памяти –
quota_used_ratio
. Тем не менее, существует множество абсолютно стабильных установок с высоким показателемquota_used_ratio
, поэтому необходимо обращать на это внимание, когда два других показателя также высоки (arena и item used).возвращается: items_size
– это общий объем памяти (включая выделенные, но в данный момент свободные slab’ы), который используется только для кортежей, а не для индексов;items_used_ratio
=items_used
/items_size
, whereitems_size
=slab_count
*slab_size
(these are slabs used only for tuples, no indexes);quota_size
– максимальный объем памяти, который механизм распределения slab может использовать как для кортежей, так и для индексов (как настроено в параметре memtx_memory, по умолчанию 2^28 байтов = 268 435 456 байтов);quota_used_ratio
=quota_used
/quota_size
;arena_used_ratio
=arena_used
/arena_size
;items_used
– это эффективный объем памяти (не включая выделенные, но в данный момент свободные slab’ы), который используется только для кортежей, а не для индексов;quota_used
– это объем памяти, уже выделенный для распределения slab;arena_size
– это общий объем памяти, используемый для кортежей и индексов (включая выделенные, но в данный момент свободные slab’ы);arena_used
– это эффективный объем памяти, используемый для кортежей и индексов (не включая выделенные, но в данный момент свободные slab’ы).
тип возвращаемого значения: таблица
Пример:
tarantool> box.slab.info() --- - items_size: 228128 items_used_ratio: 1.8% quota_size: 1073741824 quota_used_ratio: 0.8% arena_used_ratio: 43.2% items_used: 4208 quota_used: 8388608 arena_size: 2325176 arena_used: 1003632 ... tarantool> box.slab.info().arena_used --- - 1003632 ...
-
box.slab.
stats
() Отображение подробного отчета об использовании памяти (в байтах) для распределения slab. Отчет разбивается на группы по размеру элементов данных, а также по размеру slab’а (64 байта, 136 байтов и т.д.). Отчет включает в себя информацию о памяти, выделенной на хранение и кортежей, и индексов.
возвращается: mem_free
– это выделенная, но не используемая в данный момент память;mem_used
– это память, используемая для хранения элементов данных (кортежей и индексов);item_count
– это количество хранимых элементов;item_size
– это размер каждого элемента данных;slab_count
– это количество выделенных slab’ов;slab_size
– это размер каждого выделенного slab’а.
тип возвращаемого значения: таблица
Пример:
Ниже представлен пример отчета для первой группы:
tarantool> box.slab.stats()[1] --- - mem_free: 16232 mem_used: 48 item_count: 2 item_size: 24 slab_count: 1 slab_size: 16384 ...
В отчете показано, что есть два элемента данных (
item_count
= 2), которые хранятся в одном (slab_count
= 1) 24-байтовом slab’е (item_size
= 24), поэтому объем используемой памятиmem_used
= 2 * 24 = 48 байтов. Кроме того, размер slab’аslab_size
составляет 16384 байта, из которых 16384 - 48 = 16232 байта свободны (mem_free
).В полном отчете будет статистика по использованию памяти во всех группах:
tarantool> box.slab.stats() --- - - mem_free: 16232 mem_used: 48 item_count: 2 item_size: 24 slab_count: 1 slab_size: 16384 - mem_free: 15720 mem_used: 560 item_count: 14 item_size: 40 slab_count: 1 slab_size: 16384 <...> - mem_free: 32472 mem_used: 192 item_count: 1 item_size: 192 slab_count: 1 slab_size: 32768 - mem_free: 1097624 mem_used: 999424 item_count: 61 item_size: 16384 slab_count: 1 slab_size: 2097152 ...
Общий объем используемой памяти
mem_used
для всех групп в данном отчете равенarena_used
в отчете box.slab.info().