日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

曹大带我学 Go(8)—— 一个打点引发的事故

發(fā)布時間:2024/4/11 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 曹大带我学 Go(8)—— 一个打点引发的事故 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

你好,我是小X。

曹大最近開 Go 課程了,小X 正在和曹大學(xué) Go。

這個系列會講一些從課程中學(xué)到的讓人醍醐灌頂?shù)臇|西,撥云見日,帶你重新認(rèn)識 Go。

最近線上事故頻發(fā),搞得焦頭爛額,但是能用上跟曹大學(xué)的知識并定位出了問題,還是值得高興一把的。畢竟“打破砂鍋問到底”,“定位出根因”一直是技術(shù)人的優(yōu)良品質(zhì)。

雖然我們總是逃不過事故驅(qū)動開發(fā)的魔咒,但吃一塹長一智,看別人的事故,學(xué)到的是自己的能力。

現(xiàn)象

一個平凡的午高峰,服務(wù)在全量上線的過程中,碰到一個非常重要的下游接口超時(后來發(fā)現(xiàn)該下游也在上線,可用實例數(shù)變少,正常實例負(fù)載變高,超時了一丟丟),拿不到該拿的數(shù)據(jù),阻塞了啟動。這樣,打到線上正常實例上的流量就增加了。

不大會兒,線上大量實例 OOM,報警滿天飛。不得已,回滾(遇到事故,第一件事就是回滾)。沒想到,回滾無效,OOM 的實例數(shù)還是一直在增加,給跪了。

中間查到服務(wù)在啟動過程中,一直在嘗試調(diào)那個超時的下游,就臨時把超時時間加大,并取消回滾,緊急上線了一把。

之后,正常啟動的實例越來越多,服務(wù)逐漸恢復(fù)。

第一天排查

發(fā)生事故之后就是排查過程了。

第一天,只查到了 OOM 的實例 goroutine 數(shù)暴漲,接口 QPS 有尖峰,比正常翻了幾倍。所以,得到的結(jié)論就是接口流量太多,超過服務(wù)極限,導(dǎo)致 OOM。

接著嘗試在預(yù)覽環(huán)境壓測,沒有復(fù)現(xiàn) OOM,gg。

結(jié)論有問題!

第二天排查

第二天運氣比較好,發(fā)現(xiàn)了線上有一個實例在不斷地重啟,一看監(jiān)控,發(fā)現(xiàn)正常啟動后,5 分鐘左右就 OOM 了。

有現(xiàn)場就不慌。

正好跟著曹大學(xué)會了如何用 pprof 查問題,馬上就安排,三下五除二就搞定了。

先看 inuse_space:

inuse_space

雖然,這個 model 占用的內(nèi)存比較高,但這是正常的業(yè)務(wù)邏輯,看了看相關(guān)的代碼最近也沒有改動。

所以,這個只能是果,不是因。

再看 CPU:

CPU

中間加粗的紅色線條和方框就差要告訴我有問題的代碼在哪一行了!圖上方有調(diào) metrics 的函數(shù)名(這里沒展示出來),一搜就搜出來了。

再看了下 goroutine:

goroutine

結(jié)論還是一樣的。

順著圖上的函數(shù)名,馬上就在一個多重嵌套循環(huán)里找到了一處不那么顯眼的打點。

metrics 打點的劇本我熟,之前看了曹大的“幾個 Go 系統(tǒng)可能遇到的鎖問題”的文章(點擊閱讀原文可讀),邏輯大概是這樣的:

由于 metrics 底層是用 udp 發(fā)送的,有文件鎖,大量打點的情況下,會引起激烈的鎖沖突,造成 goroutine 堆積、請求堆積,和請求關(guān)聯(lián)的 model 無法釋放,于是就 OOM 了。

然后我們替換 bin 上到這臺 OOM 的機器,果然恢復(fù)正常了,收工!

最后看了下 metrics 的代碼,其實還不是文件鎖的原因。不過也差不多了,也是一把大鎖,所有 goroutine 的打點都會先 append 到一個 slice 里,append 前要先加鎖。

由于這個地方的打點非常多,幾十萬 QPS,一沖突,goroutine 都 gopark 去等鎖了,持有的內(nèi)存無法釋放,服務(wù)一會兒就 gg 了。

總結(jié)

引發(fā)這次事故的代碼其實是一年多前寫的,跑了一年都沒出事,這次就遇到了,你說可氣不?

幸虧不是自己寫的,但也要敲個警鐘:我寫的每一行代碼,將來都可能會引發(fā)事故,一定要認(rèn)真對待。

遇到 OOM 不可怕,有現(xiàn)場就行。拿不到現(xiàn)場,我也沒啥好辦法。實在不行,用曹大的 holmes 試試,這個工具還是很厲害的,還幫曹大貢獻(xiàn)了個 golang 的 mr。

平時要多看相關(guān)的事故排查文章,必要的時候練習(xí)一下 pprof 工具的使用,關(guān)鍵的時候還是能頂用的。

好了,這就是今天全部的內(nèi)容了~ 我是小X,我們下期再見~


歡迎關(guān)注曹大的 TechPaper 以及碼農(nóng)桃花源~

總結(jié)

以上是生活随笔為你收集整理的曹大带我学 Go(8)—— 一个打点引发的事故的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。