go 定时器泄漏,导致 CPU占用高

问题

服务器长期开着,遇到一个问题,没有几个有效负载,CPU 占用了 2 个核

go tool pprof 了下,大致如下调用消耗:

在这里插入图片描述

top100 ,显示 runtime.siftdownTimer 占了大头(2 个图,取至不同服务)

在这里插入图片描述

问题分析

可以看到,均为定时器相关代码调用

review 代码,不少定时器用完没有 Stop 释放

模拟做下类似情景性能测试:

1. 创建 2w 个 timer + 1 个 timer 在工作:
在这里插入图片描述

如图,CPU 占用了 61.5%

2. 只有 1 个 timer 在工作
在这里插入图片描述
看不到 CPU 消耗

因此可以得出结论:定时器泄漏,会导致 CPU 占用高

为什么会消耗 CPU

参考 https://www.cnblogs.com/Zereker/p/11396639.html

该作者分析的很透彻了

再做个试验

把泄漏的定时器,时间间隔改大到秒级别。单个定时器工作时,CPU也不会上去
在这里插入图片描述
因此,要避免同时存在大量毫秒级别的定时器,golang 底层需要维护优先队列数据结构会消耗大量 CPU

因为最坏的操作,每次维护优先队列数据结构都是 O(LogN) 的时间复杂度。而大量毫秒级别的定时器会把时间复杂度拉到最坏情况 O(M*LogN)

golang 定时器问题总汇

到目前为止,至少遇到 3 处 golang 定时器问题,及解决方案:

定时器问题解决方案
定时器泄漏避免内存泄漏,比如可以封装 timer ,引用计数,随意可以查看定时器对象数量等
同时刻存在大量毫秒级定时器业务上要避免这种情况的代码,没有通用解决方案
session 级别秒级定时器业务上做到被动触发,来规避该问题

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fananchong2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值