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

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

       而後仍是以前的關鍵字"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來拷貝時說該文件不存在。c++

       若是程序代碼中沒有`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'"。
相關文章
相關標籤/搜索