golang一次CPU占用高问题的排查

写的程序windows调试完成部署到centos时候出现了CPU占用高的问题,基本快占用1核
golang一次CPU占用高问题的排查_第1张图片
代码中添加生成cpuprofile 使用go tool pprof 查看消耗CPU时间最多的调用
golang一次CPU占用高问题的排查_第2张图片
发现占用最高的项为runtime.futex, 查资料后了知道linux futex是锁相关,检查代码后发现问题所在,有个库在time.AfterFunc中把传入的以秒为单位的时间直接转为time.Duration进行回调循环,传入的参数是3600,转为time.Duration也就是3600纳秒,相当于死循环,将传入time.AfterFunc参数改为 传入参数*time.Second后重新运行,发现问题的确解决
但是有个问题是windows下没有出现CPU占用很高的情况 但是在centos下却出现,所以打印了但前时间的timeDuration也就是当前时间纳秒级时间戳
代码如下:

log.Println(time.Now().UnixNano())
log.Println(time.Now().Unix())

windows下运行结果:
2018/06/28 11:51:04 1530157864114600000
2018/06/28 11:51:04 1530157864
2018/06/28 11:59:29 1530158369447600000
2018/06/28 11:59:29 1530158369
2018/06/28 11:59:43 1530158383111600000
2018/06/28 11:59:43 1530158383

centos下运行结果:
2018/06/28 03:52:32 1530157952721863033
2018/06/28 03:52:32 1530157952
2018/06/28 04:00:27 1530158427051418827
2018/06/28 04:00:27 1530158427
2018/06/28 04:00:40 1530158440463932402
2018/06/28 04:00:40 1530158440

通过运行结果可以看出来centos下纳秒单位一直在变,但是windows下却只能精确到毫秒级,所以在windows最小的睡眠时间也是毫秒级,而1毫秒的执行一次的频率在CPU纳秒级运算时间面前根本不算事,所以之前有问题的程序在运行的时候几乎看不到CPU占用,而在centos却是相当于在跑死循环,导致CPU接近一核占用,没到一核的原因,一个是因为同一线程在go中有多个协程在执行,而跑死循环的只是其中一个

你可能感兴趣的:(Golang)