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

写的程序windows调试完成部署到centos时候出现了CPU占用高的问题,基本快占用1核
这里写图片描述
代码中添加生成cpuprofile 使用go tool pprof 查看消耗CPU时间最多的调用
这里写图片描述
发现占用最高的项为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中有多个协程在执行,而跑死循环的只是其中一个

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值