更新时间 2022-07-15
内置(推荐)
在 go-zero 中的 core/proc 已经内置了 pprof 的记录,只需要一个命令,先查询程序的进程 ID,然后运行如下命令:
kill -USR2 [pid]
运行后日志文件中会输出 pprof 的文件的保存路径。
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fd54b0f25-9426-4b83-9c51-2e6165a030b2%2F380a6b69-965f-48f0-b6a1-5ad0bf30481b%2FUntitled.png%3Ftable%3Dblock%26id%3Dbc80ac76-ef4a-4f9b-bfda-06965ff9c932%26spaceId%3Dd54b0f25-9426-4b83-9c51-2e6165a030b2%26expirationTimestamp%3D1725760800000%26signature%3DAoMYKYRLCMU8ETrXye3Nu9ouDH_0HDzOaJmTdUOifIw?table=block&id=bc80ac76-ef4a-4f9b-bfda-06965ff9c932&cache=v2)
然后在 /tmp 目录下找到所需要的 pprof 文件进行分析就行。
web pprof
在 go-zero 框架中,没有支持 web pprof,因此需要我们手动小改下。
首先通过 api 文件已经生成了项目,然后打开入口文件,更改内容如下:
package main import ( //... _ "net/http/pprof" //... ) var configFile = flag.String("f", "etc/bigdataapi-api.yaml", "the config file") function main() { flag.Parse() var c config.Config conf.MustLoad(*configFile, &c) ctx := svc.NewServiceContext(c) svcGroup := service.NewServiceGroup() defer svcGroup.Stop() server := rest.MustNewServer(c.RestConf) svcGroup.Add(server) svcGroup.Add(pprofServer{}) handler.RegisterHandlers(server, ctx) fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port) svcGroup.Start() } type pprofServer struct{} func (pprofServer) Start() { addr := "0.0.0.0:8080" fmt.Printf("Start pprof server, listen addr %s\n", addr) err := http.ListenAndServe(addr, nil) if err != nil { log.Fatal(err) } } func (pprofServer) Stop() { fmt.Printf("Stop pprof server\n") }
解释:
通过 ServiceGroup 工具,创建一个新的端口用于 pprof 监听。