← Назад к вопросам

Что такое trace?

1.8 Middle🔥 131 комментариев
#Конкурентность и горутины

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое трассировка (trace) в Go?

Трассировка (trace) — это мощный инструмент в языке Go для глубокого анализа и профилирования работы программы. Он позволяет записывать и анализировать широкий спектр событий во время выполнения: планирование горутин, работу сети, системные вызовы, сборку мусора и многое другое. Трассировка предоставляет целостное, временное представление о том, что происходило в программе в течение определенного промежутка времени, что делает её незаменимым инструментом для диагностики сложных проблем производительности, особенно в параллельных и распределенных системах.

Основные возможности трассировки

Трассировка в Go позволяет отслеживать:

  • Планирование горутин (runtime.schedule) — когда и почему горутина была остановлена, запущена или перепланирована.
  • Сетевые и системные вызовы — блокировки на операциях чтения/записи, вызовы select.
  • Сборку мусора (GC) — фазы GC, влияние на программу (STW — остановка мира).
  • Создание и завершение горутин — полный жизненный цикл.
  • Синхронизацию — операции с каналами, мьютексами, sync.WaitGroup.

Как использовать трассировку

Трассировка включается либо через стандартный пакет runtime/trace, либо через HTTP-эндпоинт /debug/pprof/trace пакета net/http/pprof.

Пример записи трассировки в файл:

package main

import (
    "os"
    "runtime/trace"
)

func main() {
    // Создаем файл для записи трассы
    f, err := os.Create("trace.out")
    if err != nil {
        panic(err)
    }
    defer f.Close()

    // Начинаем запись трассировки
    err = trace.Start(f)
    if err != nil {
        panic(err)
    }
    defer trace.Stop()

    // Здесь выполняется код, который мы хотим анализировать
    doWork()
}

func doWork() {
    // ... ваша логика с горутинами, каналами, etc.
}

После выполнения программы файл trace.out можно анализировать с помощью команды go tool trace.

Анализ трассировки

Для анализа запускается специальный веб-интерфейс:

go tool trace trace.out

Эта команда запускает локальный веб-сервер с интерактивной визуализацией, которая включает:

  1. Временную диаграмму (timeline) — главное окно, где события отображаются вдоль оси времени для каждого процессора (P) и горутины (G).
  2. Статистику по горутинам — сколько времени они были в разных состояниях (выполнение, ожидание, системный вызов).
  3. Анализ сборки мусора — длительность и фазы.
  4. Анализ сети и синхронизации — графики блокировок.
  5. Профилирование по событиям — можно выбрать конкретный тип события (например, блокировки на chan receive) и получить профиль стека вызовов для него.

Ключевые преимущества и отличие от pprof

  • pprof (профилирование) показывает статистику (где программа тратит больше всего CPU или памяти) в виде агрегированных данных. Это ответ на вопрос "что".
  • trace показывает последовательность событий в их временном контексте. Это ответ на вопросы "когда", "почему" и "в каком порядке". Например, trace идеально подходит для выявления латентности — почему конкретная горутина долго ждала, или для анализа редких, но критичных событий, таких как длительные остановки GC.

Практические случаи применения

Трассировка особенно полезна для:

  • Диагностики внезапных падений производительности в микросервисах.
  • Поиска причин неожиданных блокировок в высококонкурентном коде.
  • Оптимизации распределенных систем, где важно понимать порядок и временные задержки между событиями.
  • Анализа влияния сборки мусора на отклик приложения.

Таким образом, trace — это не просто профилировщик, а полноценная система отслеживания событий (event tracing), которая дает разработчику уникальную возможность "заглянуть внутрь" работающей Go-программы и понять сложное взаимодействие множества параллельных процессов, что часто невозможно с помощью традиционных методов профилирования.

Что такое trace? | PrepBro