go中有pprof包来做代码的性能监控,在两个地方有包:

net/http/pprof

runtime/pprof

其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来

pprof包

web 服务器

如果你的go程序是用http包启动的web服务器,你想查看自己的web服务器的状态。这个时候就可以选择net/http/pprof。你只需要引入包_"net/http/pprof",然后就可以在浏览器中使用http://localhost:port/debug/pprof/直接看到当前web服务的状态,包括CPU占用情况和内存使用情况等。具体使用情况你可以看godoc的说明。

服务进程

如果你的go程序不是web服务器,而是一个服务进程,那么你也可以选择使用net/http/pprof包,同样引入包net/http/pprof,然后在开启另外一个goroutine来开启端口监听。

比如:

go func() {log.Println(http.ListenAndServe("localhost:6060", nil)) 

}()

应用程序

如果你的go程序只是一个应用程序,比如计算fabonacci数列,那么你就不能使用net/http/pprof包了,你就需要使用到runtime/pprof。具体做法就是用到pprof.StartCPUProfile和pprof.StopCPUProfile。比如下面的例子:

var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")

func main() {    flag.Parse()    if *cpuprofile != "" {        f, err := os.Create(*cpuprofile)        if err != nil {            log.Fatal(err)        }        pprof.StartCPUProfile(f)        defer pprof.StopCPUProfile()    }

运行程序的时候加一个--cpuprofile参数,比如fabonacci --cpuprofile=fabonacci.prof

这样程序运行的时候的cpu信息就会记录到XXX.prof中了。

下一步就可以使用这个prof信息做出性能分析图了(需要安装graphviz)。

使用go tool pprof (应用程序) (应用程序的prof文件)

进入到pprof,使用web命令就会在/tmp下生成svg文件,svg文件是可以在浏览器下看的。像这个样子:

如果你的程序非常简单,比如只有println一个语句,你用pprof.StartCPUProfile是打印不出任何东西的。

举例

下面拿go-tour举个例子,这是个web程序,我在代码中加入了

_ "net/http/pprof"

在浏览器中我就可以直接看prof信息了

生成CPU状态分析图

下面我们想要生成CPU状态分析图,调用go tool pprof http://localhost:3999/debug/pprof/profile

就会进入30秒的profile收集时间,在这段事件内猛刷新点击go-tour浏览器上的页面,尽量让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

参考

http://blog.golang.org/2011/06/profiling-go-programs.html

这篇官方文章说得很仔细了,但是要注意,将里面的gopprof工具换成go tool pprof就行了

转载于:https://www.cnblogs.com/mafeng/p/7323812.html

Go -- pprof协程监控相关推荐

  1. k8s与监控--从telegraf改造谈golang多协程精确控制

    从telegraf改造谈golang多协程精确控制 前言 telegraf是infuxdb公司开源出来的一个基于插件机制的收集metrics的 项目.整个架构和elastic公司的日志收集系统极其类似 ...

  2. python中的协程(二)

    协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞在原地,该线程内的其他 ...

  3. java 协程 实现 Akka

    2019独角兽企业重金招聘Python工程师标准>>> java 协程 实现 Akka 博客分类: java Akka是开源的,可以通过Apache 2许可获得.可以从 http:/ ...

  4. 网关技术选型,为什么选择 Openresty ?事件驱动、协程...

    今天跟大家聊下关于网关的话题 互联网公司,不论体量大小如何,其内部的技术架构基本都是相似的,体现在以下几个方面: 数据量过大,如何定制化存储 访问量高了,如何集群化部署,流量负载均衡 响应速度慢了,如 ...

  5. rabbitmq 查询版本_Hyperf 发布 v2.0.14 版本 | 企业级的 PHP 微服务云原生协程框架

    更新内容 本周主要新增了 hyperf/scout hyperf/resource 和 hyperf/resource-grpc 三个组件,并修复了一些组件的 Bug,继续提升 Hyperf 的稳定性 ...

  6. API聚合网关技术选型参考-网友实战-使用协程

    2019独角兽企业重金招聘Python工程师标准>>> http://www.open-open.com/lib/view/open1468892776625.html 最近遇到的一 ...

  7. Day10-Python3基础-协程、异步IO、redis缓存、rabbitMQ队列

    内容目录: Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko S ...

  8. 操作系统的线程和进程的区别_进程,线程,协程,有何区别?

    进程 ​ cpu是计算机的核心,主要处理计算机的计算任务.操作系统是计算机的管理员,它负责任务的调度,资源的管理和分配,统一管理计算机的硬件资源.应用程序则是具有某种功能的程序,应用程序运行于操作系统 ...

  9. python3之协程(3)---greenlet实现协程操作

    原文链接:https://www.cnblogs.com/xybaby/p/6337944.html 正文 在前面的文章中提到python原生的generator是semicoroutine,而gre ...

最新文章

  1. Navisworks Api Quantification
  2. android 调用本地第三方应用软件,如qq、微信、微博和视频播放器等
  3. adb.exe可能被其他程序关闭_木工中央除尘设备系统正式运行的操作程序
  4. 【1】C++语法与数据结构之C语言学生管理系统转C++学生管理系统
  5. 前端学习(3132):react-hello-react之react中事件处理
  6. 数据结构:在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( )
  7. gcc学习(二)[第二版]
  8. 知道路程时间求加速度_人教版高中物理必修一重点知识点—加速度分析与讲解...
  9. override和new的区别
  10. 淘宝技术这十年——光棍节的狂欢
  11. cmake Can‘t find third_party/gtest
  12. QT_布局管理器 网格布局管理器 QGridLayout 超简单
  13. DevExpress中使用ChartControl绘制折线图和导出图表为Excel文件
  14. 《SAP从入门到精通》——导读
  15. 使用 pyecharts 以及matplotlib分析猫眼哪吒影评
  16. Python爬虫——新浪微博登陆
  17. MySQL数据库之分库分表方案
  18. JZOJ 3339. 【NOI2013模拟】wyl8899和法法塔的游戏
  19. [树莓派 PICO(基于MicroPython)]基础教程02-按键测试、按键控制外设LED开关
  20. [CTSC2016]时空旅行(线段树+凸包)

热门文章

  1. 项目管理三大认证体系,该选择谁?
  2. C# OracleParameter 传参 实例
  3. Android爬坑之旅:软键盘挡住输入框问题的终极解决方案
  4. multipart/form-data ajax 提交问题(未解决)
  5. sencha touch 组件选择器getCmp和ComponentQuery.query()的效率解析
  6. ReSharper 配置及用法(转)
  7. 高级性能服务器编程模型【IOCP完成端口】开发实现【二】
  8. [收集] C++ memset ,memcpy 和strcpy 的区别
  9. 用单循环链表实现约瑟夫问题。
  10. tensorflow.reshap(tensor,shape,name)的使用说明