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

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

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

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

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

通??梢圆捎肎o自帶的pprof工具來(lái)定位問(wèn)題

如下面這個(gè)示例

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

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

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來(lái)壓測(cè),開(kāi)8個(gè)進(jìn)程,每個(gè)進(jìn)程開(kāi)3個(gè)線程,同時(shí)請(qǐng)求上述服務(wù)。

在請(qǐng)求過(guò)程中,通過(guò)瀏覽器查看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個(gè)協(xié)程,產(chǎn)生位置在goroutineleak.go的13行“time.Sleep(1 * time.Second)”對(duì)應(yīng)的函數(shù)是main.writeLog。

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

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

總結(jié)

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

相關(guān)文章

最新評(píng)論