Выбор ответа Senior Память, GC и pprof обновлено

GOMEMLIMIT в контейнере

Вопрос

Под с лимитом памяти 1 ГиБ иногда убивает OOM killer, хотя живых данных около 400 МБ. Что поможет в первую очередь?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Выставить GOMEMLIMIT около 85-90% лимита контейнера. При GOGC=100 и 400 МБ живых данных куча может вырасти до 800 МБ плюс стеки, рантайм и фрагментация, и выйти за 1 ГиБ.

Варианты ответа

  1. Выставить GOGC=off, чтобы GC не тратил память на метаданные
  2. Вызывать runtime.GC() каждую секунду из отдельной горутины
  3. Увеличить GOMAXPROCS, чтобы маркировка шла быстрее
  4. Выставить GOMEMLIMIT около 85-90% лимита контейнераправильный ответ

Разбор

При GOGC=100 и 400 МБ живых данных куча может вырасти до ~800 МБ плюс стеки, рантайм и фрагментация, и выйти за 1 ГиБ. GOMEMLIMIT (Go 1.19) это мягкий лимит: рантайм учащает сборки, чтобы общий объём памяти Go оставался ниже. GOGC=off без лимита гарантированно приведёт к OOM. Ручной GC каждую секунду дорого и не решает пиков. GOMAXPROCS к памяти отношения не имеет. Если живых данных больше лимита, никакая настройка не поможет и начнётся death spiral, поэтому GC ограничен примерно 50% CPU при работе у лимита.

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

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