go pprof 你真用對了嗎

Hi, 使用多年的go pprof檢查內(nèi)存泄漏的方法居然是錯的?! 起個好標(biāo)題確實能增加訪問量 最近在做一個 Redis 的 Proxy 的項目,其中利用Redis 6.0 新加的 tracking 功能實現(xiàn)客戶端緩存的功能,可以為某些特定的redis使用場景提高吞吐和延遲。 當(dāng)然,cache的實現(xiàn)也是有代價的。首先,cache的大小不能無限制的大,否則總有一點會把內(nèi)存撐爆的;其次,cache的淘汰算法有多種方式,LRU、LFU等等,具體可以參考Cache replacement policies,不同的場景下各種淘汰算法的效果是不一樣的;第三,對于大并發(fā)情況實現(xiàn)cache是有代價的,因為并發(fā)情況下對cache的訪問需要加鎖,而加鎖就意味著有性能的損失。 我在實現(xiàn)這個cache的過程中稍微偷了一下懶, 想盡量的減少鎖的scope,結(jié)果導(dǎo)致內(nèi)存泄漏的問題。本來cache占用的最大內(nèi)存我設(shè)置為10GB, 結(jié)果過了個周末發(fā)現(xiàn)程序已經(jīng)占用了80GB的內(nèi)存了。 當(dāng)然本文不是要介紹這個項目的內(nèi)存泄漏原因,而是介紹一下Go pprof工具查找內(nèi)存泄漏的一個不太常用的方法。 檢查Go程序內(nèi)存的使用情況最常用的就是Go標(biāo)準(zhǔn)庫自帶的pprof庫了,可以通過http暴露出這個profile, 然后通過go tool pprof或者pprof工具命令行/web方式查看。 比如下面的命令, 可以獲取服務(wù)器http://ip:port的堆信息,并且在本機9090端口啟動一個服務(wù)器展示堆的信息。 ``` go tool pprof -http :9090 http://ip:port/debug/pprof/heap ``` 在堆信息中你可以查看分配的堆的大小和對象數(shù)量,或者當(dāng)前沒有釋放的占用的堆的大小和對象數(shù)量。 ![](https://upload-images.jianshu.io/upload_images/28338950-0334d75e3a6d3f13.png) 正常情況下使用這個方式就可以比較直觀的看到哪一段代碼分配的內(nèi)存比較多,然后確定那里容易產(chǎn)生內(nèi)存泄漏。 **但是**, 分配堆內(nèi)存比較多的地方并不一定產(chǎn)生內(nèi)存泄漏,只能說明這個地方"曾經(jīng)/正在"分配的堆內(nèi)存比較大,或者分配的堆內(nèi)存比較頻繁俄安,這些分配的內(nèi)存可能在之后就回收掉了。 像Java的一些profiler工具一樣, pprof也可以比較兩個時間點的分配的內(nèi)存的差值,通過比較差值,就容易看到哪些地方產(chǎn)生的內(nèi)存"殘留"的比較多,沒有被內(nèi)存釋放,極有可能是內(nèi)存泄漏的點。 你可以通過下面的方式產(chǎn)生兩個時間點的堆的profile,之后使用pprof工具進行分析。 1. 首先確保你已經(jīng)配置了pprof的http路徑, 可以訪問http://ip:port/debug/pprof/查看(如果你沒有修改默認(rèn)的pprof路徑) 2. 導(dǎo)出時間點1的堆的profile: curl -s http://127.0.0.1:8080/debug/pprof/heap > base.heap, 我們把它作為基準(zhǔn)點 3. 喝杯茶,等待一段時間后導(dǎo)出時間點2的堆的profile: curl -s http://127.0.0.1:8080/debug/pprof/heap > current.heap 4. 現(xiàn)在你就可以比較這兩個時間點的堆的差異了: go tool pprof --base base.heap current.heap 操作和正常的go tool pprof操作一樣, 比如使用top查看使用堆內(nèi)存最多的幾處地方的內(nèi)存增刪情況: ![](https://upload-images.jianshu.io/upload_images/28338950-2a2ea399d15fb71a.png) 使用web命令會生成一個SVG文件,可能你需要使用瀏覽器打開它。 或者你直接使用命令打開web界面: `go tool pprof --http :9090 --base base.heap current.heap`。 ![](https://upload-images.jianshu.io/upload_images/28338950-a5dfe68dee09fd61.png) > 原文地址: https://colobu.com/2019/08/20/use-pprof-to-compare-go-memory-usage/#more 關(guān)注獲取更多好文 ![](https://upload-images.jianshu.io/upload_images/28338950-f5436cc836ef371b.png) 本文由[mdnice](https://mdnice.com/?platform=6)多平臺發(fā)布
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容