記一次golang內存泄露問題修復

前言

公司一個項目中需實現如下功能:mongodb

  1. 讀取主程序產生的日誌.
  2. 將日誌處理後存入mongodb

實現思路大體以下:測試

  1. 使用filewatch監視文件,一旦文件產生改變讀取新添加數據.
  2. 將讀取數據處理後存入mongodb.

問題

程序運行一段時間後發現系統變的巨卡,查看進程管理髮現此進程佔用大部份內存,再次估計是發生內存泄露,開始查找問題.
在程序中加入內存消耗分析日誌

fm, err := os.OpenFile("./mem.out", os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
    log.Fatal(err)
}
pprof.WriteHeapProfile(fm)
fm.Close()

分析後發現大部份內存分配在watcher.WaitForFileChange()內部,而後繼續使用net/http/pprofcode

_ net/http/pprof
go func() {
    http.ListenAndServe("localhost:6060", nil)
}()

使用網頁查看,發現有大量的goroutine阻塞於watcher.WaitForFileChange().至此發現是由於文件監視當文件發生改變後沒有返回,致使大量goroutine阻塞於這裏.進程

解決

後測試發現文件監視這個包必定狀況下存在這個問題,後改用文件鎖替代,運行一段時間後沒有出現泄漏,至此問題解決.內存

相關文章
相關標籤/搜索