Что такое профилирование и какую информацию оно даёт в Go?

Ответ

Профилирование — это процесс сбора и анализа данных о производительности программы для выявления «узких мест» (bottlenecks).

В Go стандартный пакет pprof позволяет собирать следующую информацию:

  1. CPU Profiling (Профилирование ЦП)

    • Показывает, какие функции потребляют больше всего процессорного времени. Помогает найти и оптимизировать вычислительно-затратные участки кода.
  2. Memory Profiling (Профилирование памяти, Heap)

    • Показывает, какие функции выделяют больше всего памяти. Помогает обнаружить утечки памяти и неэффективное использование ресурсов.
  3. Block Profiling (Профилирование блокировок)

    • Сообщает, в каких местах горутины блокируются дольше всего в ожидании ресурсов (например, при операциях с каналами или мьютексами).
  4. Mutex Profiling (Профилирование мьютексов)

    • Помогает выявить мьютексы с высокой степенью конкуренции (contention), то есть те, за которые горутины борются чаще всего.

Профилировщик можно подключить как HTTP-обработчик для анализа работающего приложения:

import (
    "log"
    "net/http"
    _ "net/http/pprof" // Важно: импортируем для регистрации обработчиков
)

func main() {
    // ... ваш основной код

    // Запускаем pprof сервер на порту 6060
    go func() {
        log.Println(http.ListenAndServe("localhost:6060", nil))
    }()

    // ...
}

После запуска можно анализировать данные с помощью утилиты go tool pprof, например, для анализа использования памяти:
go tool pprof http://localhost:6060/debug/pprof/heap