欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go net/http/pprof分析內(nèi)存泄露及解決過程

 更新時間:2025年04月15日 09:07:25   作者:rgc_520_zyl  
這篇文章主要介紹了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)記錄

    golang協(xié)程關(guān)閉踩坑實戰(zhàn)記錄

    協(xié)程(coroutine)是Go語言中的輕量級線程實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于golang協(xié)程關(guān)閉踩坑的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • Golang中如何使用lua進行擴展詳解

    Golang中如何使用lua進行擴展詳解

    這篇文章主要給大家介紹了關(guān)于Golang中如何使用lua進行擴展的相關(guān)資料,這是最近在工作中遇到的一個問題,覺著有必要分享出來給大家學(xué)習(xí),文中給出了詳細的示例,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • 教你一招完美解決vscode安裝go插件失敗問題

    教你一招完美解決vscode安裝go插件失敗問題

    VSCode是我們開發(fā)go程序的常用工具,但是安裝VSCode成功后,創(chuàng)建一個.go文件居然提示錯誤了,所以下面下面這篇文章主要給大家介紹了如何通過一招完美解決vscode安裝go插件失敗問題的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • go?mod詳細使用教程

    go?mod詳細使用教程

    go mod是go的一個模塊管理工具,用來代替?zhèn)鹘y(tǒng)的GOPATH方案,下面這篇文章主要給大家介紹了關(guān)于go?mod詳細使用的相關(guān)資料,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • 一文理解Goland協(xié)程調(diào)度器scheduler的實現(xiàn)

    一文理解Goland協(xié)程調(diào)度器scheduler的實現(xiàn)

    本文主要介紹了Goland協(xié)程調(diào)度器scheduler的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 詳解Golang中channel的實現(xiàn)

    詳解Golang中channel的實現(xiàn)

    channel俗稱管道,用于數(shù)據(jù)傳遞或數(shù)據(jù)共享,其本質(zhì)是一個先進先出的隊列,使用goroutine+channel進行數(shù)據(jù)通訊簡單高效,同時也線程安全,本文就給大家講講Golang中channel的實現(xiàn),需要的朋友可以參考下
    2023-09-09
  • Golang 語言控制并發(fā) Goroutine的方法

    Golang 語言控制并發(fā) Goroutine的方法

    本文我們介紹了不同場景中分別適合哪種控制并發(fā) goroutine 的方式,其中,channel 適合控制少量 并發(fā) goroutine,WaitGroup 適合控制一組并發(fā) goroutine,而 context 適合控制多級并發(fā) goroutine,感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • Go java 算法之括號生成示例詳解

    Go java 算法之括號生成示例詳解

    這篇文章主要為大家介紹了Go java 算法之括號生成示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • golang封裝一個執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)示例代碼

    golang封裝一個執(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-06
  • Golang?中的?unsafe.Pointer?和?uintptr詳解

    Golang?中的?unsafe.Pointer?和?uintptr詳解

    這篇文章主要介紹了Golang中的unsafe.Pointer和uintptr詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08

最新評論