Cpu 暴涨 内存溢出

whispermemory · 2013-07-17 05:56:16 · 6766 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-07-17 05:56:16 的主题,其中的信息可能已经有所发展或是发生改变。

使用 go 1.1.1 编译在 linux i386 上。Cpu 利用率 %100. 老是崩溃 out of memory。

fatal error: runtime: out of memory

goroutine 1 [running]:

[fp=0xf7abdd34] runtime.throw(0x8277cf7)

    /usr/local/go/src/pkg/runtime/panic.c:473 +0x66

[fp=0xf7abdd54] runtime.SysMap(0x28300000, 0xe0020000)

    /usr/local/go/src/pkg/runtime/mem_linux.c:131 +0x7c

[fp=0xf7abdd64] runtime.MHeap_MapBits(0xf7b1d000)

    /usr/local/go/src/pkg/runtime/mgc0.c:2413 +0x84

[fp=0xf7abdd84] runtime.MHeap_SysAlloc(0xf7b1d000, 0x100000)

    /usr/local/go/src/pkg/runtime/zmalloc_linux_386.c:362 +0x11d

[fp=0xf7abddac] MHeap_Grow(0xf7b1d000, 0x10)

    /usr/local/go/src/pkg/runtime/mheap.c:224 +0x50

[fp=0xf7abddcc] MHeap_AllocLocked(0xf7b1d000, 0x1, 0x8)

    /usr/local/go/src/pkg/runtime/mheap.c:108 +0x287

[fp=0xf7abdde0] runtime.MHeap_Alloc(0xf7b1d000, 0x1, 0x8, 0x0, 0x1, ...)

    /usr/local/go/src/pkg/runtime/mheap.c:77 +0x5d

[fp=0xf7abde18] MCentral_Grow(0xf7f21280)

    /usr/local/go/src/pkg/runtime/mcentral.c:203 +0x82

[fp=0xf7abde3c] runtime.MCentral_AllocList(0xf7f21280, 0x20, 0xf7abde50)

    /usr/local/go/src/pkg/runtime/mcentral.c:47 +0x4d

[fp=0xf7abde5c] runtime.MCache_Alloc(0xf7afd000, 0x8, 0x70, 0x1)

    /usr/local/go/src/pkg/runtime/mcache.c:24 +0x73

[fp=0xf7abde8c] runtime.mallocgc(0x70, 0x1, 0x1, 0x1)

    /usr/local/go/src/pkg/runtime/zmalloc_linux_386.c:47 +0xe1

[fp=0xf7abdea4] runtime.new()
    /usr/local/go/src/pkg/runtime/zmalloc_linux_386.c:628 +0x53

[fp=0xf7abdec4] syscall.Accept(0x3, 0x16, 0x0, 0x0, 0x0, ...)
    /usr/local/go/src/pkg/syscall/syscall_linux.go:428 +0x49

[fp=0xf7abdef8] net.accept(0x3, 0x0, 0x0, 0x0, 0x1, ...)
    /usr/local/go/src/pkg/net/sock_cloexec.go:57 +0xb5
[fp=0xf7abdf38] net.(*netFD).accept(0x18362780, 0x81c5070, 0x0, 0x0, 0x0, ...)

    /usr/local/go/src/pkg/net/fd_unix.go:382 +0x17e
[fp=0xf7abdf50] net.(*TCPListener).AcceptTCP(0x18300508, 0x0, 0x186805e0, 0x981fe9c0)

    /usr/local/go/src/pkg/net/tcpsock_posix.go:229 +0x42
[fp=0xf7abdf68] net.(*TCPListener).Accept(0x18300508, 0x1, 0x1, 0x8154480, 0x981fc420, ...)

    /usr/local/go/src/pkg/net/tcpsock_posix.go:239 +0x29
[fp=0xf7abdfc4] main.main()

@polaris


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6766 次点击  
加入收藏 微博
7 回复  |  直到 2013-07-22 12:30:49
whispermemory
whispermemory · #1 · 12年之前

前面的都没问题,主要是走到 runtime 一些方法 需要进行 runtime.new 进行 mallocgc 之后就开始崩溃了!

polaris
polaris · #2 · 12年之前

我觉得这个还是需要你仔细检查代码,就这个错误信息,没法判断问题原因。

whispermemory
whispermemory · #3 · 12年之前
polarispolaris #2 回复

我觉得这个还是需要你仔细检查代码,就这个错误信息,没法判断问题原因。

通过 pprof 一路排除下来排除到 defernew 方法调用占了所有内存的 %97。把 defer 方法全改写了一遍,改之前是这样的

 for{   con=Accept()  defer con.Close() go handle() } 

改成这样了

 for {con = Accept()   go handle()  defer con.Close()}

然后就 ok 了。

whispermemory
whispermemory · #4 · 12年之前
whispermemorywhispermemory #3 回复

#2楼 @polaris 通过 pprof 一路排除下来排除到 defernew 方法调用占了所有内存的 %97。把 defer 方法全改写了一遍,改之前是这样的 for{ con=Accept() defer con.Close() go handle() } 改成这样了 for {con = Accept() go handle() defer con.Close()} 然后就 ok 了。

但是这个时候,程序运行开始的实际内存就到 6000byte。后来把 con 放到 handle 里面处理,抛弃 defer 的方法。 开始的实际内存降了 2000 byte。

polaris
polaris · #5 · 12年之前

一般都会 handle(conn)这样处理的。

whispermemory
whispermemory · #6 · 12年之前
polarispolaris #5 回复

一般都会 handle(conn)这样处理的。

嘿嘿。p 神的标准库要跳票啊。

polaris
polaris · #7 · 12年之前
whispermemorywhispermemory #6 回复

#5楼 @polaris 嘿嘿。p 神的标准库要跳票啊。

额额

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传