Ticker 未释放导致的 CPU 占用过高
問(wèn)題描述
2018-12-15, 輔導(dǎo)服務(wù)一臺(tái)服務(wù)器的 TCP 連接數(shù)忽上忽下(如下圖), 上下浮動(dòng)在400~500的數(shù)量. 而此時(shí) CPU 一直在滿負(fù)載,?內(nèi)存占用很高(如下圖). 導(dǎo)致用戶(hù)無(wú)法正常上課.
問(wèn)題緣由
1. TCP 連接中, 存在全球各地的 IP, 并且數(shù)量占比很高, 存在惡意攻擊的可能.
2. 輔導(dǎo)服務(wù)會(huì)為每個(gè) TCP 連接都會(huì)創(chuàng)建一個(gè) ticker, 并且沒(méi)有釋放. time.NewTicker()?→ time.startTimer() → runtime.addtimer() →?runtime.addtimerLocked()?→ runtime.timerproc()?→ runtime.siftdownTimer().
? ? 每來(lái)一個(gè) TCP 連接, ticker 會(huì)新增,?timerproc 是喚醒處理定時(shí)器的一個(gè)函數(shù).?golang使用的最小堆維護(hù)的一個(gè)timer隊(duì)列,?go比較費(fèi)時(shí),每次操作最壞情況下都是logn(n為時(shí)間隊(duì)列長(zhǎng)度).
? ? 新建了很多 ticker, 資源未釋放, 導(dǎo)致內(nèi)存占用過(guò)高.
經(jīng)驗(yàn)教訓(xùn)
Never call time.NewTicker(…) within a fast iterating for loop.
Stop the ticker to release associated resources.
參考資料:
? ? ? ? ? ? ? ? ?https://zhuanlan.zhihu.com/p/30268582
? ? ? ? ? ? ? ? ?https://guidao.github.io/go_timer.html
? ? ? ? ? ? ? ? ?https://forum.golangbridge.org/t/runtime-siftdowntimer-consuming-60-of-the-cpu/3773
轉(zhuǎn)載于:https://www.cnblogs.com/Zereker/p/11396639.html
總結(jié)
以上是生活随笔為你收集整理的Ticker 未释放导致的 CPU 占用过高的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL 搜索指定时间范围数据, 时间
- 下一篇: Functional Options