Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Просмотр состояния сервера

Использование Tarantool в качестве клиента

Tarantool входит в интерактивный режим, если:

В этом режиме выводится приглашение командной строки (например, "tarantool>") - и вы можете вводить запросы. При таком использовании Tarantool может выступать клиентом для удаленного сервера, примеры приведены в Руководстве для начинающих.

Тот же интерактивный режим доступен через команду connect утилиты tt.

Выполнение кода на экземпляре Tarantool

С помощью утилиты tt можно подключиться к административной консоли экземпляра и выполнить код на Lua:

$ # для локальных экземпляров:$ tt connect my_app   • Connecting to the instance...   • Connected to /var/run/tarantool/example.control/var/run/tarantool/my_app.control> 1 + 1-–-- 2.../var/run/tarantool/my_app.control>$ # для локальных и удаленных экземпляров:$ tt connect username:password@127.0.0.1:3306

Утилиту tt также можно использовать для выполнения Lua-кода на экземпляре без подключения к его административной консоли:

$ # выполнение команд напрямую из командной строки$ <command> | tt connect my_app -f -<...>$ # - ИЛИ -$ # выполнение команд из файла со скриптами$ tt connect my_app -f script.lua<...>

Проверка состояния экземпляра

Чтобы проверить статус экземпляра, выполните:

$ tt status my_app$ # - ИЛИ -$ systemctl status tarantool@my_app

Чтобы проверить журнал загрузки в системах с systemd, выполните:

$ journalctl -u tarantool@my_app -n 5

Для более детальных проверок используйте отчеты, предоставляемые функциями из следующих подмодулей:

  • box_cfg - проверка и задание всех параметров конфигурации для сервера Tarantool.
  • box_slab - мониторинг общего использования и фрагментации памяти, выделенной для хранения данных в Tarantool.
  • box_info - анализ переменных сервера Tarantool, в первую очередь связанных с репликацией.
  • box_stat - анализ статистики запросов и сети Tarantool.

Также доступна библиотека metrics, которая собирает метрики (например, использования памяти или количества запросов) из приложений Tarantool и предоставляет их через различные протоколы, включая Prometheus. Подробнее см. в разделе Мониторинг.

Пример

Администраторам часто требуется вызывать функцию slab_info, которая показывает подробную статистику использования памяти для конкретного экземпляра Tarantool.

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 использует память операционной системы для хранения данных. Чтобы проверить объем используемой памяти, выполните команду (в Linux):

ps -eo args,%mem | grep "tarantool"

Tarantool почти никогда не возвращает эту память операционной системе, даже если пользователь удалит все вставленные данные или вызовет сборщик мусора Lua (collectgarbage) для уменьшения фрагментации.

Как правило, это не влияет на производительность. Однако, чтобы принудительно освободить память, можно вызвать функцию box.snapshot(), остановить экземпляр и перезапустить его.

Анализ трафика

Для упрощения анализа бинарного трафика Tarantool используйте плагин для Wireshark.

Чтобы включить плагин, выполните следующие шаги:

  1. Склонируйте репозиторий tarantool-dissector:

    git clone https://github.com/tarantool/tarantool-dissector.git
  2. Скопируйте или создайте символические ссылки на файлы плагина в директории плагинов Wireshark:

    mkdir -p ~/.local/lib/wireshark/pluginscd ~/.local/lib/wireshark/pluginsln -s /path/to/tarantool-dissector/MessagePack.lua ./ln -s /path/to/tarantool-dissector/tarantool.dissector.lua ./

    (Расположение директории плагинов в macOS и Windows см. в разделе Plugin folders документации Wireshark.)

  3. Запустите графический интерфейс Wireshark и убедитесь, что плагины загружены:

    • Откройте Help > About Wireshark > Plugins.
    • Найдите MessagePack.lua и tarantool.dissector.lua в списке.

Теперь входящие и исходящие пакеты Tarantool можно анализировать с помощью аннотаций.

Подробности см. на странице проекта:.

Анализ профиля производительности

Tarantool может замедляться по нескольким причинам: проблемы с диском, Lua-скрипты, активно использующие процессор, или неправильная настройка. В таких случаях в журнале Tarantool может не хватать подробностей, и единственным признаком проблемы часто бывают записи вида W> too long DELETE: 8.546 sec. Ниже приведены инструменты и приемы для снятия профиля производительности и диагностики замедлений.

fiber.info()

