Last active
December 25, 2015 07:46
-
-
Save maliubiao/e761ea0080a08b80887d to your computer and use it in GitHub Desktop.
golang内存分配profiler工具之一, alloc日志分析
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#-*-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