perf + 火焰圖用法 小結


要對新服務做性能測試,分析代碼熱點,初識perf,做下總結

  • perf + 火焰圖用法

    • perf簡介

      Perf (Performance Event), Linux 系統原生提供的性能分析工具, 會返回 CPU 正在執行的函數名以及調用棧(stack)

      • 通過它,應用程序可以利用 PMU,tracepoint 和內核中的特殊計數器來進行性能統計。它不但可以分析指定應用程序的性能問題 (per thread)
        ,也可以用來分析內核的性能問題,當然也可以同時分析應用代碼和內核,從而全面理解應用程序中的性能瓶頸

      • 通常,它的執行頻率是 99Hz(每秒99次),如果99次都返回同一個函數名,那就說明 CPU 這一秒鍾都在執行同一個函數,可能存在性能問題

        sudo perf record -F 99 -p 13204 -g -- sleep 30
        
      • 上面的代碼中,perf record表示記錄,-F 99表示每秒99次,-p 13204是進程號,即對哪個進程進行分析,-g表示記錄調用棧,sleep 30則是持續30秒

      • 運行后會產生一個龐大的文本文件。如果一台服務器有16個 CPU,每秒抽樣99次,持續30秒,就得到 47,520 個調用棧,長達幾十萬甚至上百萬行。

      • 為了便於閱讀,perf record命令可以統計每個調用棧出現的百分比,然后從高到低排列

    • 火焰圖簡介

      火焰圖(flame graph), 是基於 perf 結果產生的 SVG 圖片,用來展示 CPU 的調用棧

      • y 軸表示調用棧,每一層都是一個函數。調用棧越深,火焰就越高,頂部就是正在執行的函數,下方都是它的父函數。

      • x軸表示抽樣數,如果一個函數在 x 軸占據的寬度越寬,就表示它被抽到的次數多,即執行的時間長。注意,x 軸不代表時間,而是所有的調用棧合並后,按字母順序排列的。

      • 火焰圖就是看頂層的哪個函數占據的寬度最大。只要有"平頂"(plateaus),就表示該函數可能存在性能問題。

      • 顏色沒有特殊含義,因為火焰圖表示的是 CPU 的繁忙程度,所以一般選擇暖色調。

    • 火焰圖互動性

      火焰圖是 SVG 圖片,可以與用戶互動。

      • 鼠標懸浮

        • 火焰的每一層都會標注函數名,鼠標懸浮時會顯示完整的函數名、抽樣抽中的次數、占據總抽樣次數的百分比。下面是一個例子

          Function: Taf::TC_Thread::threadEntry (7,665 samples, 49.9%)
          
      • 點擊放大

        • 在某一層點擊,火焰圖會水平放大,該層會占據所有寬度,顯示詳細信息
        • 左上角會同時顯示"Reset Zoom",點擊該鏈接,圖片就會恢復原樣。
      • 搜索

        • 按下 Ctrl + F 會顯示一個搜索框,用戶可以輸入關鍵詞或正則表達式,所有符合條件的函數名會高亮顯示
    • 實例

      • 登錄宿主機或者容器

        go -d A
        
      • 查看進程pid

        ps aux|grep name
        
      • 使用perf記錄和生成

        perf record -F 99 -p 101503 -m 4 -g -a -- sleep 60
        perf script > out.perf
        
      • 制作火焰圖

        • 從github上clone下來

          git clone https://github.com/brendangregg/FlameGraph.git
          cd FlameGraph
          
        • 處理perf script

          ./stackcollapse-perf.pl out.perf > out.folded
          
        • 繪制SVG

          ./flamegraph.pl out.folded > pmCount.svg
          
    • 火焰圖局限性

      • 調用棧不完整
        • 當調用棧過深時,某些系統只返回前面的一部分(比如前10層)。
      • 函數名缺失
        • 有些函數沒有名字,編譯器只用內存地址來表示(比如匿名函數)。
    • 火焰圖示例

      火焰圖

      • 從圖中看出,jce 的display方法是代碼熱點,占用cpu資源很高, 優化之后預計性能提升20%+
  • 后台服務性能測試常見指標

    • 測試指標

      • QPS(吞吐量)

        • 每秒鍾系統能夠處理的請求數、任務數
      • 響應時間

        • 服務處理一個請求或一個任務的耗時
      • 錯誤率

        • 一批請求中結果出錯的請求所占比例
    • 壓測

      • 參數

        • 並發數
        • 請求個數
      • 分析

        • req個數
        • 有效rsp個數
        • 耗時分布
          • 耗時隨QPS上升的曲線
        • QPS
          • 第一次出現異常,即當前系統已經開始出現異常(QPS=有效RSP/主調超時時間)
        • 異常率統計
          • 異常率=失敗RSP/REQ
    • 優化

      • 分析服務瓶頸

        • top
        • vmstat
        • google-perftools
      • 專項優化

        • CPU分析
          • perf
          • 火焰圖
        • 內存分析
  • 參考


免責聲明!

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



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