GOMEMLIMIT в контейнере
Вопрос
Под с лимитом памяти 1 ГиБ иногда убивает OOM killer, хотя живых данных около 400 МБ. Что поможет в первую очередь?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Выставить GOGC=off, чтобы GC не тратил память на метаданные
- Вызывать runtime.GC() каждую секунду из отдельной горутины
- Увеличить GOMAXPROCS, чтобы маркировка шла быстрее
- Выставить
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 ошибок.
Ещё по теме «Память, GC и pprof»
- Пул объектов как sync.Pool: симуляция на Go
- Статистика потока чисел без хранения на Go
- Escape analysis: что попадёт в кучу
- Как работает сборщик мусора Go
- Какой сборщик мусора в Go
- Как посмотреть решения escape analysis
- Почему fmt.Println вызывает аллокации
- Инструменты диагностики Go