Sobes.tech
Назад к вопросам
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)