Отличительной особенностью стандартной библиотеки 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 показан поток информации при выполнении.