解决方法

检查 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%

2024-08-08T05:26:42.png

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

2024-08-08T05:28:10.png

深入分析

(待补充)

最后修改:2024 年 08 月 08 日
如果觉得我的文章对你有用,请随意赞赏