Task #6608
openПамять: рост за время работы и тесты на него
0%
Description
После долгой работы система встаёт. Нужны тесты, которые ловят рост памяти на длинной дистанции, и устранение самого роста.
Подход: счётчик живых байт как глобальный аллокатор в тестовой цели, прогон тысяч кадров через сессию и толпу, проверка, что после прогрева живой объём не растёт и число выделений на кадр не зависит от номера кадра.
Кандидаты: история метрик, треки толпы при частой смене лиц, буферы кадров в потоке, выходные тензоры модели.
Updated by Redmine Admin about 1 month ago
Причина найдена и устранена.
Рост 35 МБ/с, с 176 МБ до 1.77 ГБ за 45 секунд работы приложения. queue.write_texture держит копию кадра до следующего submit; окно, которое скрыто, перекрыто или меняет размер, не рисует и не делает submit, поэтому каждый кадр камеры оставался: 1202 КБ на кадр. Правка: submit сразу после загрузки, poll для освобождения, переиспользуемый буфер подготовки. Замер приложения после правки: 140 -> 150 МБ за минуту и ровно.
Нагрузка процессора, вторая часть «зависания»: пустая комната просматривалась 16 проходами детектора каждый кадр (теперь раз в 3 кадра), ONNX Runtime держал поток на ядро с активным ожиданием (теперь 2 потока без ожидания), приложение создавало два источника моделей вместо одного. Без лица в кадре: 124% против 256–296%.
Тесты: app_memory (сессия 3000 кадров, толпа 895 кадров — живые байты Rust не растут, резидентный объём в пределах 32 МБ), adapters_display_gpu (минута кадров с мешем четырёх лиц; 900 загруженных и не нарисованных кадров — воспроизводил утечку, 1056 МБ до правки).
Остаток: окно на ControlFlow::Poll перерисовывает без паузы, это часть оставшихся 124%.
Updated by Redmine Admin about 1 month ago
Остаток закрыт в следующем коммите: окно на ControlFlow::Poll перерисовывало без паузы. Теперь цикл ждёт по 4 мс и рисует только при новом кадре камеры или новых показаниях. Процессор без лица в кадре: 34–41% (было 124% после первой правки, 256–296% в начале), память 137–140 МБ ровно. Тесты: adapters_display_window (политика перерисовки, частота проверки против интервала кадра), adapters_stream (is_waiting).