【问题标题】:What is the cpu cores caused by GC in Golang 1.4.1Golang 1.4.1 中 GC 导致的 cpu cores 是什么
【发布时间】: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


【解决方案1】:

你真的需要分析一下才能解决这样的问题。

也就是说,您也许可以减少垃圾收集器的负载。以下是一些建议:

  1. 链接列表会导致大量的小分配。您是否考虑过使用[]map[string][]whatever_you_are_storing
  2. 您是否要在这张巨大的地图上添加和删除东西?你添加和删除的东西基本上都一样吗?如果是这样,您可以使用sync.Pool
  3. 您是否尝试过直接存储项目:map[string]list 而不是map[string]*list。它会改变你程序的行为,但对于一个小结构来说,它可能还是有意义的。

这些都是在黑暗中拍摄的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-26
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多