我安装了一个用Go写的http服务器,每天有上千名访客。我有一个不断积累的戈鲁丁问题(从来没有得到解放)。在一天的时间里,我似乎从http服务器上得到了一千多个新的Goroutines,我使用pprof来检查问题的来源,我得到了这样的结果:
链接:内存消耗: SVG pprof

堆:

下面是我的两个大猩猩
500 @ 0x410255 0x5a9255 0x5a9e25 0x5aa615 0x5990cf 0x5ada95 0x59d23f 0x4367b1
# 0x5a9255 net._C2func_getaddrinfo+0x55 /usr/local/go/src/net/:26
# 0x5a9e25 net.cgoLookupIPCNAME+0x1c5 /usr/local/go/src/net/cgo_unix.go:96
# 0x5aa615 net.cgoLookupIP+0x65 /usr/local/go/src/net/cgo_unix.go:148
# 0x5990cf net.lookupIP+0x5f /usr/local/go/src/net/lookup_unix.go:64
# 0x5ada95 net.func·026+0x55 /usr/local/go/src/net/lookup.go:79
# 0x59d23f net.(*singleflight).doCall+0x2f /usr/local/go/src/net/singleflight.go:91
157871 @ 0x423985 0x4239f8 0x411464 0x410c93 0x5a9d68 0x5aa615 0x5990cf 0x5ada95 0x59d23f 0x4367b1
# 0x5a9d68 net.cgoLookupIPCNAME+0x108 /usr/local/go/src/net/cgo_unix.go:85
# 0x5aa615 net.cgoLookupIP+0x65 /usr/local/go/src/net/cgo_unix.go:148
# 0x5990cf net.lookupIP+0x5f /usr/local/go/src/net/lookup_unix.go:64
# 0x5ada95 net.func·026+0x55 /usr/local/go/src/net/lookup.go:79
# 0x59d23f net.(*singleflight).doCall+0x2f /usr/local/go/src/net/singleflight.go:91在这里我们可以看到,singleflight.go占据了大部分的goroutints,它是一个Go的本地库。
我的代码在这个函数中乱七八糟
func getXmlVast(url string) (string, error) {
resp, err := http.Get(url)
if err != nil {
return "", errors.New("request error A(" + err.Error() + ")")
}
defer resp.Body.Close()
// read xml http response
xmlData, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", errors.New("request error B(" + err.Error() + ")")
}
return string(xmlData), nil
}为什么Go从来没有解放过大猩猩,以及singleflight.go做了什么。
发布于 2015-08-07 08:54:45
我更新了我的围棋版本从1.4到1.5,它解决了问题。
我以前做过一些研究,找出问题的来源,我注意到很多人都有同样的问题,但没有人知道为什么。我认为问题出在http/net库中,因为正如我在问题中所说的,使用单飞的函数最多,这个函数是http.Get(url)调用的。
https://stackoverflow.com/questions/31788888
复制相似问题