国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

go 內(nèi)存泄露

這篇具有很好參考價值的文章主要介紹了go 內(nèi)存泄露。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

事件回顧

  • 9.15號晚18點(diǎn)服務(wù)端發(fā)版
  • 9.16號晚21點(diǎn)監(jiān)控顯示自發(fā)版后服務(wù)器 TCP_alloc 指標(biāo)一路飆升至40K(如圖)

go 內(nèi)存泄露,golang,開發(fā)語言,后端

問題分析

看到 tcp_alloc 指標(biāo)異常,初步懷疑有tcp連接創(chuàng)建后未關(guān)閉,應(yīng)該是上次發(fā)版寫了什么代碼導(dǎo)致的。回顧此次發(fā)版清單,問題應(yīng)該出現(xiàn)在了daemon服務(wù)心跳上報上。

daemon服務(wù)是一個業(yè)務(wù)監(jiān)控服務(wù),通過監(jiān)聽etcd中注冊的服務(wù)狀態(tài)變更,向企業(yè)微信用戶發(fā)送消息提醒。在此之前由于消息提醒協(xié)程panic異常退出,導(dǎo)致Ad服務(wù)停止后消息提醒未正常發(fā)出,造成生產(chǎn)P3事故。本次發(fā)版通過增加每3秒心跳?;顧C(jī)制,雙重保證在服務(wù)中斷后,消息提醒能正常發(fā)出(代碼如下)

func KeepAliveWithMp() {
	var keepAliveWithMpUrl, _ = config.String("keepAliveWithMpUrl")
	if keepAliveWithMpUrl == "" {
		return
	}
	ticker := time.NewTicker(3 * time.Second)
	for range ticker.C {
		_, _ = http.Get(keepAliveWithMpUrl + "?runningKey=" + getRunningKey())
	}
	ticker.Stop()
}

問題出現(xiàn)在了 http.Get 請求發(fā)出后未讀取響應(yīng)主體,也沒有關(guān)閉此次tcp連接,導(dǎo)致一直在創(chuàng)建新的tcp連接,一個get請求會創(chuàng)建兩個goroutine,導(dǎo)致內(nèi)存泄露。

此處有兩種修復(fù)方式,一是在http請求完了之后主動關(guān)閉此次連接釋放資源,另一種則是讀取響應(yīng)主體后復(fù)用改鏈接

代碼修復(fù)

// 方式一
func KeepAliveWithMp() {
	var keepAliveWithMpUrl, _ = config.String("keepAliveWithMpUrl")
	if keepAliveWithMpUrl == "" {
		return
	}
	ticker := time.NewTicker(3 * time.Second)
	for range ticker.C {
		resp, _ := http.Get(keepAliveWithMpUrl + "?runningKey=" + getRunningKey())
		_ = resp.Body.Close()
	}
	ticker.Stop()
}


// 方式二
func KeepAliveWithMp() {
	var keepAliveWithMpUrl, _ = config.String("keepAliveWithMpUrl")
	if keepAliveWithMpUrl == "" {
		return
	}
	ticker := time.NewTicker(3 * time.Second)
	for range ticker.C {
		resp, _ := http.Get(keepAliveWithMpUrl + "?runningKey=" + getRunningKey())
		_,_ = ioutil.ReadAll(resp.Body)
	}
	ticker.Stop()
}

后期預(yù)警

通過每小時檢測一次服務(wù)器 TCP_alloc 指標(biāo),當(dāng)超過30K 后發(fā)送短信提醒,避免再次出現(xiàn)該異常。文章來源地址http://www.zghlxwxcb.cn/news/detail-731230.html

// TCP_alloc 指標(biāo)查看方式
cat /proc/net/sockstat 

sockets: used 3621
TCP: inuse 2833 orphan 5 tw 1792 alloc 3354 mem 489
UDP: inuse 9 mem 4
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

到了這里,關(guān)于go 內(nèi)存泄露的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包