Skip to content

Instantly share code, notes, and snippets.

@maliubiao
Last active December 25, 2015 07:46
Show Gist options
  • Save maliubiao/e761ea0080a08b80887d to your computer and use it in GitHub Desktop.
Save maliubiao/e761ea0080a08b80887d to your computer and use it in GitHub Desktop.
golang内存分配profiler工具之一, alloc日志分析
#-*-encoding=utf-8-*-
"""
golang的内存分配profiler工具, 为了尽可能少的alloc, 需要消灭alloc最多的路径
启用日志分析
GODEBUG=allocfreetrace=1 ./yourprogram &> alloc.log
生成的日志如下
tracealloc(0xc20800e000, 0x1000, runtime.parforthread)
goroutine 0 [idle]:
runtime.mallocgc(0x1000, 0x72cd20, 0x7ffe00000001, 0xb)
/usr/local/go/src/runtime/malloc.go:327 +0x32a fp=0x7ffe84505368 sp=0x7ffe845052b8
runtime.newarray(0x72cd20, 0x20, 0x42)
/usr/local/go/src/runtime/malloc.go:365 +0xc1 fp=0x7ffe845053a0 sp=0x7ffe84505368
runtime.makeslice(0x664c80, 0x20, 0x20, 0x0, 0x0, 0x0)
/usr/local/go/src/runtime/slice.go:32 +0x15c fp=0x7ffe845053e8 sp=0x7ffe845053a0
runtime.parforalloc(0x20, 0x8)
/usr/local/go/src/runtime/runtime.go:48 +0x3c fp=0x7ffe84505440 sp=0x7ffe845053e8
runtime.gcinit()
/usr/local/go/src/runtime/mgc0.c:1353 +0x27 fp=0x7ffe84505468 sp=0x7ffe84505440
runtime.schedinit()
/usr/local/go/src/runtime/proc.c:143 +0x69 fp=0x7ffe84505490 sp=0x7ffe84505468
runtime.rt0_go(0x7ffe84505598, 0x1, 0x7ffe84505598, 0x0, 0x7f2a8f06aa40, 0x7ffe00000047, 0x7ffe84505598, 0x100000000, 0x445910, 0x0, ...)
/usr/local/go/src/runtime/asm_amd64.s:95 +0x116 fp=0x7ffe84505498 sp=0x7ffe84505490
处理结果:
python pf.py alloc.log topn
==========================
17114
==========================
tracealloc
goroutine
runtime.mallocgc
/usr/local/go/src/runtime/malloc.go:327
runtime.newobject
/usr/local/go/src/runtime/malloc.go:353
runtime.convT2E
/usr/local/go/src/runtime/iface.go:141
main.ServeMultiGet
/home/richard/project/p2/private_code/sskv/src/sskv/sskv.go:523
main.ServeSingle
/home/richard/project/p2/private_code/sskv/src/sskv/sskv.go:352
main.Serve
/home/richard/project/p2/private_code/sskv/src/sskv/sskv.go:288
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:2232
created
/home/richard/project/p2/private_code/sskv/src/sskv/sskv.go:803
...
"""
import sys
import re
path = sys.argv[1]
top = int(sys.argv[2])
x = open(path).read()
x = re.findall("(tracealloc.*?)\n\n", x, re.DOTALL)
s = {}
for i in x:
l = []
for j in i.split("\n"):
if "(0x" in j:
l1= j.split("(0x")[0]
else:
l1 =j.split(" ")[0]
l.append(l1)
m = "\n".join(l)
if m not in s:
s[m] = 0
s[m] += 1
for key,value in sorted(s.items(), key=lambda x: int(x[1]), reverse=True)[:top]:
print """
==========================
%s
==========================""" % value
print key
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment