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