box.stat.vinyl()
Показывает активность движка хранения vinyl, например
box.stat.vinyl().tx содержит количество коммитов и откатов.
Пример:
tarantool> box.stat.vinyl().tx.commit -- one item of the vinyl table---- 1047632...
Поскольку vinyl является дисковым движком хранения (в отличие от memtx, который является движком хранения в оперативной памяти), он может обрабатывать большие базы данных — но если база данных превышает объем памяти, выделенной для vinyl, дисковая активность возрастает.
-
box.stat.vinyl().disk.dataиbox.stat.vinyl().disk.index— объем данных, записанных в файлы в подкаталоге vinyl_dir, с именами вида{lsn}.runи{lsn}.index. Размер run-файла связан с выводомscheduler.dump_*. -
box.stat.vinyl().disk.data_compacted— суммарный размер данных, хранящихся на последнем уровне LSM-дерева, в байтах, без учета сжатия на диске. Это значение можно рассматривать как размер дискового пространства, которое занимали бы пользовательские данные при отсутствии сжатия, индексации и увеличения объема, вызванного структурой LSM-дерева.
Хотя движок хранения vinyl не является «in-memory», Tarantool требуется память для буферов записи и кэшей:
-
box.stat.vinyl().memory.tuple_cache— размер памяти (в байтах), занимаемой кортежами, хранящимися в кэше. -
box.stat.vinyl().memory.tuple— размер памяти (в байтах), занимаемой всеми выделенными кортежами. Включает кэшированные кортежи и кортежи, на которые есть ссылки в Lua. -
box.stat.vinyl().memory.tx— транзакционная память. Обычно это значение равно 0. -
box.stat.vinyl().memory.level0— область памяти «level0» (иногда сокращенно «L0»), которую vinyl может использовать для хранения LSM-дерева в оперативной памяти.
Поэтому можно сказать, что «L0 заполняется», когда значение в
memory.level0 приближается к максимуму, которым является
regulator.dump_watermark.
Ожидается, что «L0 = 0» сразу после дампа.
box.stat.vinyl().memory.page_index и
box.stat.vinyl().memory.bloom_filter показывают текущий объем,
используемый для структур, связанных с индексами. Размер зависит от
количества и размера ключей, а также от параметров
vinyl_page_size и
vinyl_bloom_fpr. Это не количество
«попаданий» фильтра Блума (число операций чтения, которые удалось
избежать, поскольку фильтр Блума предсказал их наличие в run-файле) —
эта статистика доступна в
index_object:stat().
Регулятор vinyl определяет, когда выполнять или откладывать операции дискового ввода-вывода, группируя активность в пакеты для обеспечения согласованности и эффективности. Регулятор вызывается планировщиком vinyl раз в секунду и обновляет связанные переменные при каждом вызове.
-
box.stat.vinyl().regulator.dump_bandwidth— оценочная средняя скорость выполнения дампов. Изначально это значение равно 10485760 (10 мегабайт в секунду). Для оценки используются только значительные дампы (более одного мегабайта). -
box.stat.vinyl().regulator.dump_watermark— порог, при достижении которого необходимо выполнить дамп. Значение немного меньше объема памяти, выделенного для деревьев vinyl, который задается параметром vinyl_memory. -
box.stat.vinyl().regulator.write_rate— фактическая средняя скорость недавних операций записи на диск. Усреднение выполняется за 5-секундное окно, поэтому если в течение 5 секунд не было активности, тоregulator.write_rate = 0. Значениеwrite_rateможет снижаться во время выполнения дампа или если пользователем задан параметр snap_io_rate_limit. -
box.stat.vinyl().regulator.rate_limit— ограничение скорости записи, в байтах в секунду, накладываемое на транзакции регулятором на основе наблюдаемой производительности дампа/компактизации. -
box.stat.vinyl().regulator.blocked_writers— количество файберов, заблокированных в ожидании квоты на память L0 vinyl.
Здесь содержатся в основном счетчики, связанные с задачами, которые планировщик подготовил для дампа или компактизации (большинство этих значений сбрасывается в 0 при перезапуске сервера или при вызове box.stat.reset()):
-
box.stat.vinyl().scheduler.compaction_*— объем данных из недавних изменений, которые были скомпактированы. Делится наscheduler.compaction_input(объем, подвергаемый компактизации),scheduler.compaction_queue(объем, ожидающий компактизации),scheduler.compaction_time(общее время, затраченное всеми рабочими потоками на компактизацию, в секундах) иscheduler.compaction_output(объем, подвергшийся компактизации, предположительно меньший, чемscheduler.compaction_input). -
box.stat.vinyl().scheduler.tasks_*— информация о задачах дампа/компактизации в трех категориях:scheduler.tasks_inprogress(выполняемые в данный момент),scheduler.tasks_completed(успешно завершенные) иscheduler.tasks_failed(прерванные из-за ошибок). -
box.stat.vinyl().scheduler.dump_*— объем данных из недавних изменений, которые были выгружены в дамп, включаяdump_time(общее время, затраченное всеми рабочими потоками на выполнение дампов, в секундах),dump_count(количество завершенных дампов),dump_inputиdump_output.Понятие «дамп» описано в разделе Storing data with vinyl:
Рано или поздно количество элементов в LSM-дереве превышает размер L0, после чего L0 записывается в файл на диске (называемый «run»), а затем очищается для хранения новых элементов. Эта операция называется «дампом».
Таким образом, можно предсказать, что дамп произойдет, если размер L0 (который отображается в memory.level0) приближается к максимуму (которым является regulator.dump_watermark) и дамп еще не выполняется. На практике Tarantool старается организовать дамп до достижения этого жесткого ограничения.
Дамп также происходит во время операции snapshot.
Здесь содержится информация о запросах, влияющих на транзакционную активность («tx» здесь — сокращение от «transaction»):
box.stat.vinyl().tx.conflict— количество конфликтов, приведших к откату транзакции.box.stat.vinyl().tx.commit— количество коммитов (успешных завершений транзакций). Включает неявные коммиты — например, любая операция вставки вызывает коммит, если она не находится внутри блока begin-end.box.stat.vinyl().tx.rollback— количество откатов (неуспешных завершений транзакций). Это не только количество явных запросов box.rollback() — сюда также входят запросы, завершившиеся ошибками. Например, после попытки выполнения запроса на вставку, вызвавшей ошибку «Duplicate key exists in unique index», значениеtx.rollbackувеличивается.box.stat.vinyl().tx.statements— обычно это значение равно 0.box.stat.vinyl().tx.transactions— количество транзакций, выполняемых в данный момент.box.stat.vinyl().tx.gap_locks— количество активных блокировок интервалов (gap locks) во время выполнения запроса. Описание реализации блокировки интервалов в Tarantool на низком уровне см. в Gap locks in Vinyl transaction manager.box.stat.vinyl().tx.read_views— показывает, перешла ли транзакция в состояние только для чтения, чтобы временно избежать конфликта. Обычно это значение равно 0.