首页>>后端>>Golang->如何排查Go程序CPU占用过高问题

如何排查Go程序CPU占用过高问题

时间:2023-11-29 本站 点击:0

前言

如果要在 golang 开发过程中进行性能调优,一般需要使用 pprof,本文介绍的是 pprof 工具使用方法。

下载测试代码

go get 中可以获取测试程序, 注意加上 -d 避免下载后自动安装

https://github.com/wolfogre/go-pprof-practice

goget-dgithub.com/wolfogre/go-pprof-practicecd$GOPATH/src/github.com/wolfogre/go-pprof-practice

如果 go get 下载不了,可以 git clone 下载

girclonehttps://github.com/wolfogre/go-pprof-practice

对代码进行编译

然后运行

gomodinitgomodtidy

最后再运行

gobuild./go-pprof-practice

保持程序运行,打开浏览器访问 http://localhost:6060/debug/pprof/,可以看到如下页面:

参数说明

类型描述备注allocs内存分配情况的采样信息可以用浏览器打开,但可读性不高blocks阻塞操作情况的采样信息可以用浏览器打开,但可读性不高cmdline显示程序启动命令及参数可以用浏览器打开,这里会显示 ./go-pprof-practicegoroutine当前所有协程的堆栈信息可以用浏览器打开,但可读性不高heap堆上内存使用情况的采样信息可以用浏览器打开,但可读性不高mutex锁争用情况的采样信息可以用浏览器打开,但可读性不高profileCPU 占用情况的采样信息浏览器打开会下载文件threadcreate系统线程创建情况的采样信息可以用浏览器打开,但可读性不高trace程序运行跟踪信息浏览器打开会下载文件,本文不涉及

代码说明

测试代码程序中 main 函数的说明

import(//略_"net/http/pprof"//会自动注册handler到httpserver,方便通过http接口获取程序运行采样报告//略)funcmain(){//略runtime.GOMAXPROCS(1)//限制CPU使用数,避免过载runtime.SetMutexProfileFraction(1)//开启对锁调用的跟踪runtime.SetBlockProfileRate(1)//开启对阻塞操作的跟踪gofunc(){//启动一个httpserver,注意pprof相关的handler已经自动注册过了iferr:=http.ListenAndServe(":6060",nil);err!=nil{log.Fatal(err)}os.Exit(0)}()//略}

排查 CPU 占用过高问题

可以通过活动监视器查看下 practice 程序的占用。

可以使用 go tool pprof http://localhost:6060/debug/pprof/profile 进行排查。

输入 top 命令, 查看 CPU 占用较高的调用:

可以看到 CPU 占用过高的是 github.com/wolfogre/go-pprof-practice/animal/felidae/tiger.(*Tiger).Eat输入 list Eat,查看问题具体在代码的哪一个位置:

可以看到的是其中一百亿次空循环占用了大量 CPU 时间,因此就定位到了问题。

欢迎关注公众号:程序员财富自由之路

参考资料

https://blog.wolfogre.com/posts/go-ppof-practice/#%E6%8E%92%E6%9F%A5-cpu-%E5%8D%A0%E7%94%A8%E8%BF%87%E9%AB%98

https://geektutu.com/post/hpg-concurrency-control.html


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Golang/224.html