使用golang的pprof包對程序進行性能分析


       程序經常出現OOM錯誤,然后關鍵字"go pprof"搜到文章<Go程序性能分析pprof>,該文章第二步說運行程序后會生成profile文件,但是編譯運行后發現生成的profile文件大小一直為0,然后關鍵字"go pprof profile is empty"搜到文章<Golang pprof heap profile is empty>,該文章說在運行程序前添加環境變量GODEBUG="memprofilerate=1",但是好像並沒有用處。

       然后還是之前的關鍵字"go pprof"搜到文章<使用golang的pprof包對程序進行性能分析>,該文章指出"在代碼中使用pprof了,實際運用中分三種情況",因為程序並非是運行一次就退出,而是作為一個服務,所以"需要開啟一個goroutine來開啟端口監聽",然后參考文章<go內存泄露case>,注意第二步"(2)memory profile"的描述"使用--alloc_space可以顯示所有分配的對象",當使用web命令時會報錯"Cannot find dot, have you installed Graphviz?",然后關鍵字"centos Graphviz"搜到文章<Linux Centos7安裝配置畫圖工具Graphviz>,參照該文章安裝了Graphviz但是web命令依然會報錯"xdg-open: no method available for opening '/tmp/pprof-964683453/pprof001.svg'",不知道為什么就只好把臨時的svg文件拷貝到windows下用ie來看,不理解為什么后面curl -T來拷貝時說該文件不存在。

       如果程序代碼中沒有`import _ "net/http/pprof"`,則執行"go tool pprof  http://localhost:6060/debug/pprof/heap"會報錯"server response: 404 Not Found"。關鍵字"inuse_space"搜到文章<golang 內存分析/動態追蹤>。
       關鍵字"go 內存泄露"搜到文章<go內存泄露case>,該文章第一部分為gc相關"(1)觀察GC",但是對輸出的解釋好像不太對(可能跟平台有關),就關鍵字"GODEBUG='gctrace=1'"搜到文章<golang中開啟gctrace>,這篇文章中講了兩個部分:"垃圾回收信息"和"系統內存回收信息",但是"GODEBUG gctrace =1 ./xxxx.exe"卻報錯"-bash: GODEBUG: command not found"。后來試了文章<go內存泄露case>中的方法是可以的,即"GODEBUG= 'gctrace=1' ./xxxx.exe"。
       關鍵字" go 調用c++"搜到博客園文章<golang調用c++文件>,"編譯cc(c++)文件為動態鏈接庫so文件  gcc -fPIC -shared hello.c -o libhello.so"。如果在源文件中調用malloc,編譯報警告"incompatible implicit declaration of built-in function ‘malloc’",網上搜了下說應該加入頭文件即可,即"#include<stdlib.h> #include<string.h>"。看了csdn上的文章<全面總結: Golang 調用 C/C++,例子式教程>,在"導入動態庫 .so 或 .dll 的形式"這一步中,main.go內存去鏈接libvideo.so庫的時候是-lvideo而不是llibvideo。否則會報錯找不到庫。
       想測試下go調用c/c++代碼,如果c/c++代碼中出現 內存泄漏,go的程序用top觀察其RES段是什么樣子,然后就在c代碼中調用malloc,編譯運行go程序並沒有什么特別的,后來在c代碼中在malloc后面調用memset,然后再編譯運行go程序發現RES段就很明顯,然后c代碼中sleep一段時間后,調用free函數去釋放申請的內存,編譯運行go程序並top觀察其RES段就會有下降。 后來又參考了文章<golang的cgo支持調用C++的方法>,同樣的如果c++代碼中申請了內存而沒有釋放,top觀察go程序進程的RES段會發現占用比較高,如果釋放后則會下降。而且用go tool pprof -inuse_space並不包含c++中申請的內存。奇怪如果C++代碼中定義了一個static int arr[1024];的變量然后memset初始化,則編譯得到的動態庫.so被go的代碼調用,然后go build test.go時會報錯"/usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1 /usr/local/go/src/runtime/alg.go:290:(.text+0x1163): relocation truncated to fit: R_X86_64_PC32 against `runtime.cpuid_ecx' /usr/local/go/src/runtime/alg.go:301:(.text+0x1267): relocation truncated to fit: R_X86_64_PC32 against `runtime.hashkey'"。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM