【发布时间】:2016-04-15 17:34:57
【问题描述】:
我最近遇到了一种情况,我们的一个 Golang 应用程序消耗了近 30GB 内存,它会周期性地以几乎 100% 的速度吃掉所有 24 个 cpu 内核。这可能会持续超过 3 秒。我们的 Golang 版本是 1.4.1 on linux 64-bit。
我已经用谷歌搜索了一些信息。这是我的假设:
- 在我们的应用程序中,我们使用数据类型
[]map[string]*list,这种类型的实例将包含超过 250K 个键。 - 也许golang 1.4.1 中的gc 消耗了更多的cpu 时间并停止了世界。但是,我找不到配置 gc goroutines(threads) 并行性的参数。还有,是不是和
GOMAXPROCS参数有关系。
【问题讨论】:
-
听起来真的可能是GC。
-
您是否尝试过分析您的代码以查看大多数分配来自何处?您也可以尝试切换到具有更好并发收集器的 1.5,看看是否更好。
-
更好的是,用 Go 1.6 beta 试试吧,它在 GC 暂停方面应该会更好。但是对于 go 1.4 来说,30G 应用上的 3 秒暂停似乎是合理的。
-
Ae 其他人说过,使用 go1.5 或 go1.6。如果您怀疑 GC,只需打开 gctrace 运行以查看它到底在做什么。
-
@Not_a_Golfer 你能否提供更多关于 golang 1.4 中 gc 行为的信息,博客首选。
标签: go garbage-collection