Поймите pprof Golang с первого взгляда

Go

предисловие

Это статья для пользователей сети. Я только недавно исследовал и проанализировал производительность golang. Я думаю, что пора остановиться.

текст

1. Введение одним предложением

GolangПринести свой собственныйнестандартныймониторинг производительностиианализироватьинструмент.

(Нет необходимости запоминать его в процессе прочтения всей статьи. После прочтения у вас, естественно, возникнет другое ощущение.)

2. Использовать осанку?

2.1 runtime/pprof

Вручную вызовите runtime.StartCPUProfile/runtime.StopCPUProfile и т. д.APIдля сбора данных.

преимущество:высокая гибкость, Сбор по требованию.

используемые сцены:применение инструмента(Например, настраиваемые гаджеты для анализа, интеграция в системы мониторинга компании)

2.2 net/http/pprof

пройти черезhttpСервис для получения файлов примеров профилей.import _ "net/http/pprof"

преимущество:Простой в использовании.

Сценарии использования: Онлайн-сервисы (программы, которые всегда запущены)

(net/http/pprof просто использует пакет runtime/pprof для его инкапсуляции и предоставления доступа к порту http)

2.3 go test

по командеgo test -bench . -cpuprofile cpu.profдля сбора данных.

преимущество:Целеустремленный, усовершенствовано для работы

Сценарий использования: проверка производительности функции

3 Анализ осанки?

3.1 Сбор данных

Основой анализа является получение соответствующих файлов сбора данных.runtime/pprofиgo testЭти два собираются из командной строки (нижеАнализ процессорапример)). иnet/http/pprofДанные выделяются с помощью интерфейсов.

1. Способ пройти тест очень прост, команда:go test -bench . -cpuprofile cpu.profможет быть сгенерировано.

2.runtime/pprof, прямо на простейшем коде.

package main

import (
	"fmt"
	"os"
	"runtime/pprof"
	"time"
)

// 一段有问题的代码
func do() {
	var c chan int
	for {
		select {
		case v := <-c:
			fmt.Printf("我是有问题的那一行,因为收不到值:%v", v)
		default:
		}
	}
}

func main() {

	// 创建分析文件
	file, err := os.Create("./cpu.prof")
	if err != nil {
		fmt.Printf("创建采集文件失败, err:%v\n", err)
		return
	}

	// 进行cpu数据的获取
	pprof.StartCPUProfile(file)
	defer pprof.StopCPUProfile()

	// 执行一段有问题的代码
	for i := 0; i < 4; i++ {
		go do()
	}
	time.Sleep(10 * time.Second)
}

Выполнение заказа:

go run pprof.go

Затем вы получите файл сбора данных: cpu.prof. (Этот файл будет использован позже)

3. метод http, приведенный выше код:

package main

import (
	"fmt"
	"net/http"
    _ "net/http/pprof"  // 第一步~
)

// 一段有问题的代码
func do() {
	var c chan int
	for {
		select {
		case v := <-c:
			fmt.Printf("我是有问题的那一行,因为收不到值:%v", v)
		default:
		}
	}
}

func main() {
	// 执行一段有问题的代码
	for i := 0; i < 4; i++ {
		go do()
	}
	http.ListenAndServe("0.0.0.0:6061", nil)
}

Через ключ два шага в коде может пройти исполнениеhttp://127.0.0.1:6061/debug/pprof/См. соответствующие данные

3.2 Содержание данных

Каким бы способом оно ни было получено, его можно проанализировать. Здесь метод http выводит всю информацию, которую можно увидеть.

тип описывать
allocs ВнутриВыборка информации о выделении памяти
blocks блокироватьИнформация о выборке для рабочих условий
cmdline показать запуск программыПараметры командыи его параметры
goroutine показать все текущиесопрограммаинформация о стеке
heap кучаПример информации о распределении памяти на
mutex ЗамокИнформация о выборке для условий гонки
profile cpuИнформация о выборке занятости, нажмите, чтобы загрузить файл
threadcreate системанитьВыборка информации для ситуации создания
trace программавыполнить трассировкуИнформация

С помощью ключевых слов, выделенных жирным шрифтом, очень легко увидеть данные, которые можно проанализировать.

(Далее основное внимание будет уделено обсуждению командной строки и графической страницы на основе информации о выборке процессора, а остальные элементы будут применяться в реальном бою)

3.3 Анализ данных

3.3.1 Командная строка

Основная команда:go tool pprof <binary> <source>

двоичный: представляет путь к двоичному файлу.

