最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決golang內(nèi)存溢出的方法

 更新時間:2019年08月01日 10:46:38   作者:liaoyizhe  
這篇文章主要介紹了解決golang內(nèi)存溢出的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

最近在項目中出現(xiàn)golang內(nèi)存溢出的問題,master剛開始運行時只有10多M,運行幾天后,竟然達到了10多個G。而且到凌晨流量變少內(nèi)存也沒有明顯降低,內(nèi)存狀態(tài)呈現(xiàn)一種很不健康的曲線。

像這種情況肯定是golang內(nèi)存溢出了,為此我持續(xù)排查了兩天,終于找到問題所在,特此記錄下。

準備工作

  • 一臺較好的環(huán)境測試機,單臺運行無污染。
  • 壓測工具,無論服務是http還是websocket服務,都必須準備好壓測工具模擬最真實的用戶場景。
  • 將master引入net/http/pprof包,通過http訪問獲得goroutine、heap信息。
//引入pprof
import _"net/http/pprof"
//在main中加入
go func() {
  log.Println(http.ListenAndServe("localhost:9999", nil))
}()

瀏覽器訪問: http://127.0.0.1:9999/debug/pprof/


獲取goroutine信息 http://10.13.132.91:9999/debug/pprof/goroutine?debug=2

獲取heap信息 http://10.13.132.91:9999/debug/pprof/heap?debug=2

使用golang tool進行統(tǒng)計分析,go tool pprof -inuse_space http://127.0.0.1:9999/debug/pprof/heap。輸入top10可以看出前十占用內(nèi)存情況,這里我是直接輸入png導出圖片來查看,以便以后比較。還有兩個參數(shù)可以選擇,-inuse_space顧名思義是正在使用的內(nèi)存,-alloc_space是已經(jīng)分配的內(nèi)存,本次我是一直用-inuse_space進行分析。

開始進行分析

go是一門自己gc的語言,大概兩分鐘會gc一次。如果有內(nèi)存泄漏,無非就是兩種情況。

  1. 有g(shù)oroutine泄漏,goroutine“飛”了,zombie goroutine沒有結(jié)束,這個時候在這個goroutine上分配的內(nèi)存對象將一直被這個僵尸goroutine引用著,進而導致gc無法回收這類對象,內(nèi)存泄漏。
  2. 有一些全局(或者生命周期和程序本身運行周期一樣長的)的數(shù)據(jù)結(jié)構(gòu)意外的掛住了本該釋放的對象,雖然goroutine已經(jīng)退出了,但是這些對象并沒有從這類數(shù)據(jù)結(jié)構(gòu)中刪除,導致對象一直被引用,無法被回收。

排除掉goroutine泄漏

首先,我利用壓測工具對server進行100個websocket連接,模擬用戶瀏覽行為,然后關(guān)閉連接。打開瀏覽器查看goroutine數(shù)量,發(fā)現(xiàn)新起的goroutine全部已經(jīng)銷毀,沒有觀察到有泄漏的goroutine,因此排除此情況。

確定是全局變量無回收

排除goroutine泄漏,只能是由全局狀態(tài)變量引起的。再次用壓測工具進行壓測然后關(guān)閉,使用觀察內(nèi)存情況。使用go tool pprof -inuse_space http://127.0.0.1:9999/debug/pprof/heap輸入png導出(在這種情況下,需要等程序gc完再導出,建議等10分鐘左右。)


發(fā)現(xiàn)問題所在

每次都會遺留這么大概0.5M的內(nèi)存空間出來,就奇怪,明明整個goroutine退出為什么還有會內(nèi)存占用?相應的全局變量也會刪除該地方的引用。等一下,全局變量,難道是刪除的時候沒做好配對導致沒有真正刪除該引用嗎?去查了下代碼,果然是沒有刪除引用導致的,至此問題解決。


這里面有個項目的坑,上報日志的key不是根據(jù)這個len(map)計算出,導致上報日志的時候以為刪除了該key。

后記

為什么會花了兩天時間,看起來上述流程并不復雜。

實際上你要完全排除掉goroutine泄漏需要花較長的時間去對比的,查看哪些goroutine是新起來沒有關(guān)閉。

