上个星期做了一个Golang程序,放在2核CPU,4G内存的云服务器上,当时也没有观察CPU的使用情况,今天发现CPU跑满了。后面发现是我在创建一个协程的函数 default 导致的。
(1)处理前,进程的cpu占用率为100%
(2)处理后,进程的cpu占用率为0.3%
(3)代码上处理(示例)
func handle() {
defer func() {
if r := recover(); r != nil {
log.Println(fmt.Sprintf("[handle] panic from %v", r))
}
}()
timer := time.NewTicker(60 * time.Minute)
for {
select {
case <-timer.C:
fmt.Println("todo ")
//default: //屏蔽default,CPU 就会降下来
}
}
}
原因:
for select
循环在没有其他阻塞操作(timer.C定时器时间未到)的情况下不断执行default
分支,并且default
分支中的代码没有包含任何形式的等待或休眠,导致CPU使用率过高,因为循环会不断地、非常快速地执行。