Назад к вопросам
Купер
Middle+
3
Расскажи про последний факап — что произошло, как нашли и как решали?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
В одном из последних проектов на Go мы столкнулись с проблемой утечки памяти в сервисе, который обрабатывал большое количество параллельных запросов. Система начала постепенно замедляться и в итоге падала с ошибкой out-of-memory.
Причина оказалась в неправильном использовании горутин: мы запускали горутину на каждый запрос, но не контролировали их завершение и не освобождали ресурсы, связанные с контекстом.
Проблему обнаружили с помощью профилировщика pprof, который показал рост количества горутин и потребление памяти.
Решение:
- Добавили контекст с таймаутом и отменой для горутин.
- Переписали обработку запросов, чтобы гарантировать завершение горутин.
- Внедрили пул горутин для ограничения максимального количества одновременно работающих.
Пример использования контекста для отмены горутины:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
select {
case <-ctx.Done():
// очистка и завершение
return
// обработка
}
}(ctx)