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

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

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

問題現(xiàn)象

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

下面是排查步驟:

分析

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

  1. goroutine沒有釋放
  2. time.NewTicker資源未及時(shí)釋放
  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)代碼中一個(gè)內(nèi)存緩沖bigcache比較占用內(nèi)存,goroutine中發(fā)現(xiàn)總共466700個(gè)goroutine,第一處代碼占了466615個(gè),這是肯定不正常的。至此,已基本確定內(nèi)存泄露的點(diǎn)了,繼續(xù)驗(yàn)證:

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)存泄露的可能性,因?yàn)槌绦蛟谶\(yùn)行一段時(shí)間后,bigcache占用內(nèi)存并未增長(zhǎng),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) # 無(wú)緩沖隊(duì)列
	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是無(wú)緩沖的channel,①處寫數(shù)據(jù)可能會(huì)阻塞,當(dāng)②超時(shí)返回時(shí),由于ch沒有被接收方,①處的goroutine會(huì)一直阻塞,造成內(nèi)存泄露。

修復(fù)方案

var ch = make(chan st, 1)

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

總結(jié)

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

相關(guān)文章

  • Golang 定時(shí)器(Timer 和 Ticker),這篇文章就夠了

    Golang 定時(shí)器(Timer 和 Ticker),這篇文章就夠了

    這篇文章主要介紹了Golang 定時(shí)器(Timer 和 Ticker),這篇文章就夠了,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • golang遍歷時(shí)修改被遍歷對(duì)象的示例詳解

    golang遍歷時(shí)修改被遍歷對(duì)象的示例詳解

    這篇文章主要介紹了golang遍歷時(shí)修改被遍歷對(duì)象的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • golang之資源釋放/異常錯(cuò)誤處理解析

    golang之資源釋放/異常錯(cuò)誤處理解析

    這篇文章主要為大家介紹了golang之資源釋放/異常錯(cuò)誤處理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Golang實(shí)現(xiàn)加權(quán)輪詢負(fù)載均衡算法

    Golang實(shí)現(xiàn)加權(quán)輪詢負(fù)載均衡算法

    加權(quán)輪詢負(fù)載均衡算法是一種常見的負(fù)載均衡策略,本文主要介紹了Golang實(shí)現(xiàn)加權(quán)輪詢負(fù)載均衡算法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • go mod 安裝依賴 unkown revision問題的解決方案

    go mod 安裝依賴 unkown revision問題的解決方案

    這篇文章主要介紹了go mod 安裝依賴 unkown revision問題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2021-05-05
  • 用Go+Vue.js快速搭建一個(gè)Web應(yīng)用(初級(jí)demo)

    用Go+Vue.js快速搭建一個(gè)Web應(yīng)用(初級(jí)demo)

    這篇文章主要介紹了用Go+Vue.js快速搭建一個(gè)Web應(yīng)用(初級(jí)demo),本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-11-11
  • Go字符串操作深入解析

    Go字符串操作深入解析

    這篇文章主要為大家介紹了Go字符串操作深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Golang操作sqlite3數(shù)據(jù)庫(kù)的詳細(xì)教程

    Golang操作sqlite3數(shù)據(jù)庫(kù)的詳細(xì)教程

    最近會(huì)使用到sqlite3,這里作個(gè)記錄,記性越來(lái)越差就是這樣,下面這篇文章主要給大家介紹了關(guān)于Golang操作sqlite3數(shù)據(jù)庫(kù)的詳細(xì)教程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • golang原生實(shí)現(xiàn)JWT的示例代碼

    golang原生實(shí)現(xiàn)JWT的示例代碼

    在Go中實(shí)現(xiàn)JWT驗(yàn)證,可以通過標(biāo)準(zhǔn)庫(kù)crypto/hmac、crypto/sha256和encoding/base64來(lái)編寫自己的JWT,本文就詳細(xì)的來(lái)介紹一下,感興趣的可以了解下
    2023-05-05
  • Go 中燒腦的接口及空接口

    Go 中燒腦的接口及空接口

    在Go語(yǔ)言的實(shí)際編程中,幾乎所有的數(shù)據(jù)結(jié)構(gòu)都圍繞接口展開,接口是Go語(yǔ)言中所有數(shù)據(jù)結(jié)構(gòu)的核心,這篇文章主要介紹了Go 中燒腦的接口,需要的朋友可以參考下
    2024-02-02

最新評(píng)論