Golang 1.4.1中GC引起的CPU核心是什么?

3

最近我遇到了一个情况,我们的Golang应用程序消耗了将近30GB的内存,会定期占用所有24个CPU核心,几乎接近100%。这可能会持续超过3秒钟。我们的Golang版本是1.4.1,运行在64位Linux上。

我搜索了一些信息,下面是我的假设:

  • 在我们的应用程序中,我们使用了一个数据类型[]map[string]*list,而该类型的实例将包含超过250K个键。
  • 可能是Golang 1.4.1中的gc消耗更多的CPU时间并停止工作。但是,我找不到配置gc goroutines(线程)并行性的参数。它是否与GOMAXPROCS参数有关。

听起来这真的可能是垃圾回收。 - Volker
你尝试过对代码进行分析以查看最多的分配来自哪里吗?你也可以尝试切换到1.5版本,它具有更好的并发收集器,看看是否会更好。 - Ainar-G
3
更好的选择是尝试使用Go 1.6 beta版本,这个版本在垃圾回收方面应该会更加优秀。但对于30G应用程序而言,在Go 1.4上出现3秒的暂停也是很有可能的。 - Not_a_Golfer
正如其他人所说,使用go1.5或go1.6。如果你怀疑是垃圾回收的问题,只需打开gctrace选项,就可以准确地查看它正在做什么。 - JimB
@Not_a_Golfer,你能否提供更多关于Golang 1.4中gc行为的信息,最好是博客文章。 - andy
1个回答

0

你真的需要进行性能分析才能找出这样的问题。

话虽如此,您可能可以减少对垃圾收集器的负载。以下是一些建议:

  1. 链表会导致大量的小型分配。您考虑过使用 []map[string][]whatever_you_are_storing 吗?
  2. 您是否正在向此巨大的映射中添加和删除内容?您添加和删除的内容基本上都是相同的吗?如果是这样,您可以使用 sync.Pool
  3. 您尝试过直接存储项目: map[string]list 而不是 map[string]*list 吗?这将改变程序的行为,但对于一个小结构体来说,这可能是有意义的。

这些只是猜测。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接