рубит по таймауту)
раз в час-полтора
https://filebin.net/nlkwbqwa9bd1sdtq/last.svg?t=dec2gowl
вот что перф показывает, мне показалось, что gc_* стало больше
так выглядит обычная работа
https://filebin.net/nlkwbqwa9bd1sdtq/usual.svg?t=71mp6709
Даже если не брать в расчёт, что у вас древнючая версия, то по данному инпуту нельзя сказать ничего. Флеймграф крайне редко показывает проблему, если только она не вопиющая. Нужно описание: что за приложение, какие модули используются, какая нагрузка, что в логах, есть ли too long'и?
приложение - гошный бек модули fiber,util,json,digest,msgpack фиберы отрубал для тестов, подлипает все равно too long есть -валы пишет долго в момент тормозов, с дисковым ио не связано, больше ничего плохого в логах нет я гонял стрейсом, в момент проблемы тара с сокетов читает новые запросы, но новые не генерит. box.stat --- - DELETE: total: 25112 rps: 0 SELECT: total: 243309024 rps: 3872 INSERT: total: 45967 rps: 0 EVAL: total: 0 rps: 0 CALL: total: 17891486 rps: 251 REPLACE: total: 2325611 rps: 29 UPSERT: total: 0 rps: 0 AUTH: total: 0 rps: 0 ERROR: total: 5180 rps: 0 UPDATE: total: 965308 rps: 13
> приложение - гошный бек я имел в виду приложение в тарантуле > too long есть -валы пишет долго в момент тормозов, это и есть ваша проблема. диск не при чём. у вас какой-то код слишком долго не отдаёт управление. например обрабатываете большой селект, тысяч на 200 или парсите большой json или просто цикл длинный сделали. > с сокетов читает новые запросы чтение из cокетов происходит из iproto потока, а на обработке у вас залипает tx
а трейсить - только впиливать в код логирование?
В результате обсуждения в привате родился такой сниппет: local TOO_LONG_CALL_THRESHOLD = 0.1 local clock = require 'clock' local json = require 'json'.new() json.cfg{ encode_use_tostring = true } local function ftail(fname, args, start, ...) local run = clock.realtime() - start if run > TOO_LONG_CALL_THRESHOLD then log.info("Function call %s(%s) was too long: %0.2fs", fname, json.encode(args), run) end return ... end local function ftrace(fname, func) return function(...) local start = clock.realtime() return ftail(fname, {...}, start, func(...)) end end local function apply_ftrace(name, namespace) for fname, v in pairs(namespace) do if type(v) == 'table' then apply_ftrace(name .. '.' .. fname, v) elseif type(v) == 'function' and v ~= ftrace then namespace[fname] = ftrace(name .. '.' .. fname, v) end end end для активации трейсинга функций применить на исследуемый неймспейс (допустим приложение живёт в таблице app и вы обрааетесь к функциям как app.smth.func()) apply_ftrace('app',app)
еще раз спасибо
Схоронил:)
Обсуждают сегодня