在使用-inuse_space或者-alloc_space分析,也是很糾結(jié),這些看起來也并不完全與表現(xiàn)對應上。實際上用-inuse_space是較為直觀的,可以展現(xiàn)出程序真正在使用的(RSS)。Go 管理內(nèi)存的方式可能與你以前使用的方式不太一樣。它會在一開始就保留一大塊 VIRT,而 RSS 與實際內(nèi)存用量接近。RSS 和 VIRT 之間有什么區(qū)別呢?VIRT 或者虛擬地址空間大小是程序映射并可以訪問的內(nèi)存數(shù)量。RSS 或者常駐大小是實際使用的內(nèi)存數(shù)量。因此用-inuse_space導出在png圖上的統(tǒng)計中,與top上的res值是大致相同。

還有就是每次做壓測或者等待golang 完全gc都要耗費不少時間,這樣也會排查增加難度。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Go語言構(gòu)建流數(shù)據(jù)pipeline的示例詳解

    Go語言構(gòu)建流數(shù)據(jù)pipeline的示例詳解

    Go的并發(fā)原語可以輕松構(gòu)建流數(shù)據(jù)管道,從而高效利用?I/O?和多個?CPU,?本文展示了此類pipelines的示例,強調(diào)了操作失敗時出現(xiàn)的細微之處,并介紹了干凈地處理失敗的技術(shù),希望對大家有所幫助
    2024-02-02
  • go?字符串修改的操作代碼

    go?字符串修改的操作代碼

    這篇文章主要介紹了go?字符串修改,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • golang模板template自定義函數(shù)用法示例

    golang模板template自定義函數(shù)用法示例

    這篇文章主要介紹了golang模板template自定義函數(shù)用法,結(jié)合實例形式分析了Go語言模板自定義函數(shù)的基本定義與使用方法,需要的朋友可以參考下
    2016-07-07
  • Go語言中的map擴容機制

    Go語言中的map擴容機制

    Go語言中的map是一種高效的數(shù)據(jù)結(jié)構(gòu),其擴容機制確保了在大數(shù)據(jù)量情況下的性能,本文介紹了包括擴容觸發(fā)條件、擴容過程和漸進式擴容,感興趣的可以了解一下
    2024-12-12
  • Golang channel死鎖的幾種情況小結(jié)

    Golang channel死鎖的幾種情況小結(jié)

    本文主要介紹了Golang channel死鎖的幾種情況小結(jié),詳細的介紹了六種情況,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • Golang最大遞減數(shù)算法問題分析

    Golang最大遞減數(shù)算法問題分析

    這篇文章主要介紹了Golang最大遞減數(shù)算法問題分析,結(jié)合實例形式分析了Go語言數(shù)字遍歷與運算相關(guān)操作技巧,需要的朋友可以參考下
    2017-01-01
  • Go語言omitempty選項的實現(xiàn)

    Go語言omitempty選項的實現(xiàn)

    本文主要介紹了Go語言omitempty選項的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Go單元測試利器testify使用示例詳解

    Go單元測試利器testify使用示例詳解

    這篇文章主要為大家介紹了Go單元測試利器testify使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • golang中按照結(jié)構(gòu)體的某個字段排序?qū)嵗a

    golang中按照結(jié)構(gòu)體的某個字段排序?qū)嵗a

    在任何編程語言中,關(guān)乎到數(shù)據(jù)的排序都會有對應的策略,下面這篇文章主要給大家介紹了關(guān)于golang中按照結(jié)構(gòu)體的某個字段排序的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Go單元測試對數(shù)據(jù)庫CRUD進行Mock測試

    Go單元測試對數(shù)據(jù)庫CRUD進行Mock測試

    這篇文章主要為大家介紹了Go單元測試對數(shù)據(jù)庫CRUD進行Mock測試的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論

凉山| 柳江县| 交城县| 延寿县| 玉屏| 和田市| 娄烦县| 马尔康县| 乌什县| 阿克陶县| 南召县| 马尔康县| 东光县| 方山县| 沿河| 华亭县| 佳木斯市| 综艺| 喀什市| 临武县| 义马市| 虎林市| 商南县| 黄石市| 南昌市| 张家港市| 张北县| 二连浩特市| 汉中市| 武夷山市| 尼勒克县| 大城县| 雅安市| 晋宁县| 龙里县| 济南市| 韩城市| 淮安市| 志丹县| 博湖县| 安丘市|