最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用pprof分析golang內(nèi)存泄露問題及解決

 更新時間:2025年04月02日 08:40:31   作者:coding4all  
這篇文章主要介紹了使用pprof分析golang內(nèi)存泄露問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

問題現(xiàn)象

生產(chǎn)環(huán)境有個golang應(yīng)用上線一個月來,占用內(nèi)存不斷增多,約30個G,這個應(yīng)用的DAU估計最多幾十,初步懷疑有內(nèi)存泄露問題。

下面是排查步驟:

分析

內(nèi)存泄露可能點:

  1. goroutine沒有釋放
  2. time.NewTicker資源未及時釋放
  3. slice切割的誤用…

開啟pprof

我們的web框架使用的是gin,結(jié)合pprof

package main

import (
	"github.com/gin-contrib/pprof"
	"github.com/gin-gonic/gin"
)

func main() {
  router := gin.Default()
  pprof.Register(router)
  router.Run(":8090")
}

瀏覽器訪問:http://ip:port/debug/pprof

著重看下heap和goroutine

heap中發(fā)現(xiàn)代碼中一個內(nèi)存緩沖bigcache比較占用內(nèi)存,goroutine中發(fā)現(xiàn)總共466700個goroutine,第一處代碼占了466615個,這是肯定不正常的。至此,已基本確定內(nèi)存泄露的點了,繼續(xù)驗證:

go tool pprof http://ip:port/debug/pprof/heap

輸入top命令:

之前通過http://ip:port/debug/pprof/heap?debug=1查看到的bigcache占用內(nèi)存,go tool 分析之后排除了內(nèi)存泄露的可能性,因為程序在運行一段時間后,bigcache占用內(nèi)存并未增長,goph.NewUnknown方法的代碼位置和goroutine中client.go:72的指向是一致的,所以可以確定就是這塊代碼的問題。

代碼分析

問題代碼:

func NewUnknown(user string, addr string, auth Auth, t time.Duration) (*Client, error) {
	type st struct {
		cli *Client
		err error
	}
	var ch = make(chan st) # 無緩沖隊列
	go func() {
		cli, err := NewConn(&Config{
			User:     user,
			Addr:     addr,
			Port:     22,
			Auth:     auth,
			Timeout:  DefaultTimeout,
			Callback: ssh.InsecureIgnoreHostKey(),
		})
		ch <- st{  # 寫阻塞 ①
			cli: cli,
			err: err,
		}
	}()
	for {
		select {
		case <-time.After(t): # ②
			return nil, fmt.Errorf("new ssh client time out")
		case res := <-ch:
			return res.cli, res.err
		}
	}
}

由于ch是無緩沖的channel,①處寫數(shù)據(jù)可能會阻塞,當(dāng)②超時返回時,由于ch沒有被接收方,①處的goroutine會一直阻塞,造成內(nèi)存泄露。

修復(fù)方案

var ch = make(chan st, 1)

設(shè)置一個有緩沖隊列的channel,這樣就算沒有接收方,也能往里寫數(shù)據(jù)。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • golang通過context控制并發(fā)的應(yīng)用場景實現(xiàn)

    golang通過context控制并發(fā)的應(yīng)用場景實現(xiàn)

    這篇文章主要介紹了golang通過context控制并發(fā)的應(yīng)用場景實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 一文詳解Golang中的errors包

    一文詳解Golang中的errors包

    在 Golang 中,errors 包是用于處理錯誤的標(biāo)準(zhǔn)庫, errors 包提供的功能比較簡單,使用起來非常方便,接下來就具體講解一下 errors 包提供的幾個函數(shù),感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07
  • golang中使用proto3協(xié)議導(dǎo)致的空值字段不顯示的問題處理方案

    golang中使用proto3協(xié)議導(dǎo)致的空值字段不顯示的問題處理方案

    這篇文章主要介紹了golang中使用proto3協(xié)議導(dǎo)致的空值字段不顯示的問題處理方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 使用Go語言統(tǒng)計文件中每個字母出現(xiàn)頻率的方法

    使用Go語言統(tǒng)計文件中每個字母出現(xiàn)頻率的方法

    這篇文章主要介紹了如何使用Go語言統(tǒng)計文件中每個字母出現(xiàn)頻率 的完整內(nèi)容,本案例適合用來練習(xí)文件讀取、字符處理、map統(tǒng)計等基礎(chǔ)技能,感興趣的小伙伴跟著小編一起來看看吧
    2025-07-07
  • Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境圖文詳解

    Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境圖文詳解

    GoLand?是?JetBrains?公司推出的商業(yè)?Go?語言集成開發(fā)環(huán)境(IDE),這篇文章主要介紹了Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境詳解,需要的朋友可以參考下
    2022-10-10
  • 如何編寫Go語言中間件的實例教程

    如何編寫Go語言中間件的實例教程

    不知道大家有沒有寫過中間件呢,它是怎么寫的呢?下面這篇文中就來給大家分享一下使用Go,如何編寫中間件,文中通過示例代碼介紹的非常詳細(xì),供大家參考學(xué)習(xí),下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Go語言工程實踐單元測試基準(zhǔn)測試示例詳解

    Go語言工程實踐單元測試基準(zhǔn)測試示例詳解

    這篇文章主要為大家介紹了Go語言工程實踐單元測試基準(zhǔn)測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 淺談go語言內(nèi)存逃逸現(xiàn)象

    淺談go語言內(nèi)存逃逸現(xiàn)象

    本文主要介紹了淺談go語言內(nèi)存逃逸現(xiàn)象,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-10-10
  • golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析

    golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析

    這篇文章主要介紹了golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go 并發(fā)實現(xiàn)協(xié)程同步的多種解決方法

    Go 并發(fā)實現(xiàn)協(xié)程同步的多種解決方法

    這篇文章主要介紹了Go 并發(fā)——實現(xiàn)協(xié)程同步的多種解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08

最新評論

治县。| 高平市| 崇礼县| 临沂市| 阿拉善盟| 新巴尔虎左旗| 都江堰市| 垣曲县| 赤水市| 锦州市| 吉首市| 罗江县| 永春县| 塘沽区| 越西县| 新和县| 南安市| 灵川县| 泾阳县| 杭锦后旗| 香格里拉县| 兴国县| 杭州市| 泉州市| 金湖县| 宁都县| 平泉县| 南华县| 赣榆县| 依安县| 西城区| 高青县| 涞水县| 大荔县| 罗山县| 赣州市| 四平市| 奉贤区| 台东县| 阿拉善盟| 临澧县|