解决方法
检查 for select 代码中是否有 default 语句,并且在 default 分支上检查是否为空或者没有等待相关的逻辑,如果是的话则会导致 for 循环会在极短时间内不断地执行,导致CPU占用过高。
示例
for {
select {
case <-timer.C:
fmt.Println("todo")
default: // 注释default或者加上等待问题将会解决
// 如果没有相关等待,default分支逻辑将会在for循环一直执行
if someParam == someValue {
// some logic
}
}
}起因
最近同事在使用开发的项目的时候,使用某个功能,打开docker stats查看占用发现在100%

使用火焰图分析发现是 select 占比非常高,于是就查看相关代码以及搜集资料解决

深入分析
(待补充)