专栏首页程序员财富自由之路如何排查Go 程序 CPU 占用过高问题
原创

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

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

前言

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

下载测试代码

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

Github

go get -d github.com/wolfogre/go-pprof-practice
cd $GOPATH/src/github.com/wolfogre/go-pprof-practice

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

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

对代码进行编译

然后运行

go mod init
go mod tidy

最后再运行

go build
./go-pprof-practice

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

在这里插入图片描述

参数说明

类型

描述

备注

allocs

内存分配情况的采样信息

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

blocks

阻塞操作情况的采样信息

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

cmdline

显示程序启动命令及参数

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

goroutine

当前所有协程的堆栈信息

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

heap

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

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

mutex

锁争用情况的采样信息

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

profile

CPU 占用情况的采样信息

浏览器打开会下载文件

threadcreate

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

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

trace

程序运行跟踪信息

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

代码说明

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

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CPU 占用过高问题排查

    2、找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:

    王小明_HIT
  • 排查 Go 程序内存占用高问题

    可以看到这次出问题的地方在 github.com/wolfogre/go-pprof-practice/animal/muridae/mouse.(*Mouse...

    王小明_HIT
  • Go 排查内存占用过高问题

    可以看到这次出问题的地方在 github.com/wolfogre/go-pprof-practice/animal/muridae/mouse.(*Mouse...

    王小明_HIT
  • ​高频面试题:Java程序占用 CPU 过高怎么排查

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的。

    捡田螺的小男孩
  • 记一次 MongoDB 占用 CPU 过高问题的排查

    今天查看监控无意间突然发现自己的服务器上,CPU 占用率飙升到 100%,load 升到 10 以上,登录的响应已经达到半分钟

    拓荒者
  • 关于JVM CPU资源占用过高的问题排查

    一、背景:     先执行一个java程序里面开了两个线程分别都在while循环做打印操作。 # java -cp ./test-threads.jar...

    囚兔
  • java 一次CPU占用过高问题的排查及解决

    最近一段时间  某台服务器上的一个应用总是隔一段时间就自己挂掉      用top看了看  从重新部署应用开始没有多长时间CPU占用上升得很快  

    江湖前辈黄药师
  • 面试杂谈 - CPU占用高如何排查

    acupt
  • cpu使用率过高和jvm old占用过高排查过程

    占用cpu过高的线程有两个,其中一个是打印异常日志的(会new 对象),还有gc线程

    每天晒白牙
  • Docker 容器内分析 java程序占用 cpu 高问题排查分析

    我们目前所有的 java 服务都是封装在 docker 里面的,今天做压力容量测试的时候发现有个服务占用cpu 300%,想找到是这个 java 程序的那个线程...

    张琳兮
  • 线上Java程序占用 CPU 过高,请说一下排查方法?

    运行这段程序后,前面 10 个线程都处于休眠状态,只有最后一个线程会持续的占用 CPU 。

    古时的风筝
  • 记一次线上Java程序导致服务器CPU占用率过高的问题排除过程

    使用top命令查看资源占用情况,发现pid为14063的进程占用了大量的CPU资源,CPU占用率高达776.1%,内存占用率也达到了29.8%

    会跳舞的机器人
  • 记一次 JVM CPU 使用率飙高问题的排查过程

    如上图所示,在 下午3:45 分之前,CPU 的使用率明显飙高,最高飙到近 100%,为什么会出现这样的现象呢?

    CG国斌
  • 【实践】golang pprof 实战-CPU,heap,alloc,goroutine,mutex,block

    如果要说在 golang 开发过程进行性能调优,pprof 一定是一个大杀器般的工具。但在网上找到的教程都偏向简略,难寻真的能应用于实战的教程。这也无可厚非,毕...

    辉哥
  • 如何在.NET应用程序中分析CPU使用率过高的问题

    原文来自互联网,由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权,请联系小编,小编将在24小时内删除。限于译者的能力有限,个别语句翻译略显生硬,还请见...

    心莱科技雪雁
  • 【Rust日报】2021-06-09 如何在生产环境排查 Rust 内存占用过高问题

    TensorBase 是第一个在真正的 RISC-V 芯片上运行的 SQL 数据库

    MikeLoveRust
  • linux下java程序占用CPU和内存过高排错处理方案

    2:使用top -p pid 针对你所要查的pid查看这个进程的CPU和内存以及负载情况

    用户5166556
  • 一个正则表达式导致 CPU 高的问题排查过程

    这篇文章记录一个正则表达是导致 CPU 高的问题排查。由于无法直接使用线上的代码测试,所以我自己把代码整理了下来,具体代码如下:

    付威
  • Linux系统中CPU占用率较高问题排查思路与解决方法

    作为 Linux 运维工程师,在日常工作中我们会遇到 Linux服务器上出现CPU负载达到100%居高不下的情况,如果CPU 持续跑高,则会影响业务系统的正常运...

    砸漏

扫码关注云+社区

领取腾讯云代金券