參考資料
- 實戰Go記憶體洩露
- Hi, 使用多年的go pprof檢查記憶體洩漏的方法居然是錯的
- 如何使用pprof見之前的文章使用pprof進行效能分析
分析記憶體洩漏
示例程式碼:
// 記憶體洩漏的例子
package main
import (
"net/http"
_ "net/http/pprof"
"time"
)
func main() {
// 開啟pprof
go func() {
http.ListenAndServe("0.0.0.0:6060", nil)
}()
tick := time.Tick(time.Second / 100)
var buf []byte
for range tick {
buf = append(buf, make([]byte, 1024*1024)...)
}
}
匯出時間點1的堆的profile: curl -s http://127.0.0.1:6060/debug/pprof/heap > base.heap
匯出時間點2的堆的profile: curl -s http://127.0.0.1:6060/debug/pprof/heap > current.heap
對比兩個時間點堆疊的差異:go tool pprof --http :8080 --base base.heap current.heap
分析goroutine洩漏
示例程式碼:
// goroutine洩露導致記憶體洩漏
package main
import (
"net/http"
_ "net/http/pprof"
"time"
)
func main() {
// 開啟pprof
go func() {
http.ListenAndServe("0.0.0.0:6060", nil)
}()
tick := time.Tick(time.Second / 10)
i := 0
for range tick {
i++
go allocFunc(i)
}
}
func allocFunc(i int) {
defer print(i, "\n")
buf := make([]byte, 1024*1024*10)
print(len(buf), " ", i, "\n")
select {}
}
訪問127.0.0.1:6060/debug/pprof/goroutin...
其中展示的資訊如下:
透過持續觀察第一行的goroutine profile total展示的goroutine數量來判斷是否有goroutine洩漏,同時可以檢視其中的goroutine都卡在程式碼的哪一行。
訪問127.0.0.1:6060/debug/pprof/goroutin...
可以檢視其中的goroutine已經執行了多久。
本作品採用《CC 協議》,轉載必須註明作者和本文連結