24 Nov 2013

go1.2 map的GC性能提升

几天前,线上Golang程序 GC调优一例 介绍了为特定程序优化gc的一个例子,从里面可以看出,go在做map的gc时,性能不太理想(50万的map,在i7-2600s上停顿8ms)

今天时星期天,天气不错!下午出去跑步,上午在家玩一会儿程序。com下载了的包,实际测试这个情况有没有改变。

和上次一样的程序,同一台机器:

gc32(1): 2+0+0 ms, 61 -> 30 MB 15457 -> 3198 (357463-354265) objects, 0(0) handoff, 0(0) steal, 0/0/0 yields
gc33(1): 2+0+0 ms, 61 -> 30 MB 15470 -> 3198 (369735-366537) objects, 0(0) handoff, 0(0) steal, 0/0/0 yields
gc34(1): 2+0+0 ms, 61 -> 30 MB 15183 -> 3192 (381720-378528) objects, 0(0) handoff, 0(0) steal, 0/0/0 yields

gc时间由原来的8ms,减少到2ms。

GOGCTRACE 参数废弃,替换为GODEBUG

搜索代码树,找不到GOGCTRACE字样了,现在由GODEBUG环境变量接管。具体代码在:

static struct {
        int8*   name;
        int32*  value;
} dbgvar[] = {
        {"gctrace", &runtime·debug.gctrace},
        {"schedtrace", &runtime·debug.schedtrace},
        {"scheddetail", &runtime·debug.scheddetail},
};
GOGCTRACE=1 go run gc.go  # go1.2以前,GOGCTRACE环境变量控制 详细信息打印
GODEBUG='gctrace=1' go run gc.go  # go1.2rc5 由GODEBUG控制

commit 追溯

好奇提升的原因,追了一会儿代码。

go的gc的代码集中在src/pkg/runtime/mgc0.c里。

# github 上,对golang code的镜像。相比于官方用hg管理,git对于我更友好一点
git clone :jnwhiteh/golang.git  
git log src/pkg/runtime/mgc0.c   # 查看 src/pkg/runtime/mgc0.c 的修改记录

这次map gc性能的提升,可能是Keith Randall的这个commit 对 的修复造成的,commit message:

runtime: record type information for hashtable internal structures. Remove all hashtable-specific GC code

大量内存数据,造成GC时的长时间停顿,使我头疼。这也是我日常需要面对的:加载大量数据,在有限的时间内(几十ms),进行在线算法计算,返回结果,比如推荐,搜索等。这使我不得不用C++来完成的程序的编写。欣喜的看到这次进步。map应用非常频繁的数据,这次提升,非常有意义。期待go语言gc的继续进步!

blog comments powered by Disqus