← Все заметки
EN RU Дмитрий Борисенко

Иногда лучшее решение — убрать сложное совсем

Проблема с памятью в пайплайне на Go + cgo + GStreamer — и решение, которое свелось к отказу от самого пайплайна.

Недавно мы потратили немало времени на проблему с памятью в пайплайне обработки видео на Go + cgo + GStreamer.

Звучит просто. На практике мы имели дело с:

  • границами cgo;
  • временем жизни объектов GStreamer — буферов, сэмплов, ссылок и освобождений;
  • памятью, которую Go GC по сути не контролирует;
  • случайными скачками потребления памяти внутри биндингов, которые трудно воспроизвести и ещё труднее объяснить.

В какой-то момент вместо вопроса «как это починить?» появился другой: «а нужна ли нам вообще эта сложность внутри Go-процесса?»

Ответ оказался простым: нет. Мы убрали встроенный пайплайн GStreamer и заменили его обычным вызовом ffmpeg в отдельном процессе.

ffmpeg — не волшебное решение на все случаи. Но для нашей задачи изоляция процессов оказалась куда ценнее теоретической элегантности.

Хорошее напоминание: инженерия не всегда про то, чтобы заставить сложное работать. Иногда — про то, чтобы сложное убрать совсем.

Потребление памяти до и после замены встроенного пайплайна GStreamer/cgo на вызовы ffmpeg в отдельном процессе