Версия:

Вложенный модуль box.slab

Вложенный модуль 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.

Данный отчет используется для оценки риска нехватки памяти: риск высокий, если высоки значения и arena_used_ratio, и quota_used_ratio (90-95%).

Если значение quota_used_ratio низкое, то высокое значение arena_used_ratio и/или items_used_ratio указывает на низкую фрагментацию памяти (т.е. память используется эффективно).

Если значение quota_used_ratio высокое (достигает 100%), то низкое значение arena_used_ratio (50-60%) указывает на значительную фрагментацию памяти. Весьма вероятно, что в данном случае непосредственного риска нехватки памяти нет, но такую проблему следует тщательно рассмотреть. Например, есть риск того, что вся квота памяти используется на кортежи, а для части индекса slab’ов нет. Или все slab’ы выделены на хранение кортежей, а в действительности все они наполовину пусты.

возвращается:
  • items_size – это общий объем памяти (включая выделенные, но в данный момент свободные slab’ы), который используется только для кортежей, а не для индексов;
  • items_used_ratio = items_used / slab_count * slab_size (это slab’ы, которые используются только для кортежей, не для индексов);
  • 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().