记 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功能了,功能列表如下:
也可以使用curl 查看:
那些框住的就是浏览器显示的链接,如显示堆栈是 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文件,然后用浏览器打开,如:
可以使用 top N,和 list function 进行查询哪个函数的哪一行耗费cpu高,特别的,需要源文件,没有源文件是不能list 的
前三列的分别是,这一行的运行的采样值,这一行的调用函数的采样值,行号。也可以使用disasm function,用汇编替代源代码进行显示。