Проще всего снять профиль производительности с помощью встроенных функций Tarantool. Функция fiber.info() возвращает информацию обо всех работающих файберах с соответствующей трассировкой стека (stack trace) для языка C. Эти данные показывают, сколько файберов запущенно в данный момент и какие функции, написанные на C, вызываются чаще всего.

Войдите в интерактивную административную консоль вашего экземпляра Tarantool:

$ tt connect NAME|URI

После этого загрузите модуль fiber:

tarantool> fiber = require('fiber')

Теперь можно получить необходимую информацию с помощью функции fiber.info().

В консоли должно появиться следующее:

tarantool> fiber = require('fiber')-–-...tarantool> fiber.info()-–-- 360:    csw: 2098165    backtrace:    - '#0 0x4d1b77 in wal_write(journal*, journal_entry*)+487'    - '#1 0x4bbf68 in txn_commit(txn*)+152'    - '#2 0x4bd5d8 in process_rw(request*, space*, tuple**)+136'    - '#3 0x4bed48 in box_process1+104'    - '#4 0x4d72f8 in lbox_replace+120'    - '#5 0x50f317 in lj_BC_FUNCC+52'    fid: 360    memory:      total: 61744      used: 480    name: main  129:    csw: 113    backtrace: []    fid: 129    memory:      total: 57648      used: 0    name: 'console/unix/:'...

Создаваемым файберам рекомендуется присваивать понятные имена, чтобы их можно было легко найти в списке, выводимом функцией fiber.info(). В примере ниже создается файбер с именем myworker:

tarantool> fiber = require('fiber')---...tarantool> f = fiber.create(function() while true do fiber.sleep(0.5) end end)---...tarantool> f:name('myworker') <!-- assigning the name to a fiber---...tarantool> fiber.info()---- 102:    csw: 14    backtrace:    - '#0 0x501a1a in fiber_yield_timeout+90'    - '#1 0x4f2008 in lbox_fiber_sleep+72'    - '#2 0x5112a7 in lj_BC_FUNCC+52'    fid: 102    memory:      total: 57656      used: 0    name: myworker <!-- newly created background fiber  101:    csw: 284    backtrace: []    fid: 101    memory:      total: 57656      used: 0    name: interactive...

Для принудительного завершения работы файбера используйте команду fiber.kill(fid):

tarantool> fiber.kill(102)---...tarantool> fiber.info()---- 101:    csw: 324    backtrace: []    fid: 101    memory:      total: 57656      used: 0    name: interactive...

Для получения таблицы всех рабочих файберов используйте функцию fiber.top().

Для динамического получения информации через функцию fiber.info(), используйте скрипт ниже. Скрипт каждые полсекунды подключается к экземпляру Tarantool, указанному в переменной NAME, выполняет fiber.info() и записывает результат в файл fiber-info.txt:

$ rm -f fiber.info.txt$ watch -n 0.5 "echo 'require("fiber").info()' | tt connect NAME -f - | tee -a fiber-info.txt"

Если сложно определить, какой файбер вызывает проблемы с производительностью, запустите скрипт на 10–15 секунд и отправьте полученный файл в поддержку Tarantool по адресу support@tarantool.org.

Простые средства профилирования

pstack

Этот инструмент устанавливается через пакетный менеджер вашего дистрибутива Linux. Команда выводит трассировку стека выполняющегося процесса по его PID. При необходимости команду можно запустить несколько раз, чтобы выявить узкое место, вызывающее снижение производительности.

После установки pstack выполните команду:

$ pstack $(pidof tarantool INSTANCENAME.lua)

Чтобы узнать PID экземпляра Tarantool, использующего файл INSTANCENAME.lua, выполните:

$ echo $(pidof tarantool INSTANCENAME.lua)

В консоли отобразятся записи формата:

Thread 19 (Thread 0x7f09d1bff700 (LWP 24173)):#0 0x00007f0a1a5423f2 in ?? () from /lib64/libgomp.so.1#1 0x00007f0a1a53fdc0 in ?? () from /lib64/libgomp.so.1#2 0x00007f0a1ad5adc5 in start_thread () from /lib64/libpthread.so.0#3 0x00007f0a1a050ced in clone () from /lib64/libc.so.6Thread 18 (Thread 0x7f09d13fe700 (LWP 24174)):#0 0x00007f0a1a5423f2 in ?? () from /lib64/libgomp.so.1#1 0x00007f0a1a53fdc0 in ?? () from /lib64/libgomp.so.1#2 0x00007f0a1ad5adc5 in start_thread () from /lib64/libpthread.so.0#3 0x00007f0a1a050ced in clone () from /lib64/libc.so.6<...>Thread 2 (Thread 0x7f09c8bfe700 (LWP 24191)):#0 0x00007f0a1ad5e6d5 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0#1 0x000000000045d901 in wal_writer_pop(wal_writer*) ()#2 0x000000000045db01 in wal_writer_f(__va_list_tag*) ()#3 0x0000000000429abc in fiber_cxx_invoke(int (*)(__va_list_tag*), __va_list_tag*) ()#4 0x00000000004b52a0 in fiber_loop ()#5 0x00000000006099cf in coro_init ()Thread 1 (Thread 0x7f0a1c47fd80 (LWP 24172)):#0 0x00007f0a1a0512c3 in epoll_wait () from /lib64/libc.so.6#1 0x00000000006051c8 in epoll_poll ()#2 0x0000000000607533 in ev_run ()#3 0x0000000000428e13 in main ()

gdb -ex "bt" -p

Как и в случае с pstack, перед использованием инструмента (также известного как GNU-отладчик) установите его через пакетный менеджер вашего дистрибутива Linux.

После установки gdb выполните команду:

$ gdb -ex "set pagination 0" -ex "thread apply all bt" --batch -p $(pidof tarantool INSTANCENAME.lua)

Чтобы узнать PID экземпляра Tarantool, использующего файл INSTANCENAME.lua, выполните:

$ echo $(pidof tarantool INSTANCENAME.lua)

После выполнения команды в консоль выводится следующее:

[Thread debugging using libthread_db enabled]Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".[CUT]Thread 1 (Thread 0x7f72289ba940 (LWP 20535)):#0 _int_malloc (av=av@entry=0x7f7226e0eb20 <main_arena>, bytes=bytes@entry=504) at malloc.c:3697#1 0x00007f7226acf21a in __libc_calloc (n=<optimized out>, elem_size=<optimized out>) at malloc.c:3234#2 0x00000000004631f8 in vy_merge_iterator_reserve (capacity=3, itr=0x7f72264af9e0) at /usr/src/tarantool/src/box/vinyl.c:7629#3 vy_merge_iterator_add (itr=itr@entry=0x7f72264af9e0, is_mutable=is_mutable@entry=true, belong_range=belong_range@entry=false) at /usr/src/tarantool/src/box/vinyl.c:7660#4 0x00000000004703df in vy_read_iterator_add_mem (itr=0x7f72264af990) at /usr/src/tarantool/src/box/vinyl.c:8387#5 vy_read_iterator_use_range (itr=0x7f72264af990) at /usr/src/tarantool/src/box/vinyl.c:8453#6 0x000000000047657d in vy_read_iterator_start (itr=<optimized out>) at /usr/src/tarantool/src/box/vinyl.c:8501#7 0x00000000004766b5 in vy_read_iterator_next (itr=itr@entry=0x7f72264af990, result=result@entry=0x7f72264afad8) at /usr/src/tarantool/src/box/vinyl.c:8592#8 0x000000000047689d in vy_index_get (tx=tx@entry=0x7f7226468158, index=index@entry=0x2563860, key=<optimized out>, part_count=<optimized out>, result=result@entry=0x7f72264afad8) at /usr/src/tarantool/src/box/vinyl.c:5705#9 0x0000000000477601 in vy_replace_impl (request=<optimized out>, request=<optimized out>, stmt=0x7f72265a7150, space=0x2567ea0, tx=0x7f7226468158) at /usr/src/tarantool/src/box/vinyl.c:5920#10 vy_replace (tx=0x7f7226468158, stmt=stmt@entry=0x7f72265a7150, space=0x2567ea0, request=<optimized out>) at /usr/src/tarantool/src/box/vinyl.c:6608#11 0x00000000004615a9 in VinylSpace::executeReplace (this=<optimized out>, txn=<optimized out>, space=<optimized out>, request=<optimized out>) at /usr/src/tarantool/src/box/vinyl_space.cc:108#12 0x00000000004bd723 in process_rw (request=request@entry=0x7f72265a70f8, space=space@entry=0x2567ea0, result=result@entry=0x7f72264afbc8) at /usr/src/tarantool/src/box/box.cc:182#13 0x00000000004bed48 in box_process1 (request=0x7f72265a70f8, result=result@entry=0x7f72264afbc8) at /usr/src/tarantool/src/box/box.cc:700#14 0x00000000004bf389 in box_replace (space_id=space_id@entry=513, tuple=<optimized out>, tuple_end=<optimized out>, result=result@entry=0x7f72264afbc8) at /usr/src/tarantool/src/box/box.cc:754#15 0x00000000004d72f8 in lbox_replace (L=0x413c5780) at /usr/src/tarantool/src/box/lua/index.c:72#16 0x000000000050f317 in lj_BC_FUNCC ()#17 0x00000000004d37c7 in execute_lua_call (L=0x413c5780) at /usr/src/tarantool/src/box/lua/call.c:282#18 0x000000000050f317 in lj_BC_FUNCC ()#19 0x0000000000529c7b in lua_cpcall ()#20 0x00000000004f6aa3 in luaT_cpcall (L=L@entry=0x413c5780, func=func@entry=0x4d36d0 <execute_lua_call>, ud=ud@entry=0x7f72264afde0) at /usr/src/tarantool/src/lua/utils.c:962#21 0x00000000004d3fe7 in box_process_lua (handler=0x4d36d0 <execute_lua_call>, out=out@entry=0x7f7213020600, request=request@entry=0x413c5780) at /usr/src/tarantool/src/box/lua/call.c:382#22 box_lua_call (request=request@entry=0x7f72130401d8, out=out@entry=0x7f7213020600) at /usr/src/tarantool/src/box/lua/call.c:405#23 0x00000000004c0f27 in box_process_call (request=request@entry=0x7f72130401d8, out=out@entry=0x7f7213020600) at /usr/src/tarantool/src/box/box.cc:1074#24 0x000000000041326c in tx_process_misc (m=0x7f7213040170) at /usr/src/tarantool/src/box/iproto.cc:942#25 0x0000000000504554 in cmsg_deliver (msg=0x7f7213040170) at /usr/src/tarantool/src/cbus.c:302#26 0x0000000000504c2e in fiber_pool_f (ap=<error reading variable: value has been optimized out>) at /usr/src/tarantool/src/fiber_pool.c:64#27 0x000000000041122c in fiber_cxx_invoke(fiber_func, typedef __va_list_tag __va_list_tag *) (f=<optimized out>, ap=<optimized out>) at /usr/src/tarantool/src/fiber.h:645#28 0x00000000005011a0 in fiber_loop (data=<optimized out>) at /usr/src/tarantool/src/fiber.c:641#29 0x0000000000688fbf in coro_init () at /usr/src/tarantool/third_party/coro/coro.c:110

