Отличительной особенностью стандартной библиотеки Go являются инструменты мониторинга производительности кода. Эти пакеты существуют в двух местах:
net/http/pprof
runtime/pprof
На самом деле net/http/pprof
просто предоставляет данные профилирования во время выполнения из пакета runtime/pprof
на HTTP-порту.
поддержка pprof в Beego
Платформа Beego в настоящее время поддерживает pprof, однако по умолчанию он не включен. Если вам нужно проверить производительность вашего приложения (например, просмотрев горутин выполнения), такая информация из стандартного пакета Go «net/http/pprof» уже имеет эту функцию. Поскольку beego переупаковала функцию ServHTTP, вы не можете открыть функцию по умолчанию, включенную в pprof. Это привело к тому, что beego поддержала pprof внутри компании.
- Сначала в нашей функции
beego.Run
мы выбираем, следует ли автоматически загружать пакет производительности в соответствии с нашей переменной конфигурации (в данном случае PprofOn): if PprofOn { BeeApp.RegisterController(`/debug/pprof`, &ProfController{}) BeeApp.RegisterController(`/debug/pprof/:pp([\w]+)`, &ProfController{}) }
- Проектирование
ProfController
package beego import ( "net/http/pprof" ) type ProfController struct { Controller } func (this *ProfController) Get() { switch this.Ctx.Params[":pp"] { default: pprof.Index(this.Ctx.ResponseWriter, this.Ctx.Request) case "": pprof.Index(this.Ctx.ResponseWriter, this.Ctx.Request) case "cmdline": pprof.Cmdline(this.Ctx.ResponseWriter, this.Ctx.Request) case "profile": pprof.Profile(this.Ctx.ResponseWriter, this.Ctx.Request) case "symbol": pprof.Symbol(this.Ctx.ResponseWriter, this.Ctx.Request) } this.Ctx.ResponseWriter.WriteHeader(200) }
Начиная
Из приведенного выше видно, что включить pprof так же просто, как установить для переменной конфигурации PprofOn
значение true
:
beego.PprofOn = true
Затем вы можете открыть следующий URL-адрес в своем браузере, чтобы увидеть следующий интерфейс:
Рисунок 14.7. Текущая горутина системы, куча, информация о потоке
Нажав на горутину, мы можем увидеть много подробной информации:
На рис. 14.8 показаны детали текущей горутины.
Конечно, мы также можем получить более подробную информацию из командной строки:
go tool pprof http://localhost:8080/debug/pprof/profile
На этот раз программа начнет профилировать приложение в течение 30 секунд, в течение которых она будет неоднократно обновлять страницу в браузере, пытаясь собрать данные об использовании ЦП и производительности.
(pprof) top10
Total: 3 samples
1 33.3% 33.3% 1 33.3% MHeap_AllocLocked
1 33.3% 66.7% 1 33.3% os/exec.(*Cmd).closeDescriptors
1 33.3% 100.0% 1 33.3% runtime.sigprocmask
0 0.0% 100.0% 1 33.3% MCentral_Grow
0 0.0% 100.0% 2 66.7% main.Compile
0 0.0% 100.0% 2 66.7% main.compile
0 0.0% 100.0% 2 66.7% main.run
0 0.0% 100.0% 1 33.3% makeslice1
0 0.0% 100.0% 2 66.7% net/http.(*ServeMux).ServeHTTP
0 0.0% 100.0% 2 66.7% net/http.(*conn).serve
(pprof)web
На рис. 14.9 показан поток информации при выполнении.