go - Golang 1.4.1 中 GC 导致的 cpu 核心数是多少

标签 go garbage-collection

我最近遇到一种情况,我们的一个 Golang 应用程序消耗了将近 30GB 的内存,会周期性地吃掉所有 24 个 cpu 内核,几乎接近 100%。这可能会持续 3 秒以上。我们的 Golang 版本是 64 位 linux 上的 1.4.1。

我用谷歌搜索了一些信息。这是我的假设:

  • 在我们的应用中,我们使用数据类型[]map[string]*list,这种类型的实例将包含超过 250K 个键。
  • 也许 golang 1.4.1 中的 gc 消耗了更多的 cpu 时间并停止了世界。但是,我找不到配置 gc goroutines(threads) 并行度的参数。还有,它和GOMAXPROCS参数有没有关系。

最佳答案

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

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

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

那些是在黑暗中拍摄的。

关于go - Golang 1.4.1 中 GC 导致的 cpu 核心数是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34721037/

相关文章:

go - 键变量在 Stripe Go SDK 中被覆盖

go - 应该每个github都包含func main吗?

go - 混淆 channel 控制流

java - 尽管我们的基准程序每秒创建数百万个对象,但日志中报告的垃圾收集很少

unity3d - 有没有办法在 Unity 中准确测量堆分配以进行单元测试?

Nginx:WebSocket 通配符位置

go - Nginx version 命令不返回版本也不返回错误

java - 在 Java 中销毁对象

java - 分页对垃圾回收有什么影响?

java - 从 Java 6 迁移到 Java 7 期间会发生什么