分析記憶體洩漏和goroutine洩漏

xing393939發表於2021-10-22

參考資料

分析記憶體洩漏

示例程式碼:

// 記憶體洩漏的例子
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 協議》,轉載必須註明作者和本文連結

相關文章