Утечка памяти в Python-воркере
Вопрос
Память Python-воркера растёт со временем. Как вы будете искать утечку?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Подтвердить рост: метрики 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 ошибок.
Предыдущий вопрос
__slots__ для миллионов объектов
Следующий вопрос
Как ускорить медленный Python-сервис
Ещё по теме «Память и производительность»
- Встроенные функции против ручного цикла
- Пересечение больших списков id
- Числа Фибоначчи без экспоненты
- Скользящая медиана потока на двух кучах
- Найти пару с суммой быстрее O(n²)
- Циклические ссылки и gc
- Управление памятью в CPython
- Инструменты профилирования Python