Память растёт: утечка или нет
Вопрос
Графики показывают, что память сервиса растёт неделю, пока его не убивает OOM. Как будешь разбираться?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Подтвердить: какая именно память растёт (RSS процесса, page cache, память cgroup) и коррелирует ли с нагрузкой
Отличить утечку от нормы: прогрев кешей, аллокатор не отдаёт память, GC с большим запасом
Снять данные: heap dump или профилировщик кучи (JVM, Node, Go pprof), `smaps` для нативной памяти
Сравнить два снимка во времени и найти растущие объекты
Временно: лимиты, рестарт по расписанию как костыль, алерт до OOM
Исправить причину и проверить нагрузочным тестом
Что могут спросить следом
- Почему RSS у Node.js не уменьшается после GC?
- Как найти утечку нативной памяти?
- Как правильно выставить лимит кучи в контейнере?
Разбор
Сначала уточняю, что растёт. RSS процесса, общая память cgroup (в ней ещё page cache) или просто занятая память узла, которая на деле кеш. Сопоставляю с нагрузкой: если память растёт с трафиком и падает с ним, это не утечка. Нормальные причины роста: прогрев кешей, JIT, аллокатор не возвращает страницы ОС, GC работает с запасом. Признак утечки: устойчивый рост при постоянной нагрузке без плато. Тогда снимаю данные: для JVM heap dump и анализатор, для Node снимки кучи через inspector, для Go pprof. Делаю два снимка с интервалом и сравниваю, какие объекты растут: часто это кеш без ограничения, подписки, не закрытые соединения, глобальные массивы. Если растёт нативная память, смотрю smaps, pmap и инструменты вроде jemalloc-профилирования. Пока чиню, ставлю алерт до OOM и, если нужно, перезапуск как временную меру. После исправления проверяю нагрузочным тестом, что кривая выходит на плато.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.