欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记 Go 的一次profile

程序员文章站 2022-04-30 10:00:53
...

最近在搞p2p的调度,需要做一个tcp的双向代理。最开始只能到20w连接,10w的qps,现在做到了60w 连接,40w qps都没问题。cpu 用了16核,一共24核。

大部分会选择pprof的 web 模式,其他方式可以参看其他博客。操作方式如下:

首先,引入相关包

import (
    "net/http"
    _ "net/http/pprof"
)
然后,启动web程序

go func() {
       http.ListenAndServe(fmt.Sprintf(":%d", config.Main.MonitorPort), nil)
    }()
这样就可以使用pprof提供的profile功能了,功能列表如下:

记 Go 的一次profile

也可以使用curl 查看:

记 Go 的一次profile

那些框住的就是浏览器显示的链接,如显示堆栈是 http://192.168.110.127:8601/debug/pprof/heap?debug=1

但是很多情况下,服务端的端口是有防火墙的,所以需要另外一种使用方式,go tool pprof 方式。

go tool pprof http://localhost:6060/debug/pprof/profile   # 30-second CPU profile
go tool pprof http://localhost:6060/debug/pprof/heap      # heap profile
go tool pprof http://localhost:6060/debug/pprof/block     # goroutine blocking profile

CPU的调试,可以用svg > 1.svg 保存到svg文件,然后用浏览器打开,如:

记 Go 的一次profile

记 Go 的一次profile


可以使用 top N,和 list function 进行查询哪个函数的哪一行耗费cpu高,特别的,需要源文件,没有源文件是不能list 的

记 Go 的一次profile

前三列的分别是,这一行的运行的采样值,这一行的调用函数的采样值,行号。也可以使用disasm function,用汇编替代源代码进行显示。