Ответ вслух Senior Память и производительность обновлено

Утечка памяти в Python-воркере

Вопрос

Память Python-воркера растёт со временем. Как вы будете искать утечку?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Сначала убеждаюсь, что это утечка, а не прогрев: рост RSS без выхода на плато, связь с определёнными задачами или эндпоинтами. Потом воспроизвожу локально и включаю tracemalloc: делаю снимок, прогоняю нагрузку, делаю второй и сравниваю, он покажет строки, где растёт выделение.

Что должно прозвучать в ответе

  • Подтвердить рост: метрики RSS, корреляция с нагрузкой и типом задач

  • tracemalloc: снимки и сравнение, memray для детального анализа

  • Подозреваемые: глобальные кеши без ограничения, lru_cache, подписки, ссылки в traceback

  • gc.get_objects, objgraph: какие типы объектов растут

  • Фрагментация и аллокатор: память не возвращается ОС

  • Временная мера: перезапуск воркеров по числу задач (max_requests, max_tasks_per_child)

Что могут спросить следом

  • Почему после освобождения объектов RSS может не уменьшиться?
  • Как утечка может быть связана с C-расширением?

Разбор

Образцовый ответ: «Сначала убеждаюсь, что это утечка, а не прогрев: рост RSS без выхода на плато, связь с определёнными задачами или эндпоинтами. Потом воспроизвожу локально и включаю tracemalloc: делаю снимок, прогоняю нагрузку, делаю второй и сравниваю, он покажет строки, где растёт выделение. Для подробного анализа беру memray. Параллельно смотрю, какие типы объектов множатся, через gc.get_objects или objgraph и ищу, кто их держит. Типичные виновники: глобальный словарь-кеш без ограничения, lru_cache без maxsize или на методах, обработчики сигналов и подписки, сохранённые исключения с traceback, который держит кадры с большими данными. Если по объектам Python роста нет, а RSS растёт, это может быть C-расширение или фрагментация аллокатора, тогда смотрю на нативные профилировщики. Пока ищу причину, ставлю защиту: перезапуск воркера после N запросов в gunicorn или max_tasks_per_child в Celery».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.