欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

線上問題排查之golang使用json進行對象copy

 更新時間:2022年06月20日 08:43:46   作者:??whoops本尊????  
這篇文章主要介紹了線上問題排查之golang使用json進行對象copy,文章圍繞golang使用json進行對象copy的內存溢出問題排查展開詳細內容需要的小伙伴可以參考一下

前言:

記一次golang使用json進行對象copy的內存溢出問題排查

問題現象:新增的功能,灰度部署在k8s集群的服務,發(fā)現機器老是被打崩,因為是灰度,且控制了qps在100多,但是機器卻崩潰。通過對灰度機器的監(jiān)控。發(fā)現是內存太高導致機器掛掉。此次回顧一下排查歷程。

增加GC次數,從而可以通過pprof去抓取內存使用情況:

將程序的GOGC由原先的2000改為200,從而增加GC次數,然后去抓取內存消耗情況

  • 第一步操作完成,經驗證機器可以正常運行,借助gops導出cpu運行圖和內存消耗情況
  • ①將編譯好的linux版本的gops導入到目標機器上
  • ②執(zhí)行命令 gops 查看正在運行的程序的pid

  • ③執(zhí)行命令獲取cpu運行狀態(tài) gops pprof-cpu 27 
  • ④執(zhí)行命令獲取內存消耗情況 gops pprof-heap 27

執(zhí)行上述兩個命令后,其會生成文件在tmp目錄下 :

//⑤將生成的文檔下載到本地后,分別執(zhí)行 
go tool pprof -http=:8080 cpu_profile*
go tool pprof -http=:8081 heap_profile*
//在本地生成可視化

內存的火焰圖如下 :

 cpu的火焰圖如下:

 通過對火焰圖的分析,可以明顯的看到json.Marshal 和 json.Unmarshal 有明顯的占用問題。跟著火焰圖去找尋調用此處的該方法,定位到

此處就不列出runtime.Context對象的具體情況了,你可以理解為里面多處指針,多處切片。反正就是結構體很大 【PS:改天針對大結構體出個壓測結果】

發(fā)現問題后更換如下代碼進行對象copy,注意此拷貝結構體不能有小寫字母開頭。另外建議盡量少進行對象copy,盡可能的細化到需要copy的地方

/**
 * @Description:深拷貝數據 (慎用--結構體不能有小寫字母開頭)
 */
func DeepCopy(dst, src interface{}) error {
   var buf bytes.Buffer
   if err := gob.NewEncoder(&buf).Encode(src); err != nil {
      return err
   }
   return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
}

到此這篇關于線上問題排查之golang使用json進行對象copy的文章就介紹到這了,更多相關 golang copy內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • golang移除數組中重復的元素操作

    golang移除數組中重復的元素操作

    這篇文章主要介紹了golang移除數組中重復的元素操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang反射獲取結構體的值和修改值的代碼示例

    Golang反射獲取結構體的值和修改值的代碼示例

    這篇文章主要給大家介紹了golang反射獲取結構體的值和修改值的代碼示例及演示效果,對我們的學習或工作有一定的幫助,感興趣的同學可以參考閱讀本文
    2023-08-08
  • 詳解Golang使用MongoDB通用操作

    詳解Golang使用MongoDB通用操作

    這篇文章主要介紹了詳解Golang使用MongoDB通用操作,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Go在GoLand中引用github.com中的第三方包具體步驟

    Go在GoLand中引用github.com中的第三方包具體步驟

    這篇文章主要給大家介紹了關于Go在GoLand中引用github.com中第三方包的具體步驟,文中通過圖文介紹的非常詳細,對大家學習或者使用Go具有一定的參考價值,需要的朋友可以參考下
    2024-01-01
  • Go語言接口的用法詳解

    Go語言接口的用法詳解

    本文詳細講解了Go語言接口的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Go實現map轉json的示例詳解

    Go實現map轉json的示例詳解

    這篇文章主要為大家詳細介紹了如何利用Go語言實現map轉json的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-09-09
  • Go語言中l(wèi)og日志庫的介紹

    Go語言中l(wèi)og日志庫的介紹

    本文給大家介紹Go語言中l(wèi)og日志庫的概念使用技巧,log包定義了Logger類型,該類型提供了一些格式化輸出的方法,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-10-10
  • Golang利用casbin實現權限驗證詳解

    Golang利用casbin實現權限驗證詳解

    Casbin是一個強大的、高效的開源訪問控制框架,其權限管理機制支持多種訪問控制模型,Casbin只負責訪問控制。本文將利用casbin實現權限驗證功能,需要的可以參考一下
    2023-02-02
  • Golang構建WebSocket服務器和客戶端的示例詳解

    Golang構建WebSocket服務器和客戶端的示例詳解

    這篇文章主要為大家詳細介紹了如何使用Go語言構建WebSocket服務器和客戶端,以實現雙向通信,文中的示例代碼講解詳細,需要的小伙伴可以參考一下
    2023-11-11
  • Golang通脈之map詳情

    Golang通脈之map詳情

    這篇文章主要介紹了Golang通脈之map,Go語言中提供的映射關系容器為map,其內部使用散列表(hash)實現,map 是一種無序的鍵值對的集合。map 最重要的一點是通過 key 來快速檢索數據,key 類似于索引,指向數據的值 map 是一種集合,所以可以像迭代數組和切片那樣迭代它
    2021-10-10

最新評論