前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何排查Go 程序 CPU 占用过高问题

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

原创
作者头像
王小明_HIT
修改2021-09-02 14:16:22
4.6K0
修改2021-09-02 14:16:22
举报
文章被收录于专栏:程序员奇点程序员奇点

内推美团:求一份 Java 简历,坐标:北京。 左边二维码有我联系方式

前言

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

下载测试代码

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

Github

代码语言:javascript
复制
go get -d github.com/wolfogre/go-pprof-practice
cd $GOPATH/src/github.com/wolfogre/go-pprof-practice

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

代码语言:javascript
复制
gir clone https://github.com/wolfogre/go-pprof-practice

对代码进行编译

然后运行

代码语言:javascript
复制
go mod init
go mod tidy

最后再运行

代码语言:javascript
复制
go build
./go-pprof-practice

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

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

参数说明

类型

描述

备注

allocs

内存分配情况的采样信息

可以用浏览器打开,但可读性不高

blocks

阻塞操作情况的采样信息

可以用浏览器打开,但可读性不高

cmdline

显示程序启动命令及参数

可以用浏览器打开,这里会显示 ./go-pprof-practice

goroutine

当前所有协程的堆栈信息

可以用浏览器打开,但可读性不高

heap

堆上内存使用情况的采样信息

可以用浏览器打开,但可读性不高

mutex

锁争用情况的采样信息

可以用浏览器打开,但可读性不高

profile

CPU 占用情况的采样信息

浏览器打开会下载文件

threadcreate

系统线程创建情况的采样信息

可以用浏览器打开,但可读性不高

trace

程序运行跟踪信息

浏览器打开会下载文件,本文不涉及

代码说明

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

代码语言:javascript
复制
import (
 // 略
 _ "net/http/pprof" // 会自动注册 handler 到 http server,方便通过 http 接口获取程序运行采样报告
 // 略
)

func main() {
 // 略

 runtime.GOMAXPROCS(1) // 限制 CPU 使用数,避免过载
 runtime.SetMutexProfileFraction(1) // 开启对锁调用的跟踪
 runtime.SetBlockProfileRate(1) // 开启对阻塞操作的跟踪

 go func() {
  // 启动一个 http server,注意 pprof 相关的 handler 已经自动注册过了
  if err := 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 时间,因此就定位到了问题。

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

内推美团:求一份 Java 简历,坐标:北京。 上边二维码有我联系方式

参考资料

  • 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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 下载测试代码
      • 参数说明
      • 代码说明
    • 排查 CPU 占用过高问题
      • 欢迎关注公众号:程序员财富自由之路
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档