第八章--實際項目性能分析--pprof分析beego項目的性能


下面分析近期做過的一個beego項目

最新開發了一個go項目, 目前已經上線, 昨天研究了性能測試, 那就對之前做的項目進行一個性能分析吧

給beeg項目添加pprof功能. 百度查了, 說beego是支持pprof的, 只需要在配置文件中beego.PprofOn = true開啟即可, 但我試了似乎不行. 采用另一種方法

第一步: import 增加net/http/pprof包  

import(
    _ net/http/pprof
)

第二步: 打開http端的監聽端口

go func() {
        http.ListenAndServe("localhost:8888", nil)
}()

這里定義了一個協程, 我直接把這個協程放在main啟動函數里了, 和main函數一起啟動監聽程序

第三步: 在網頁上查看, 輸入http://localhost:8888/debug/profile, 這是會看到如下頁面

 

為什么我們的heap才是2, 原因是,這個項目我是剛剛啟動的。 隨着請求訪問的增加,連接數也會增加。 后面我們來模擬大量http請求, 具體含義如下

  • 2 allocs: 過去所有內存分配的樣本
  • 0 block: 堆棧導致對原始同步的阻塞
  • 0 cmline: 當前程序的命令行調用
  • 16 goroutine: 當前所有goroutine的堆棧跟蹤
  • 2 heap: 活動對象內存分配的采樣。您可以指定gc GET參數以在獲取堆樣本之前運行GC。
  • 0 mutex: 競爭互斥持有人的堆棧痕跡
  • 0 profile: CPU配置文件。您可以在GET參數中指定持續時間。獲取概要文件后,請使用go tool pprof命令調查文件。
  • 21 threadcreate: 導致創建新OS線程的堆棧跟蹤
  • 0 trace: 當前程序執行的痕跡。您可以在GET參數中指定持續時間。獲取跟蹤文件后,使用go工具trace命令調查跟蹤。

 

第四步: 通過Graphviz, 查看heap 

從圖中看, cpu的使用是0, heap的使用是2, 所以, 我們查看heap. 

go tool pprof http://127.0.0.1:8888/debug/pprof/heap

然后輸入web, 生成svg文件, 直接用瀏覽器打開, 如下:

inuse_space表示的是數據的類型是實時數據

            

          

 

通過這個圖, 我們看到main調用以后的執行過程, 每一步的耗時是多少。

 

第五步: 模擬並發, 測試性能

1. 下載一個模擬http請求的工具wrk(模擬現實, 了解系統瓶頸, 將服務器置於一個繁忙的狀態, 就像生產環境一樣. ), 下載地址: https://github.com/wg/wrk.git

在github上也有這個工具的介紹, 

git clonehttps://github.com/wg/wrk.git
cd wrk
make

備注: 整個操作參考github上的說明即可.

2. 安裝好wrk以后, 模擬批量請求

./wrk -c400 -t8 -d5m http://localhost:8888/deer/v1/user/login

我模擬的是批量登錄, 參數含義如下

  • -c400: 我們有400個連接可以保持打開狀態
  • -t8 :意味着我們使用8個線程來構建請求
  • -d5m 表示測試時間將持續5分鍾

3. 在瀏覽器輸入

http://localhost:8888/debug/pprof/

查看使用情況:

4. awk執行完以后, 查看執行結果匯總

5. 接下來用go tool pprof 查看 heap

go tool pprof -alloc_space/-inuse_space http://localhost:8888/debug/pprof/heap

 

 

 

 

 

可以清晰的看到兩塊占內存使用最多的地方, 第一個是bufio的Writer和Reader, 另一個是操作數據庫。 這樣我們就可以有針對性的進行優化了

 

 

 

 


免責聲明!

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



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