現象
服務運行時發現,隨着服務運行時間增加,cpu占用持續增長。查看火焰圖:
pprof查看系統調用:
懷疑是使用timer導致的。
分析
代碼邏輯內請求級使用了time ticker,但是沒有close。代碼如下:
func Process(key string) Item {
ticker := time.NewTicker(time.Millisecond * 10)
reloadTime := 0
for {
reloadTime++
item := getFromCache(key)
if item != nil {
markDeleteFromCache(key)
return item
}
<-ticker.C
}
return new(Item)
}
golang使用的最小堆維護一個timer隊列, 每次操作最壞情況下都是logn。 請求數量越多,timer隊列內的timer數量越多,獲取timer的cpu占用會越來越高。
參考資料:
golang源碼分析 定時器 https://yahtoo.github.io/2019/03/30/golang源碼分析-定時器/
timer造成資源泄露
Go Ticker資源泄露案例 https://www.codercto.com/a/74810.html
go 定時器泄漏,導致 CPU占用高 https://blog.csdn.net/u013272009/article/details/114579784
Ticker 未釋放導致的 CPU 占用過高 https://www.cnblogs.com/Zereker/p/11396639.html
golang 定時任務time.Sleep和time.Tick實現結果比較 https://blog.csdn.net/zkt286468541/article/details/89403306