[go] pprof 找出效能問題
#
go pprof- golang 程式效能調優
- 在 golang 程式中,有哪些內容需要除錯優化?
- golang 效能除錯優化方法:
- Benchmark:基準測試,對特定程式碼的執行時間和記憶體資訊等進行測試
- Profiling:程式分析,程式的執行畫像,在程式執行期間,通過取樣收集的資料對程式進行分析
- Trace:跟蹤,在程式執行期間,通過採集發生的事件資料對程式進行分析
- profiling 和 trace 有啥區別? profiling 分析沒有時間線,trace 分析有時間線。
- pprof
- Golang中性能剖析 PProf pprof开启后,每隔一段时间(10ms)就会收集下当前的堆栈信息,获取各个函数占用的CPU以及内存资源;最后通过对这些采样数据进行分析,形成一个性能分析报告。
http://127.0.0.1:6060/debug/pprof/ /debug/pprof/profile:访问这个链接会自动进行 CPU profiling,持续 30s,并生成一个文件供下载
/debug/pprof/block:Goroutine阻塞事件的记录。默认每发生一次阻塞事件时取样一次。
/debug/pprof/goroutines:活跃Goroutine的信息的记录。仅在获取时取样一次。
/debug/pprof/heap: 堆内存分配情况的记录。默认每分配512K字节时取样一次。
/debug/pprof/mutex: 查看争用互斥锁的持有者。
/debug/pprof/threadcreate: 系统线程创建情况的记录。 仅在获取时取样一次。
- 获取的 Profiling 数据是动态的,要想获得有效的数据,请保证应用处于较大的负载
#
生產環境到底可不可以用??- 你不知道的 Go 之 pprof
- CPU profiling/Memory profiling 代码编译自動寫入到某文件裡
- 如果线上遇到 CPU 或内存占用过高,该怎么办呢?总不能将上面的 Profile 代码编译到生产环境吧,这无疑会极大地影响性能。
net/http/pprof提供了一个方法,不使用时不会造成任何影响
,遇到问题时可以开启 profiling 帮助我们排查问题。我们只需要使用import这个包,然后在一个新的 goroutine 中调用http.ListenAndServe()在某个端口启动一个默认的 HTTP 服务器即可
- 你的 pprof 暴露了
- 安全问题 :显示函数名与文件路径:可能揭示商业敏感信息,分析会降低性能,为 DoS 攻击增加助攻
- 预防 :需要安排两台HTTP服务器 pprof服务监听本地6060端口并且限于本地访问
- net/http/pprof 是很强大,但是请不要让你的调试信息暴露给全世界,遵循以上预防措施,你会没事的。
- is it ok to use golang pprof on production without effecting performance?
- Jaana Dogan (AWS技術總監@@) does say in her article "Continuous Profiling of Go programs"
- pprof is safe to use in production.We target an additional 5% overhead for CPU and heap allocation profiling.
- Continuous Profiling of Go programs
- 但這篇文章他講的是Google Cloud Profiler的產品 https://cloud.google.com/profiler/ @@
- 問題:[Day 17] Oops!Golang - 讓我們來抓出吃資源的兇手! net/http/pprof只能再遇到問題時去下,才能抓到問題 回覆: 如果你有使用GCP他們有幫你搜集起來,可以找到特定區間的資料,蠻方便的。 可以參考此篇 Quickstart: Exploring Profiler
- 高效能 Golang 程式 — 效能測量及分析
- 當 CPU 分析啟用時,runtime 會每隔 10ms 中斷一次,並且紀錄當前運行 goroutines 的 stack trace
- 千萬不要同時使用多種分析工具
-->自問自答 對!!
另外,https://github.com/google/pprof 的 pprof 功能更完整,它的網頁介面已支援 flamegraph。資料多的時候,應該比較方便了解大體情況。 安裝和用法如下: $ go get github.com/google/pprof $ pprof -http=0.0.0.0:8080 profile.out 注意這裡直接用 pprof,而不是用 Go 內建的 go tool pprof。 https://medium.com/@fcamel/go-%E7%9A%84-cpu-%E5%92%8C-blocking-profiling-a8bc3d902a3f
- Golang性能分析和监控
- 提到tool pprof 和 package pprof
- Prometheus 用法
#
效能分析的文章- Go 语言高性能编程
- 第一章 性能分析 并发编程 控制协程的并发数量 sync.Pool 复用对象 编译优化 逃逸分析对性能的影响