記一次golang gc優(yōu)化過程

我們使用golang編寫的線上服務(wù)良姆,通常會(huì)設(shè)置一個(gè)golang runtime指標(biāo)監(jiān)控肠虽,包括goroutine num、gc num玛追、gc pause 等等税课。最近的一次上線,發(fā)現(xiàn) gc 相關(guān)的指標(biāo)出現(xiàn)異常痊剖,gc num 和 gc pause 大幅升高韩玩。由于 golang 的 gc 是 stop the world 來做, gc 過多會(huì)搶占程序的正常執(zhí)行時(shí)間陆馁,甚至影響對(duì)外提供的服務(wù)找颓,因此暫停了上線,準(zhǔn)備先把 gc 的問題修復(fù)下叮贩。

出問題時(shí)的 gc 監(jiān)控如下:


image.png

其中藍(lán)色曲線表示 gc num叮雳,黃色曲線表示 gc pause(單位ms),兩個(gè)指標(biāo)都是30s的累計(jì)數(shù)據(jù)妇汗×辈唬可以看到每30s的pause達(dá)到了秒級(jí)別。

登錄到線上機(jī)器杨箭,通過 go tool pprof --alloc_objects http://localhost:xxxx/debug/pprof/heap 命令寞焙,查看對(duì)象分配的采樣記錄。發(fā)現(xiàn)比較大頭的有reflect.Value互婿、encoding/json捣郊、fmt.Sprint〈炔危考慮到程序中為了更好地做抽象呛牲,使用了反射操作,而 reflect.Value 會(huì)將對(duì)象拷貝并分配到堆上驮配,程序中的對(duì)象都是消息體娘扩,有的消息體會(huì)超大,因此會(huì)分配較多的堆內(nèi)存壮锻。對(duì)程序做了一版優(yōu)化琐旁,去掉這個(gè)反射邏輯,改為switch case?猜绣,重新上線灰殴,發(fā)現(xiàn) gc 略有下降,但效果還是不夠掰邢。

image.png

?繼續(xù)做 profile牺陶,已經(jīng)沒有了 reflect.Value伟阔,于是只能再從另外兩項(xiàng)入手。

這個(gè)程序是一個(gè)老程序的重構(gòu)版掰伸,當(dāng)時(shí)為了做diff測(cè)試皱炉,加了大量的日志,包括debug日志碱工,甚至有些用來做diff的日志是marshal成json的娃承。我們用的日志庫沒有做特殊處理奏夫,每條日志都會(huì)先調(diào)用 fmt.Sprint怕篷,這個(gè)函數(shù)會(huì)把對(duì)象分配到堆上。針對(duì)上述情況酗昼,做了大量的日志刪減廊谓,gc 略有下降但效果不夠。

image.png

繼續(xù)做性能分析麻削,發(fā)現(xiàn)gc大頭還是json相關(guān)操作蒸痹。這個(gè)應(yīng)用程序的主要功能就是處理json格式傳入的消息,因此除非從 json 庫著手改善呛哟,否則似乎解決不了問題叠荠。BTW,在處理的諸多消息中扫责,有一類消息體占用字節(jié)數(shù)巨大榛鼎,是其他消息的十倍以上。嘗試取消訂閱這類消息鳖孤,發(fā)現(xiàn)gc立即好轉(zhuǎn)者娱,恢復(fù)到正常水平。不過苏揣,這條路徑走不通黄鳍。

分析本程序的特點(diǎn),它基于消息觸發(fā)的模式平匈,每次消息到來就會(huì)處理框沟,處理就會(huì)有堆對(duì)象產(chǎn)生。golang 的 gc 時(shí)機(jī)是根據(jù)當(dāng)前與上次的 heap size 的比例來決定增炭,默認(rèn)情況下是100街望,即新增一倍就會(huì)觸發(fā)。嘗試把這個(gè)比例調(diào)大 export GOGC=400弟跑,試圖降低 gc 觸發(fā)頻率灾前,發(fā)現(xiàn)效果還是不錯(cuò)的,兩個(gè)指標(biāo)均有明顯下降孟辑,其他指標(biāo)無明顯異常哎甲,暫時(shí)先這樣解決蔫敲,以后有余力再做程序?qū)用鎯?yōu)化。

image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炭玫,一起剝皮案震驚了整個(gè)濱河市奈嘿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吞加,老刑警劉巖裙犹,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異衔憨,居然都是意外死亡叶圃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門践图,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掺冠,“玉大人,你說我怎么就攤上這事码党〉抡福” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵揖盘,是天一觀的道長眉厨。 經(jīng)常有香客問我,道長兽狭,這世上最難降的妖魔是什么憾股? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮椭符,結(jié)果婚禮上荔燎,老公的妹妹穿的比我還像新娘。我一直安慰自己销钝,他們只是感情好有咨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒸健,像睡著了一般座享。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上似忧,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天渣叛,我揣著相機(jī)與錄音,去河邊找鬼盯捌。 笑死淳衙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箫攀,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼肠牲,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了靴跛?” 一聲冷哼從身側(cè)響起缀雳,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梢睛,沒想到半個(gè)月后肥印,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绝葡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年深碱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挤牛。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莹痢,死狀恐怖种蘸,靈堂內(nèi)的尸體忽然破棺而出墓赴,到底是詐尸還是另有隱情,我是刑警寧澤航瞭,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布诫硕,位于F島的核電站,受9級(jí)特大地震影響刊侯,放射性物質(zhì)發(fā)生泄漏章办。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一滨彻、第九天 我趴在偏房一處隱蔽的房頂上張望藕届。 院中可真熱鬧,春花似錦亭饵、人聲如沸休偶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踏兜。三九已至,卻和暖如春八秃,著一層夾襖步出監(jiān)牢的瞬間碱妆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工昔驱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疹尾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像纳本,于是被迫代替她去往敵國和親睡雇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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