> Как определить причину медленной работы REST API при ответе через 20 секунд (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Лига Цифровой Экономики
Стек: Go
> Пример ответа
Для диагностики 20-секундной задержки в REST API на Go нужно системно проверить несколько уровней.
-
Измерение времени на стороне клиента - сначала убедитесь, что задержка именно на сервере, а не в сети. Используйте
curl -w "%{time_total}"или инструменты вродеhttpstat. -
Логирование времени обработки - добавьте middleware, замеряющий время каждого запроса:
GOfunc timingMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {start := time.Now()next.ServeHTTP(w, r)log.Printf("%s %s took %v", r.Method, r.URL.Path, time.Since(start))})}
- Профилирование pprof - включите стандартный профилировщик Go:
GOimport _ "net/http/pprof"// затем: go tool pprof http://localhost:8080/debug/pprof/profile?seconds=30
Это покажет, где тратится CPU время: блокировки, аллокации, вызовы.
-
Проверка блокировок - используйте
go tool traceдля поиска горутин, ожидающих каналы, мьютексы или I/O. Частая причина - deadlock или contention на общих ресурсах. -
Блокирующие вызовы БД - проверьте, не выполняются ли медленные SQL-запросы. Добавьте таймауты для контекста:
GOctx, cancel := context.WithTimeout(r.Context(), 5*time.Second)defer cancel()// передайте ctx в db.QueryContext
- Сетевые задержки - если API вызывает внешние сервисы, убедитесь, что у HTTP-клиента установлены таймауты:
GOclient := &http.Client{Timeout: 10 * time.Second}
-
Ограничения ресурсов - проверьте, не упирается ли приложение в лимиты CPU/памяти контейнера или ОС. Используйте
top,htop, или метрики облачного провайдера. -
GC паузы - если приложение активно выделяет память, сборщик мусора может вызывать задержки. Включите логирование GC:
GODEBUG=gctrace=1.
Типичная причина - отсутствие таймаутов на входящие запросы или на вызовы БД, что приводит к зависанию горутин. Начните с добавления таймаутов и профилирования pprof.
> Похожие задачи по Go
Как избежать утечек памяти при работе с файлами в цикле в Go
Какие инструменты кроме трассировки используются для диагностики производительности
Когда завершится цикл for при чтении из канала в Go
В каком формате передаются данные по сети
> Похожие задачи по backend
Как избежать утечек памяти при работе с файлами в цикле в Go
Какие инструменты кроме трассировки используются для диагностики производительности
Когда завершится цикл for при чтении из канала в Go
В каком формате передаются данные по сети
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью