增加GO中的堆大小

增加GO中的堆大小,go,garbage-collection,Go,Garbage Collection,有没有一种方法可以指导GO运行时使用更大的堆?我正在运行GO 1.5 我的GO进程目前在GC中花费了34%的时间,但它只使用了可用系统内存的1/3 我知道ulimit可以用来限制最大堆大小。我已将ulimit设置为~16GB(ulimit-v 17179869184),但堆大小从未超过5GB 使用GODEBUG=gctrace=1我可以看到较高的GC开销(34%): 您可以使用GOGC环境变量来控制这一点。 它是一个百分比:将其设置为200,Go运行时将使用两倍于以前的内存 [这被隐藏在评论中;

有没有一种方法可以指导GO运行时使用更大的堆?我正在运行
GO 1.5

我的GO进程目前在GC中花费了34%的时间,但它只使用了可用系统内存的1/3

我知道
ulimit
可以用来限制最大堆大小。我已将ulimit设置为~16GB(
ulimit-v 17179869184
),但堆大小从未超过5GB

使用
GODEBUG=gctrace=1
我可以看到较高的GC开销(34%):


您可以使用
GOGC
环境变量来控制这一点。 它是一个百分比:将其设置为200,Go运行时将使用两倍于以前的内存

[这被隐藏在评论中;我将它作为一个答案呈现出来]


更新:在上详细讨论了不同的技术,包括“压载”技术。

Golang文档描述了GOGC:

GOGC变量设置初始垃圾收集目标 百分比。当以下各项的比率 已将数据分配给上次收集后剩余的实时数据 达到这个百分比。默认值为GOGC=100。设置GOGC=off 完全禁用垃圾收集器

GOGC有一个最佳值,它取决于运行Go应用程序的应用程序和系统。你可以在这个和这个里读更多


您可以尝试不同的值并查看对性能的影响,或者使用类似的免费工具自动找到最佳GOGC值。

听起来像
ulimit
是更改的正确设置。根据这个讨论,它不是跨平台的,所以这可能就是为什么它对你不起作用的原因。是的,我遇到过这个讨论,但那只是在限制GO to使用“最大到某个限制”的上下文中。在我的例子中,我已将限制设置为16GB,但进程的堆从未接近最大限制。首先,请从当前版本的Go开始,即1.6.x或当前的1.7 RCs。有很多变化可能会有所帮助。如果要在集合之间使用更多堆,请增加GOGC,默认值为100。遗憾的是,我无法升级到1.6,受影响的生产堆栈当前正在运行1.5。是的,您可以将GOGC设置得更高,尝试400,看看会发生什么。我不记得go1.5中的gctrace计时是什么,但我认为您的大部分时间似乎都在并发扫描中,因此对您的影响应该不会太大。如果你有大量的指针,这是意料之中的。关于“压舱物”的好文章可以增加堆分配一个很大的片
20160719-220359.169294 :: gc 665 @5484.983s 34%: 3.3+2504+188+1635+8.0 ms clock, 26+2504+0+26950/3271/3.5+64 ms cpu, 4825->4964->2623 MB, 4948 MB goal, 8 P
20160719-220406.322354 :: gc 666 @5492.411s 34%: 2.9+212+2111+1749+8.3 ms clock, 23+212+0+25010/3496/146+67 ms cpu, 4846->4990->2657 MB, 4970 MB goal, 8 P
20160719-220413.703514 :: gc 667 @5499.452s 34%: 4.4+4411+0.021+0.25+8.4 ms clock, 35+4411+0+29365/0.054/38+67 ms cpu, 4908->5022->2618 MB, 5025 MB goal, 8 P