事件回顧
- 9.15號晚18點(diǎn)服務(wù)端發(fā)版
- 9.16號晚21點(diǎn)監(jiān)控顯示自發(fā)版后服務(wù)器 TCP_alloc 指標(biāo)一路飆升至40K(如圖)
問題分析
看到 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ù)用改鏈接文章來源:http://www.zghlxwxcb.cn/news/detail-731230.html
代碼修復(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)!