我最近遇到一种情况,我们的一个 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
参数有没有关系。
最佳答案
你真的需要分析才能解决这样的问题。
也就是说,您可以减少垃圾收集器的负载。这里有一些建议:
- 链表导致大量小分配。您是否考虑过使用
[]map[string][]whatever_you_are_storing
? - 您要在这张巨型 map 上添加和删除内容吗?您要添加和删除的内容基本相同吗?如果是这样,您可以使用
sync.Pool
. - 您是否尝试过直接存储项目:
map[string]list
而不是map[string]*list
。它会改变您的程序的行为,但对于一个小结构来说,它可能仍然有意义。
那些是在黑暗中拍摄的。
关于go - Golang 1.4.1 中 GC 导致的 cpu 核心数是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34721037/