Golang踩坑分析

同步至 https://segmentfault.com/a/1190000020103403

案例1:Golang內(nèi)存泄露

## 影響情況##

服務(wù)A內(nèi)存泄露,造成服務(wù)器內(nèi)存不足诽凌,系統(tǒng)運(yùn)行的服務(wù)A 因?yàn)镺OM 被強(qiáng)制KILL 掉妻坝、導(dǎo)致任務(wù)丟失

##分析思路##

Golang 編寫的服務(wù)遇到OOM情況如何分析處理那?首先我們利用golang 自帶的pprof來分析尤溜。在main.go中 增加`

go func() {

if err := http.ListenAndServe("0.0.0.0:12345", nil); err != nil {

log.Println(err)

}

}()`

然后再結(jié)合火焰圖 去分析<以下是兩張火焰圖>

圖1

image

[圖片上傳失敗...(image-d6b713-1566194536453)]

圖2

image

[圖片上傳失敗...(image-4a2da9-1566194536453)]

從圖1 和圖2 得知-sql map 有內(nèi)存泄露 sql 也有內(nèi)存泄露仪召、 目前260w 的數(shù)據(jù)敷搪,每天跑N次循捺。 每次會切割成M次子任務(wù)、 所以會泄露N*M次

由于通過火焰圖我們追蹤到了泄露的Func 吼具,那么我們直接定位到相應(yīng)源碼去查看下·

image

[圖片上傳失敗...(image-9de4f0-1566194536453)]

從圖中可以看出僚纷、這個清空操作失效、因?yàn)閠ime.Now().Day() 永遠(yuǎn)和w.FrequencyControlFormat.Day 一致拗盒。另外每次new 都是新的引用怖竭、新的地址、導(dǎo)致每次都會將數(shù)據(jù)庫數(shù)據(jù)全量load到map內(nèi)存中陡蝇,不會被釋放痊臭、

另外我們再通過debug/pprof 去查看下各項(xiàng)詳細(xì)情況

image

[圖片上傳失敗...(image-ade1a2-1566194536453)]

可以看出goroutine 數(shù)量一直在增加,沒有被釋放掉。因?yàn)閏hannel 沒有主動關(guān)閉登夫、導(dǎo)致還會夯住對應(yīng)的goroutine,所以要注意channel 的使用要及時關(guān)閉广匙,否則也會造成資源的浪費(fèi)、

那么我們在分析一下并發(fā)安全的map 里面存儲的數(shù)據(jù)為什么是引用的數(shù)據(jù)庫的數(shù)據(jù)源地址


func (m *Map) Store(key, value interface{}) {

    // 如果read存在這個鍵恼策,并且這個entry沒有被標(biāo)記刪除鸦致,嘗試直接寫入,寫入成功,則結(jié)束

    // 第一次檢測

    read, _ := m.read.Load().(readOnly)

    if e, ok := read.m[key]; ok && e.tryStore(&value) {

        return

    }

    // dirty map鎖

    m.mu.Lock()

    // 第二次檢測

    read, _ = m.read.Load().(readOnly)

    if e, ok := read.m[key]; ok {

        // unexpungelocc確保元素沒有被標(biāo)記為刪除

        // 判斷元素被標(biāo)識為刪除

        if e.unexpungeLocked() {

            // 這個元素之前被刪除了,這意味著有一個非nil的dirty分唾,這個元素不在里面.

            m.dirty[key] = e

        }

        // 更新read map 元素值

        e.storeLocked(&value)

    } else if e, ok := m.dirty[key]; ok {

        // 此時read map沒有該元素抗碰,但是dirty map有該元素,并需修改dirty map元素值為最新值

        e.storeLocked(&value)

    } else {

        // read.amended==false,說明dirty map為空绽乔,需要將read map 復(fù)制一份到dirty map

        if !read.amended {

            m.dirtyLocked()

            // 設(shè)置read.amended==true弧蝇,說明dirty map有數(shù)據(jù)

            m.read.Store(readOnly{m: read.m, amended: true})

        }

        // 設(shè)置元素進(jìn)入dirty map,此時dirty map擁有read map和最新設(shè)置的元素

        m.dirty[key] = newEntry(value)

    }

    // 解鎖折砸,有人認(rèn)為鎖的范圍有點(diǎn)大看疗,假設(shè)read map數(shù)據(jù)很大,那么執(zhí)行m.dirtyLocked()會耗費(fèi)花時間較多鞍爱,完全可以在操作dirty map時才加鎖鹃觉,這樣的想法是不對的专酗,因?yàn)閙.dirtyLocked()中有寫入操作

    m.mu.Unlock()

}

//重點(diǎn)在這里 引用-

//導(dǎo)致forrange 數(shù)據(jù)庫的數(shù)據(jù)的時候 -數(shù)據(jù)庫的數(shù)據(jù)不能被釋放~

func newEntry(i interface{}) *entry {

  return &entry{p: unsafe.Pointer(&i)}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末睹逃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祷肯,更是在濱河造成了極大的恐慌沉填,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佑笋,死亡現(xiàn)場離奇詭異翼闹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蒋纬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門猎荠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜀备,你說我怎么就攤上這事关摇。” “怎么了碾阁?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵输虱,是天一觀的道長。 經(jīng)常有香客問我脂凶,道長宪睹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任蚕钦,我火速辦了婚禮亭病,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘶居。我一直安慰自己罪帖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胸蛛,像睡著了一般污茵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葬项,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天泞当,我揣著相機(jī)與錄音,去河邊找鬼民珍。 笑死襟士,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嚷量。 我是一名探鬼主播陋桂,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蝶溶!你這毒婦竟也來了嗜历?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤抖所,失蹤者是張志新(化名)和其女友劉穎梨州,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體田轧,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡暴匠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了傻粘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片每窖。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖弦悉,靈堂內(nèi)的尸體忽然破棺而出窒典,到底是詐尸還是另有隱情,我是刑警寧澤警绩,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布崇败,位于F島的核電站,受9級特大地震影響肩祥,放射性物質(zhì)發(fā)生泄漏后室。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一混狠、第九天 我趴在偏房一處隱蔽的房頂上張望岸霹。 院中可真熱鬧,春花似錦将饺、人聲如沸贡避。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刮吧。三九已至湖饱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杀捻,已是汗流浹背井厌。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留致讥,地道東北人仅仆。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像垢袱,于是被迫代替她去往敵國和親墓拜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,097評論 1 32
  • (轉(zhuǎn)自知乎)目標(biāo)檢測近年來已經(jīng)取得了很重要的進(jìn)展请契,主流的算法主要分為兩個類型(參考RefineDet):(1)tw...
    hikaty閱讀 558評論 0 2
  • Chapter 8 Goroutines and Channels Go enable two styles of...
    SongLiang閱讀 1,584評論 0 3
  • server.go 實(shí)現(xiàn)了RPC服務(wù)端的核心邏輯咳榜,包括注冊、讀取請求姚糊、處理請求贿衍、發(fā)送回應(yīng)等邏輯。// Server...
    區(qū)塊鏈布道者Enoch閱讀 652評論 0 0
  • 01 蘇鐵再次接到安妮的消息救恨,是十點(diǎn)鐘。 作為一家圖書館的管理員释树,蘇鐵不算敬業(yè)肠槽。館長長期在國外,也沒有其他人幫忙...
    蘇鐵寒閱讀 295評論 0 0