Go 语言的 HTTP 标准库中的内存泄漏问题? 已翻译 100%

oschina 投递于 2014/01/13 07:04 (共 2 段, 翻译完成于 01-13)
阅读 5371
收藏 29
Go
2
加载中

使用一个go库实现的一个http服务器:

package main

import (
    "net/http"
)

func main() {
    http.ListenAndServe(":8080", nil)
}

它将使用大约850kb的内存启动.通过你的浏览器向它发送一些请求. 你会观察到它(内存的使用)迅速上升到1mb. 如果你等着,你会发现它从来不会降下来. 现在(使用下面的脚本)用 Apache Bench 动一下它,你会发现内存使用仍然在增长. 一段时间过后它最终会维持在8.2mb左右.

Edit编辑: 看起来它并不会止步于8.2,而它的增长速度会显著减慢。现在它处在9.2的水平,并且仍然在增长.

LeoXu
LeoXu
翻译于 2014/01/13 08:09
1

总之,为什么会发生这样的事情呢?我使用了这段shell脚本一探究竟:

while [ true ]
do
    ab -n 1000 -c 100 http://127.0.0.1:8080/
    sleep 1
end

然后尝试获得这个的底线, 我已经尝试过调整设置. 试过使用r.Close = true 来阻止 Keep-Alive. 没有任何东西看起来是起作用的.

当我尝试去判断我正在编写的程序是否存在内存泄露时,我发现了这个问题的来由. 它有大量的http处理器和I/O调用. 检查过后我已经关闭了我所有的数据库链接,我继续观察,仍然会看到内存使用继续上升. 我的程序内存使用会维持在 433 MB 左右.

这里是 Goenv 的输出:

GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/mark/Documents/Programming/Go"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
TERM="dumb"
CC="clang"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fno-common"
CXX="clang++"
CGO_ENABLED="1"

该问题已有最佳答案,详情请看

http://stackoverflow.com/questions/21080642/memory-leak-in-go-http-standard-library

LeoXu
LeoXu
翻译于 2014/01/13 08:15
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(19)

lubia
lubia
明显不过脑子的翻译,这种基本库如果有这么明显的问题,你当这么多人傻了吧
Risol
Risol
一楼要是回头看下,会不会尴尬了?小伙伴们都说没问题啊
akirakazu
akirakazu

引用来自“羊半仙”的评论

引用来自“akirakazu”的评论

原帖作者在瞎搞,他用了第三方的gorilla/sessions库,又不用相对应的router,才造成了内存泄漏。
更离奇的是还不告诉别人他用了第三方库,就怀疑是standard library有问题。

这就是所谓低级黑,标题党?

oschina翻译他这帖,又不把评论翻译进来,这才是低级黑
不及阁大学士
不及阁大学士
真够扯淡的,这么明显的内存泄露,谷歌的大牛们会发现不了?
HilerChen
HilerChen
go version go1.2 linux/386 文章中的测试方法 增长至 5.2M 后保持不变。
狗头666
狗头666

引用来自“akirakazu”的评论

原帖作者在瞎搞,他用了第三方的gorilla/sessions库,又不用相对应的router,才造成了内存泄漏。
更离奇的是还不告诉别人他用了第三方库,就怀疑是standard library有问题。

这就是所谓低级黑,标题党?
我是菜菜
我是菜菜
几十万次后 稳定到 3m多点
akirakazu
akirakazu
原帖作者在瞎搞,他用了第三方的gorilla/sessions库,又不用相对应的router,才造成了内存泄漏。
更离奇的是还不告诉别人他用了第三方库,就怀疑是standard library有问题。
z
zhujiang
go1.2 测试了,保持2MB
红烧土豆
红烧土豆
这个应该是go的早期版本吧,我有一个运行在windows下。go 1.2,一直稳定运行2个多月。内存在2m。
返回顶部
顶部