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

Go語言之使用pprof工具查找goroutine(協(xié)程)泄漏

 更新時間:2024年01月19日 09:37:40   作者:pengpengzhou  
這篇文章主要介紹了Go語言之使用pprof工具查找goroutine(協(xié)程)泄漏,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

用pprof工具查找goroutine(協(xié)程)泄漏

goroutine泄漏指的是goroutine啟動之后沒有退出導(dǎo)致goroutine的數(shù)量持續(xù)上升,或者是在實際應(yīng)用中g(shù)oroutine占用了很長時間才退出導(dǎo)致在一段時間內(nèi)goroutine的數(shù)量急劇上升。

通常可以采用Go自帶的pprof工具來定位問題

如下面這個示例

這是一個簡單的HTTP服務(wù),當(dāng)接收到請求時另起一個goroutine來輸出日志,同時返回“Hello, World!\n”。

在記錄日志之前可能要處理一個耗時很長的業(yè)務(wù)邏輯,如通過公網(wǎng)請求第三方的API接口,這里為了簡化問題用time.Sleep來示意。

goroutineleak.go

package main
 
import (
	"io"
	"log"
	"net/http"
	_ "net/http/pprof"
	"time"
)
 
func writeLog(msg string) {
	go func() {
		time.Sleep(1 * time.Second)
		log.Println(msg)
	}()
}
func handler(w http.ResponseWriter, r *http.Request) {
	writeLog(r.URL.RequestURI())
	io.WriteString(w, "Hello, world!\n")
}
 
func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}

利用Grinder來壓測,開8個進程,每個進程開3個線程,同時請求上述服務(wù)。

在請求過程中,通過瀏覽器查看http://pub.pengpengzhou.com:8080/debug/pprof/goroutine?debug=1, 域名是上述服務(wù)所在的地址。

從pprof的返回結(jié)果中,我們可以看到協(xié)程總數(shù)是5605,下面列出了5組產(chǎn)生協(xié)程的代碼stack trace,按產(chǎn)生的協(xié)程數(shù)量倒排序。

可以看到第一組產(chǎn)生了5597個協(xié)程,產(chǎn)生位置在goroutineleak.go的13行“time.Sleep(1 * time.Second)”對應(yīng)的函數(shù)是main.writeLog。

問題很快得到定位,把這一行注釋掉,重新再壓測,可以得到如下結(jié)果, 協(xié)程總數(shù)一下就降到了8,泄漏的問題得到了解決。

當(dāng)然,在實際應(yīng)用中,耗時是不可避免的,通常是用設(shè)置超時的辦法來規(guī)避長時間等待。

總結(jié)

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

相關(guān)文章

  • goland中導(dǎo)包報紅和go mod問題

    goland中導(dǎo)包報紅和go mod問題

    這篇文章主要介紹了goland中導(dǎo)包報紅和go mod問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Go中使用操作符進行數(shù)學(xué)運算的示例代碼

    Go中使用操作符進行數(shù)學(xué)運算的示例代碼

    在編程中有效地執(zhí)行數(shù)學(xué)運算是一項需要開發(fā)的重要技能,本文主要介紹了Go中使用操作符進行數(shù)學(xué)運算的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • go+redis實現(xiàn)消息隊列發(fā)布與訂閱的詳細過程

    go+redis實現(xiàn)消息隊列發(fā)布與訂閱的詳細過程

    這篇文章主要介紹了go+redis實現(xiàn)消息隊列發(fā)布與訂閱,redis做消息隊列的缺點:沒有持久化,一旦消息沒有人消費,積累到一定程度后就會丟失,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • Go語言做爬蟲狀態(tài)碼返回418的問題解決

    Go語言做爬蟲狀態(tài)碼返回418的問題解決

    在使用Go語言做爬蟲時,使用http.Get(url)去獲取網(wǎng)頁內(nèi)容,狀態(tài)碼返回404,本文我們就詳細的介紹一下解決方法,感興趣的可以了解一下
    2021-12-12
  • go引入自建包名報錯:package?XXX?is?not?in?std解決辦法

    go引入自建包名報錯:package?XXX?is?not?in?std解決辦法

    這篇文章主要給大家介紹了go引入自建包名報錯:package?XXX?is?not?in?std的解決辦法,這是在寫測試引入包名的時候遇到的錯誤提示,文中將解決辦法介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Golang極簡入門教程(四):編寫第一個項目

    Golang極簡入門教程(四):編寫第一個項目

    這篇文章主要介紹了Golang極簡入門教程(四):編寫第一個項目,本文講解了workspace、包路徑、第一個可執(zhí)行命令等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • golang 調(diào)用c語言動態(tài)庫方式實現(xiàn)

    golang 調(diào)用c語言動態(tài)庫方式實現(xiàn)

    本文主要介紹了golang 調(diào)用c語言動態(tài)庫方式實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • golang使用sync.Once實現(xiàn)懶加載的用法和坑點詳解

    golang使用sync.Once實現(xiàn)懶加載的用法和坑點詳解

    這篇文章主要為大家詳細介紹了golang使用sync.Once實現(xiàn)懶加載的用法和坑點,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • 深入剖析Go語言編程中switch語句的使用

    深入剖析Go語言編程中switch語句的使用

    這篇文章主要介紹了Go語言編程中switch語句的使用,是Go語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • Golang庫插件注冊加載機制的問題

    Golang庫插件注冊加載機制的問題

    這篇文章主要介紹了Golang庫插件注冊加載機制,這里說的插件并不是指的golang原生的可以在buildmode中加載指定so文件的那種加載機制,需要的朋友可以參考下
    2022-03-03

最新評論