Go net/http/pprof分析內存泄露及解決過程
內存泄露出現(xiàn)的原因
在go語言中,其自身實現(xiàn)了 GC(垃圾回收)機制, 所有出現(xiàn)內存泄露的原因很大可能是 有些goroutine因為各種各樣的原因(如 channel阻塞或未設置close channel的功能)導致 垃圾回收機制 認為這些goroutine還在正常運行,無法被回收(每個goroutine至少占用2KB資源),長時間處理大量請求后,導致內存耗盡。
業(yè)務大致場景
go語言編寫的kong插件中,出現(xiàn)內存泄露。
分析方法
嵌入如下代碼; 即使是在 go腳本中,通過如下代碼,也會生成一個pprof的http服務,供web端分析使用。
import "github.com/Kong/go-pdk/server" import _ "net/http/pprof" // main 主入口函數(shù),啟動go-pdk中的server func main() { // 服務資源分析時使用 go func() { err := http.ListenAndServe("0.0.0.0:6000", nil) if err != nil { panic("啟動服務失敗") } }() err := server.StartServer(New, Version, Priority) if err != nil { panic(err) } }
運行服務,并 查看 http://localhost:6000/debug/pprof/goroutine?debug=1 分析方式如下:
壓測請求此服務; 對比發(fā)現(xiàn) 協(xié)程個數(shù)不斷增加的地方;從而找到內存泄露點;
具體原因
最終發(fā)現(xiàn) 是 鏈路追蹤的jaeger reporter(導出span數(shù)據(jù)到jaeger中)每次請求進入都新建一個協(xié)程,導致內存泄露
解決方法
通過 全局變量+ sync.Once 保證 只生成一個 jaeger reporter;從而 不會生成多個協(xié)程,及 節(jié)約 網(wǎng)絡io資源。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
一文理解Goland協(xié)程調度器scheduler的實現(xiàn)
本文主要介紹了Goland協(xié)程調度器scheduler的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06Golang 語言控制并發(fā) Goroutine的方法
本文我們介紹了不同場景中分別適合哪種控制并發(fā) goroutine 的方式,其中,channel 適合控制少量 并發(fā) goroutine,WaitGroup 適合控制一組并發(fā) goroutine,而 context 適合控制多級并發(fā) goroutine,感興趣的朋友跟隨小編一起看看吧2021-06-06golang封裝一個執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)示例代碼
在?Go?語言中,您可以使用?os/exec?包來執(zhí)行外部命令,不通過調用?shell,并且能夠獲得進程的退出碼、標準輸出和標準錯誤輸出,下面給大家分享golang封裝一個執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)的方法,感興趣的朋友跟隨小編一起看看吧2024-06-06Golang?中的?unsafe.Pointer?和?uintptr詳解
這篇文章主要介紹了Golang中的unsafe.Pointer和uintptr詳解,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-08-08