go筆記-time ticker泄露的排查


現象

服務運行時發現,隨着服務運行時間增加,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM