Merging other languages
This commit is contained in:
215
en/14.6.md
215
en/14.6.md
@@ -1,105 +1,110 @@
|
||||
# 14.6 pprof支持
|
||||
Go语言有一个非常棒的设计就是标准库里面带有代码的性能监控工具,在两个地方有包:
|
||||
|
||||
net/http/pprof
|
||||
|
||||
runtime/pprof
|
||||
|
||||
其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来
|
||||
|
||||
## beego支持pprof
|
||||
目前beego框架新增了pprof,该特性默认是不开启的,如果你需要测试性能,查看相应的执行goroutine之类的信息,其实Go的默认包"net/http/pprof"已经具有该功能,如果按照Go默认的方式执行Web,默认就可以使用,但是由于beego重新封装了ServHTTP函数,默认的包是无法开启该功能的,所以需要对beego的内部改造支持pprof。
|
||||
|
||||
- 首先在beego.Run函数中根据变量是否自动加载性能包
|
||||
|
||||
if PprofOn {
|
||||
BeeApp.RegisterController(`/debug/pprof`, &ProfController{})
|
||||
BeeApp.RegisterController(`/debug/pprof/:pp([\w]+)`, &ProfController{})
|
||||
}
|
||||
|
||||
- 设计ProfConterller
|
||||
|
||||
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:
|
||||
|
||||
beego.PprofOn = true
|
||||
|
||||
然后你就可以在浏览器中打开如下URL就看到如下界面:
|
||||

|
||||
|
||||
图14.7 系统当前goroutine、heap、thread信息
|
||||
|
||||
点击goroutine我们可以看到很多详细的信息:
|
||||
|
||||

|
||||
|
||||
图14.8 显示当前goroutine的详细信息
|
||||
|
||||
我们还可以通过命令行获取更多详细的信息
|
||||
|
||||
go tool pprof http://localhost:8080/debug/pprof/profile
|
||||
|
||||
这时候程序就会进入30秒的profile收集时间,在这段时间内拼命刷新浏览器上的页面,尽量让cpu占用性能产生数据。
|
||||
|
||||
(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 展示的执行流程信息
|
||||
|
||||
## links
|
||||
* [目录](<preface.md>)
|
||||
* 上一节: [多语言支持](<14.5.md>)
|
||||
* 下一节: [小结](<14.7.md>)
|
||||
# 14.6 pprof
|
||||
|
||||
Go language has a great design is the standard library with code performance monitoring tools, there are packages in two places:
|
||||
|
||||
net/http/pprof
|
||||
|
||||
runtime/pprof
|
||||
|
||||
In fact, `net/http/pprof` in just using `runtime/pprof` package for packaging a bit, and exposed on the http port
|
||||
|
||||
## Beego support pprof
|
||||
|
||||
Currently beego framework adds pprof, this feature is not turned on by default, if you need to test performance, view the execution goroutine such information, in fact, Go's default package "net/http/pprof" already has this feature, and if Go manner in accordance with the default Web, you can use the default, but because beego repackaged ServHTTP function, so if you can not open the default includes this feature, so the need for internal reform beego support pprof.
|
||||
|
||||
- First in beego.Run function automatically according to whether the variable load performance pack
|
||||
|
||||
if PprofOn {
|
||||
BeeApp.RegisterController(`/debug/pprof`, &ProfController{})
|
||||
BeeApp.RegisterController(`/debug/pprof/:pp([\w]+)`, &ProfController{})
|
||||
}
|
||||
|
||||
- Design ProfConterller
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
|
||||
## Getting started
|
||||
|
||||
Through the above design, you can use the following code to open pprof:
|
||||
|
||||
beego.PprofOn = true
|
||||
|
||||
Then you can open in a browser the following URL to see the following interface:
|
||||
|
||||

|
||||
|
||||
Figure 14.7 current system goroutine, heap, thread information
|
||||
|
||||
Click goroutine we can see a lot of detailed information:
|
||||
|
||||

|
||||
|
||||
Figure 14.8 shows the current goroutine details
|
||||
|
||||
We can also get more details from the command line information
|
||||
|
||||
go tool pprof http://localhost:8080/debug/pprof/profile
|
||||
|
||||
This time the program will enter the profile collection time of 30 seconds, during which time desperately to refresh the page on the browser, try to make cpu usage performance data.
|
||||
|
||||
(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
|
||||
|
||||

|
||||
|
||||
Figure 14.9 shows the execution flow of information
|
||||
|
||||
## Links
|
||||
|
||||
- [Directory](preface.md)
|
||||
- Previous section: [Multi-language support](14.5.md)
|
||||
- Next section: [Summary](14.7.md)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user