Запустите отладчик в цикле, чтобы собрать достаточно информации для установления причины снижения производительности Tarantool. Для этого воспользуйтесь скриптом:

$ rm -f stack-trace.txt$ watch -n 0.5 "gdb -ex 'set pagination 0' -ex 'thread apply all bt' --batch -p $(pidof tarantool INSTANCENAME.lua) | tee -a stack-trace.txt"

По структуре и функциональности этот скрипт аналогичен ранее приведенному скрипту с функцией fiber.info().

Если не удается найти причину снижения производительности, запустите скрипт на 10–15 секунд и отправьте полученный файл stack-trace.txt в поддержку Tarantool по адресу support@tarantool.org.

gperftools

Чтобы использовать профилировщик процессора из набора Google Performance Tools с Tarantool, сначала установите зависимости:

  • Для Debian/Ubuntu выполните:

    \$ apt-get install libgoogle-perftools4
  • Для RHEL/CentOS/Fedora выполните:

    \$ yum install gperftools-libs

После этого установите Lua-привязки:

$ tt rocks install gperftools

После установки войдите в интерактивную административную консоль экземпляра Tarantool:

$ tt connect NAME|URI

Для запуска профилировщика выполните код:

tarantool> cpuprof = require('gperftools.cpu')tarantool> cpuprof.start('/home/<имя_пользователя>/tarantool-on-production.prof')

Сбор метрик занимает несколько минут. После этого данные можно сохранять на диск (неограниченное число раз):

tarantool> cpuprof.flush()

Для остановки профилировщика выполните команду:

tarantool> cpuprof.stop()

Собранные данные можно проанализировать с помощью утилиты pprof, которая входит в пакет gperftools:

$ pprof --text /usr/bin/tarantool /home/<имя_пользователя>/tarantool-on-production.prof

Пример вывода в консоли:

