Cloud Performance Platform:基於PProf的性能分析雲平台

gperftools是我很喜歡的一個工具,是有Google開源的一套性能優化/分析工具,主要包含:

  • tcmalloc:一個高度優化的內存分配器,適合頻繁的小內存分配場景
  • profiler:CPU採樣工具
  • heap profiler:堆內存採樣工具
  • heap check:內存檢查工具
  • pprof:用於分析profiler/heapprofiler輸出數據,並生成各種格式輸出(PDF/SVG)

目前已經有大量服務通過集成gperftools的profiler和heapprofiler來支持在線調優,比如Impala。

為了支持在線調優,一般需要服務暴露幾個HTTP介面:

  • /pprof/profile:提供一段時間內的CPU採樣數據
  • /pprof/heapprofile:提供一段時間內的堆內存採樣數據
  • /pprof/growth:提供一段時間內堆內存增長的數據

在線服務響應HTTP請求,通過gperftools的介面獲取數據並返回,然後有pprof在接收端解析數據並生成輸出。

pprof收到的數據主要是所採樣進程的符號地址,需要翻譯為人類可理解的符號名,通常使用可執行文件的符號表來進行翻譯。

在小規模情況這種做法沒有任何問題,但擴展到一個大規模部署,大量開發人員/運維人員的場景時,會遇到幾個問題:

  • 不是每台機器都安裝了pprof
  • 不是每個人都了解怎麼使用pprof
  • 不一定有許可權登錄具體的實體機器

好在pprof支持遠程採樣,只需要被採樣的服務提供兩個HTTP介面:

  • /pprof/cmdline:提供服務啟動的命令
  • /pprof/symbol:pprof會批量post過來一批地址,服務將地址翻譯為符號名

cmdline介面很好實現,比如訪問/proc/self/cmdline即可,而symbol介面就比較困難了。symbol要做的工作,首先要讀取/prof/self/maps,獲取當前進程地址映射,然後看查詢地址匹配到哪個區間,然後看這個區間對應的是哪個文件(可能是可執行文件本身,也可能是系統庫,或者是第三方依賴的庫),讀取該文件的符號表,找到查詢的地址所映射的符號。

symbol要做的工作相當底層,我看到的集成pprof的服務很少有實現這個介面的。我實現了這個介面,可以參考。

symbol介面解決了遠程pprof的問題,但還需要進一步降低使用的難度。因此我這兩天利用業餘時間開發了一個簡單服務Cloud Performance Platform。

Cloud Performance Platform項目的目標是將使用pprof的難度降到最低,它提供了一個類似搜索引擎的界面。

用戶只需要提供在線服務埠,選擇採樣類型,即可得到採樣結果的SVG輸出,不如下面是一個CPU採樣的輸出。

除了pprof提供的SVG輸出,Cloud Performance Platform還提供火焰圖格式的輸出。

目前支持6種採樣類型:

  • CPU:CPU採樣,默認30秒,輸出有向圖,可用於分析程序執行熱點
  • HEAP:堆內存採樣,默認30秒,輸出有向圖,可用於分析內存申請熱點
  • CPU FlameGraph:CPU採樣,默認30秒,輸出火焰圖,可用於分析程序熱點,已經長尾調用
  • HEAP FlameGraph:HEAP採樣,默認30秒,輸出火焰圖,可用於分析內存申請熱點和異常申請流程
  • Growth:內存增長,輸出有向圖,用於分析內存的增長異常,不如內存泄漏
  • Growth FlameGraph:內存增長,輸出火焰圖,用於分析內存的增長異常的調用棧

無論是pprof輸出的有向圖,還是Brendan Gregg所設計的火焰圖,都是相當直觀的展現形式,可以快速幫助開發定位問題,我在工作中使用pprof解決了大量程序熱點,內存泄漏的問題。Cloud Perfmance Platform相信可以將pprof使用難度降到最低。

Cloud Perfmance Platform使用openresty開發,它的強大易用是我可以很快將服務搭建起來(雖然我的工程可能不那麼標準:)。

項目放在github:robbinfan/cloud-perf

玩的開心!

推薦閱讀:

UWA優化日廈門站回顧 | 資深TA教你如何將藝術概念轉化為渲染代碼
你應該知道的AssetBundle管理機制
千億特徵流式學習在大規模推薦排序場景的應用
Unity3D回合制手游《星辰奇緣》性能測評深度分析
Unity匿名函數的堆內存優化

TAG:性能优化 | 运维自动化 |