下面分析近期做過的一個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, 另一個是操作數據庫。 這樣我們就可以有針對性的進行優化了


