предисловие
Это статья для пользователей сети. Я только недавно исследовал и проанализировал производительность 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
3. Мониторинг производительности и анализ программ Go pprof