要写一个 goroutine 泄漏的小 demo ,但是通过 pprof 分析时无法定位到有问题的代码。大神帮忙看看我的使用方式哪里不对呢?
code:
package main
import (
"log"
"net/http"
_ "net/http/pprof"
)
func main() {
req, err := http.NewRequest( http.MethodGet, "https://baidu.com", nil)
if err != nil {
log.Panicln(err)
}
client := http.Client{}
for i := 0; i < 100; i++ {
// 没有释放资源,会导致 goroutine 泄漏,一个请求会创建两个 goroutine
client.Do(req)
}
http.ListenAndServe(":8080", nil)
}
通过 pprof web 界面分析得到结果:
goroutine profile: total 205
100 @ 0x1038916 0x1048412 0x122046a 0x10682a1
# 0x1220469 net/http.(*persistConn).readLoop+0xd89 /usr/local/go/src/net/http/transport.go:2207
100 @ 0x1038916 0x1048412 0x122155b 0x10682a1
# 0x122155a net/http.(*persistConn).writeLoop+0xfa /usr/local/go/src/net/http/transport.go:2386
2 @ 0x1038916 0x1031473 0x1062aa9 0x10a76d2 0x10a827a 0x10a8268 0x1140d49 0x114b385 0x120284d 0x1109dc3 0x110a92f 0x110ab87 0x11a2799 0x11feb79 0x11feb7a 0x1203c05
...
只能定位到是发送 http 请求是没有关闭资源导致的,但是没有办法定位到 client.Do(req)
这行。
这个如何定位呢?还是说用 pprof 无法定位到具体代码呢?
1
bianzhifu 2021-12-25 11:35:58 +08:00
|