- 通过 GODEBUG 查看当前调度哪里有问题
- 设置 GOGC,设置的值较大时,可以减少 GC 的频率,但也同时会增加触发 GC 的堆的大小,可能会产生 OM。
- 涉及文件,CGO 较多的程序,可以通过设置
GOMAXPROCS
将 P 增大runtime.GOMAXPROCS(GOMAXPROCS(0)+1
- 使用协程池,通过隔离减少栈扩容和缩容。有些场景下栈扩容和缩容消耗CPU(可结合pprof查看morestack)比较多,比如长连接,大量维持连接的协程可以不用扩容栈,复杂任务交给任务协程处理,此类协程的数量比较少。
- 对于频繁分配到对象,可以使用 sync.Pool,减少分配频次,进而降低 GC 的频率。
- 全局缓存对象有大量的 key 的时候,value 少用指针。这是因为 GC 并发 mark 时会标记存活的对象,如果 value 里指针较多,会导致 mark 消耗的 CPU 很大,此时,使用 struct 内嵌消除数据指针是一个不错的选择。
- slice 和 map 在创建时就应该初始化容量,减少不断加元素是的扩容。
- 慎用 Go 语言黑魔法
网友评论