Иногда лучшее решение — убрать сложное совсем
Проблема с памятью в пайплайне на Go + cgo + GStreamer — и решение, которое свелось к отказу от самого пайплайна.
Недавно мы потратили немало времени на проблему с памятью в пайплайне обработки видео на Go + cgo + GStreamer.
Звучит просто. На практике мы имели дело с:
- границами cgo;
- временем жизни объектов GStreamer — буферов, сэмплов, ссылок и освобождений;
- памятью, которую Go GC по сути не контролирует;
- случайными скачками потребления памяти внутри биндингов, которые трудно воспроизвести и ещё труднее объяснить.
В какой-то момент вместо вопроса «как это починить?» появился другой: «а нужна ли нам вообще эта сложность внутри Go-процесса?»
Ответ оказался простым: нет. Мы убрали встроенный пайплайн GStreamer и заменили его обычным вызовом ffmpeg в отдельном процессе.
ffmpeg — не волшебное решение на все случаи. Но для нашей задачи изоляция процессов оказалась куда ценнее теоретической элегантности.
Хорошее напоминание: инженерия не всегда про то, чтобы заставить сложное работать. Иногда — про то, чтобы сложное убрать совсем.