источник: представляет источник сгенерированных данных анализа, который может бытьлокальные файлы(cpu.prof сгенерирован в предыдущей статье), или это может бытьhttp-адрес(Например:go tool pprof http://127.0.0.1:6060/debug/pprof/profile)

Следует отметить, что достоверные данные, полученные в случае большой нагрузки (или умышленного написания кода неисправности, или имитации давления доступа), более информативны, в состоянии простоя полученные результаты могут не иметь смысла.

Начните анализировать cpu.prof, сгенерированный выше:

go tool pprof cpu.prof

См. страницу:

Наша цель - проанализировать процессор, где это занимает много времени.Вот немного похоже на команду linux, которая также вводится:top

Расскажите об этой картине хорошо! Поскольку я думал об этом, я подумал, что было бы лучше понять это, если бы я смотрел на это в сочетании с конкретной диаграммой, поэтому я предлагаю два способа создания диаграммы:

1. Продолжайте вводить в предыдущем диалоговом окне:web. Страница pprof001.svg может быть создана.

2. Выполните команду:go tool pprof -pdf cpu.prof, будет создан pdf-файл profile001.pdf. (необязательный текст параметра, pdf, svg)

В любом случае вы получите следующую картину:

тип описывать Пример
flat Эта функция занимает время ЦП Время использования ЦП selectnbrecv составляет 12,29 с.
flat% Процент времени, в течение которого функция занимает ЦП. время selectnbrecv: 12,29 с, общее время процессора: 29,14, 12,29/29,14 = 42,18
sum% Сумма функций, ранжированных над ней в верхней команде, и плоский % этой функции chanrecv: 42,18% + 30,47% = 72,65%
cum Текущая функция плюс совокупное время процессора перед вызовом функции возврат каналов: 8,88+0,54=9,42
cum% Текущая функция плюс процент накопленного процессорного времени перед вызовом функции 9.42/29.14=32.33%
последний ряд имя текущей функции -

Выявлено, что чем толще он в пути, тем он проблематичнее и чем он трудоемче, тем больше вероятность наличия проблемы. Нашел функцию do немного проблематичной. На данный момент с помощью команды:list funcName, чтобы проверить конкретное местоположение

Обнаружено, что количество проблемных строк находится в определенной позиции в тексте, получается, что она застряла, и это можно решить, добавив дефолтный сон на n секунд.

Анализ памяти аналогичен анализу процессора, поэтому в этой статье мы не будем вдаваться в подробности.

Подводя итог, запомните как минимум три шага для анализа:top -> list Func -> web

3.3.2 Страница визуализации

Есть два способа поддержки браузеров для открытия веб-сайтов:

1. Выполните команду:go tool pprof -http=:6060 cpu.prof

  • Top (аналогично команде top предыдущей интерактивной страницы gdb)

  • График (веб-команда предыдущей интерактивной страницы gdb)

  • График пламени

Цвета здесь распределены случайным образом и выглядят как языки пламени.

последовательность вызововсверху вниз, каждый блок представляет собой функцию, и чем больше блок, тем дольше используется ЦП. В то же время он также может поддерживать нажатие на блок для углубленного анализа.

  • Peek (подробный = древовидная структура)

  • Источник (такой же, как команда list FuncName на интерактивной странице gdb выше)
  • Disassemble

4. Актуальный бой в игре

В «Путешествии на Запад» четверо мастеров и учеников взяли священные писания с запада, и им пришлось пройти через девяносто девять восемьдесят одно испытание, прежде чем они смогли получить писания.

Вот для маленьких друзей подготовлен небольшой скрипт:я указываю

Выполнять прямо в браузере./xiyouji, вы можете увидеть четырех мастеров и учеников, которые едят и пьют по пути.

4.1 Первая трудность - слишком высокая загрузка ЦП

Сначала просмотрите файл профиля, чтобы увидеть, есть ли какие-либо отклонения в работе процессора.

go tool pprof http://localhost:6060/debug/pprof/profile

Внезапно я обнаружил, что у этой свиньи Баджи есть некоторые проблемы с едой.

Итак, давайте посмотрим и выполним команду:list Drink

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

Мы смотрим на общую картину:web

Устраните проблему на этом этапе. (Примечания можно исправить, то же самое ниже)

4.2 Вторая трудность — большое использование памяти

После перекомпиляции идем дальше. Далее проверьте, нет ли проблем с памятью.

go tool pprof http://localhost:6060/debug/pprof/heap 

Вы обнаружили, что монах Ша много ест?

Рассмотрим подробнее, почему:list Eat

Оказывается, здесь производились злонамеренные добавления памяти, пока емкость не достигла своего пика.

Продолжайте смотреть на картинку и еще раз подтвердите:web

Просто исправьте код.

4.3 Третья трудность — частое восстановление памяти

Все мы знаем, что частая обработка gc приведет к постоянному появлению stw, чего не может допустить высокопроизводительный сервис.

Здесь вам нужно использовать переменную окружения, чтобы начать наблюдение gc,

GODEBUG=gctrace=1 ./xiyouji 2>&1|grep gc

Пояснение к этой информации:

Видно, что gc будет запускаться примерно раз в 3 секунды, и каждый раз это будет от 16M->0, указывая на то, что память постоянно применяется и освобождается.

пройти черезвыделение памяти, вы можете увидеть, есть ли отклонения в gc, если они всегда составляли 100% или большую долю, это означает, что есть проблема.

Выполнение заказа:

go tool pprof http://localhost:6060/debug/pprof/allocs

Продолжайте смотреть, что случилось с Гоку:list Shit

Смотрите общую картину:web

То же, что и выше, просто закомментируйте код, чтобы двигаться дальше.

Пункт знаний: Здесь следует отметить, чтоЗачем ставить 16мШерстяная ткань? Проще говоря, таким образом, когда выполняется escape-анализ, приложение памяти запускается из стека в кучу, чтобы вызвать перезапуск GC. (Для получения более подробной информации, пожалуйста, обратитесь к «Краткому анализу побега с Голанга», который я еще не написал)

4.4 Четвертая сложность — утечка сопрограммы

Это кажется слишком много для нас, чтобы отправить, как горутины? Корутина протекает? Продолжайте смотреть вниз.

Проверьте ситуацию с горутиной:

go tool pprof http://localhost:6060/debug/pprof/goroutine

Вижу функцию, которая вызывает много горутин, но я не вижу проблемы, вызванной добавленными вручную функциями.

Продолжайте преследовать общую картину:web

Оказалось, что у Тан Сенга были проблемы со сном.

Продолжаем отслеживать проблемную функцию:list Sleep

Решите проблему и посмотрите еще разhttp://127.0.0.1:6060/debug/pprof/, как выяснилось, нормализовалось.

4.5 Пятая трудность — конфликт блокировок

Обнаружено исключение: количество горутин уменьшено до 4, почему проблема с запросом блокировки?

go tool pprof localhost:6060/debug/pprof/mutex

Видно, что после того, как основная сопрограмма из 126 строк будет заблокирована, она будет немедленно заблокирована снова, но разблокировка выполняется другой сопрограммой для разблокировки, а другая сопрограмма спит на полные 1 с, что вызовет блокировку и вызовет блокировку. спор. .

Просто исправьте это (обратите внимание)

4.6 Шестая трудность - блокирующие операции

После решения предыдущих задач мы обнаружили, что:

В дополнение к блокировке, вызванной блокировкой, есть и другие логические блокировки, продолжайте смотреть вниз.

go tool pprof localhost:6060/debug/pprof/block

Хорошо видно, что это отличается от блока сна в предыдущей статье.Это блок канала.Для вывода данных требуется 1 с, что приводит к блокировке программы на 1 с.

4.7 Трудность седьмая - недоразумение

Решив все предыдущие проблемы, все-таки нашли, что там 1 блок? Со строгим отношением продолжайте расследование.

go tool pprof localhost:6060/debug/pprof/block

Как и ожидалось, это был http-мониторинг.

4.8 Восьмая трудность — получение Священных Писаний

Я полагаю, что после множества операций, описанных в предыдущей статье, вы уже знакомы с процессом проверки и содержимым, которое можно проверить.

Вот краткое изложение процедуры устранения неполадок.

Шаг 1: Введите, чтобы исключить соответствующее взаимодействие gdb.

go tool pprof http://localhost:6060/debug/pprof/{填上你想查看的内容}

Ключевые слова содержания:

тип описывать
allocs ВнутриВыборка информации о выделении памяти
blocks блокироватьИнформация о выборке для рабочих условий
cmdline показать запуск программыПараметры командыи его параметры
goroutine показать все текущиесопрограммаинформация о стеке
heap кучаПример информации о распределении памяти на
mutex ЗамокИнформация о выборке для условий гонки
profile cpuИнформация о выборке занятости, нажмите, чтобы загрузить файл
threadcreate системанитьВыборка информации для ситуации создания
trace программавыполнить трассировкуИнформация

Шаг 2: Тройные штрихи, top->list FuncName->web

С помощью анализа коэффициента заполнения проверьте количество конкретных строк кода и просмотрите общую картину для подтверждения.

Шаг 3: Решите проблему.

(Внимательные студенты могут обнаружить, что трассировка не анализируется, пожалуйста, с нетерпением ждите «Краткий обзор трассировки серии Голанга»)

5. Танцы с тестовыми командами

Анализ теста особенно прост, если добавить его после исходной команды.-cpuprofile=cpu.profили-memprofile=mem.profЗатем вы можете получить соответствующий файл для сбора данных.Вы должны понять следующие вещи для тех, кто получил писания.

Пример команды:go test -bench . -cpuprofile cpu.prof

использованная литература

1. Анализ производительности Golang killer PProf

2. голанг ппроф бой

3. Мониторинг производительности и анализ программ Go pprof

4. анализ производительности go pprof

5. Как контролировать сборку мусора программ golang