Total: 598 samples      83 13.9% 13.9% 83 13.9% epoll_wait      54 9.0% 22.9% 102 17.1%vy_mem_tree_insert.constprop.35      32 5.4% 28.3% 34 5.7% __write_nocancel      28 4.7% 32.9% 42 7.0% vy_mem_iterator_start_from      26 4.3% 37.3% 26 4.3% _IO_str_seekoff      21 3.5% 40.8% 21 3.5% tuple_compare_field      19 3.2% 44.0% 19 3.2%::TupleCompareWithKey::compare      19 3.2% 47.2% 38 6.4% tuple_compare_slowpath      12 2.0% 49.2% 23 3.8% __libc_calloc       9 1.5% 50.7% 9 1.5%::TupleCompare::compare@42efc0       9 1.5% 52.2% 9 1.5% vy_cache_on_write       9 1.5% 53.7% 57 9.5% vy_merge_iterator_next_key       8 1.3% 55.0% 8 1.3% __nss_passwd_lookup       6 1.0% 56.0% 25 4.2% gc_onestep       6 1.0% 57.0% 6 1.0% lj_tab_next       5 0.8% 57.9% 5 0.8% lj_alloc_malloc       5 0.8% 58.7% 131 21.9% vy_prepare

perf

Этот инструмент для мониторинга и анализа производительности устанавливается через пакетный менеджер вашего дистрибутива. Введите в консоли perf и следуйте инструкциям по установке.

Чтобы начать сбор данных о производительности, выполните команду:

$ perf record -g -p $(pidof tarantool INSTANCENAME.lua)

Эта команда сохраняет собранные данные в файл perf.data в текущей рабочей папке. Для остановки (обычно через 10-15 секунд) нажмите ctrl+C. В консоли появится следующее:

^C[ perf record: Woken up 1 times to write data ][ perf record: Captured and wrote 0.225 MB perf.data (1573 samples) ]

Затем выполните команду:

$ perf report -n -g --stdio | tee perf-report.txt

Она преобразует данные из perf.data в отчет о производительности и сохранит его в файл perf-report.txt.

Отчет выглядит так:

35.50% 0.55% 79 tarantool tarantool [.] lj_gc_step            |             --34.95%--lj_gc_step                       |                       |--29.26%--gc_onestep                       | |                       | |--13.85%--gc_sweep                       | | |                       | | |--5.59%--lj_alloc_free                       | | |                       | | |--1.33%--lj_tab_free                       | | | |                       | | | --1.01%--lj_alloc_free                       | | |                       | | --1.17%--lj_cdata_free                       | |                       | |--5.41%--gc_finalize                       | | |                       | | |--1.06%--lj_obj_equal                       | | |                       | | --0.95%--lj_tab_set                       | |                       | |--4.97%--rehashtab                       | | |                       | | --3.65%--lj_tab_resize                       | | |                       | | |--0.74%--lj_tab_set                       | | |                       | | --0.72%--lj_tab_newkey                       | |                       | |--0.91%--propagatemark                       | |                       | --0.67%--lj_cdata_free                       |                        --5.43%--propagatemark                                  |                                   --0.73%--gc_mark

Инструменты gperftools и perf отличаются от pstack и gdb низкой затратой ресурсов: они подключаются к процессам с минимальными задержками, поэтому их можно использовать без серьезных последствий.

jit.p

Профилировщик jit.p входит в комплект сервера приложений Tarantool. Чтобы загрузить его, выполните команду require('jit.p') или require('jit.profile'). Параметры настройки выборки и вывода описаны в документации профилировщика LuaJIT, которая доступна в репозитории LuaJIT на GitHub в ветке 2.1 в файле: doc/ext_profiler.html.

Пример

Создайте функцию для вызова функции под названием f1, которая осуществляет 500 000 вставок и удалений в спейсе Tarantool. Запустите профилировщик, выполните функцию, завершите работу профилировщика. Получите результат выборки профилировщика.

box.space.t:drop()box.schema.space.create('t')box.space.t:create_index('i')function f1() for i = 1,500000 do  box.space.t:insert{i}  box.space.t:delete{i}  endreturn 1endfunction f3() f1() endjit_p = require("jit.profile")sampletable = {}jit_p.start("f", function(thread, samples, vmstate)  local dump=jit_p.dumpstack(thread, "f", 1)  sampletable[dump] = (sampletable[dump] or 0) + samplesend)f3()jit_p.stop()for d,v in pairs(sampletable) do print(v, d) end

Результат покажет, что выборка многократно осуществлялась в рамках f1()и во внутренних функциях Tarantool, имена которых могут меняться от версии к версии.