­

性能分析(6)- 如何迅速分析出系統 CPU 的瓶頸在哪裡

性能分析小案例系列,可以通過下面鏈接查看哦

//www.cnblogs.com/poloyy/category/1814570.html

 

前言

  • 在做性能測試時,我們會需要對 Linux 系統的性能指標進行分析
  • 這一篇就來講下 CPU 性能指標的一個整體分析思路流程
  • 總結出一個「又快又准」的瓶頸定位套路,在不同場景下,指標工具怎麼選,性能瓶頸怎麼找

 

CPU 性能指標

一共有四個需要掌握了解的性能指標

 

CPU 使用率

再次總結

  • 最常見的一個性能指標
  • 描述了非空閑時間佔總 CPU 時間的百分比
  • 根據 CPU 上運行任務的不同,又被分為:用戶 CPU、系統 CPU、等待 I/O CPU、軟中斷、硬中斷

 

用戶 CPU 使用率

  • 表示 CPU 在用戶態運行的時間百分比
  • 包括:用戶態的 CPU 使用率(user)和低優先順序的用戶態 CPU 使用率(nice) 
  • 用戶 CPU 使用率高,說明有應用程式比較繁忙

 

系統 CPU 使用率

  • 表示 CPU 在內核態運行的時間百分比(不包括中斷)
  • 系統 CPU 使用率高,說明內核比較繁忙

 

等待 I/O 的 CPU 使用率

  • 通常也稱為 iowait,表示等待 I/O 的時間百分比
  • iowait 高,通常說明系統與硬體設備的 I/O 交互時間比較長

 

軟中斷和硬中斷的 CPU 使用率

  • 分別表示內核調用軟中斷處理程式、硬中斷處理程式的時間百分比
  • 它們的使用率高,通常說明系統發生了大量的中斷

 

虛擬化環境

  • 竊取 CPU 使用率(steal):被其他虛擬機佔用的 CPU 時間百分比
  • 客戶 CPU 使 用率(guest):運行客戶虛擬機的 CPU 時間百分比

 

平均負載

平均活躍進程數

 

理想情況

  • 平均負載等於邏輯 CPU 個數,這表示每個 CPU 都恰好被充分利用
  • 如果平均負載大於邏輯 CPU 個數,就表示負載比較重了

 

進程上下文切換

兩種類型

  • 自願上下文切換:無法獲取資源而導致
  • 非自願上下文切換:被系統強制調度而導致

 

重點知識

  • CPU 上下文切換本身是保證 Linux 正常運行的一項核心功能
  • 過多的上下文切換,會將運行進程的 CPU 時間,消耗在暫存器、內核棧、虛擬記憶體等數據的保存和恢復上
  • 最終,縮短進程真正運行的時間,成為性能瓶頸

 

CPU 快取命中率

為什麼會有快取命中率

  • 由於 CPU 發展的速度遠快於記憶體的發展,CPU 的處理速度就比記憶體的訪問速度快得多
  • 這樣,CPU 在訪問記憶體的時候,免不了要等待記憶體的響應
  • 為了協調這兩者巨大的性能差距,CPU 快取(通常是多級快取)就出現了

  • 就像上面這張圖顯示的,CPU 快取的速度介於 CPU 和記憶體之間,快取的是熱點的記憶體數據
  • 根據不斷增長的熱點數據,這些快取按照大小不同分為 L1、L2、L3 等三級快取,其中 L1 和 L2 常用在單核中, L3 則用在多核中
  • 從 L1 到 L3,三級快取的大小依次增大,相應的,性能依次降低(當然比記憶體還是好得 多)
  • 而它們的命中率,衡量的是 CPU 快取的復用情況,命中率越高,則表示性能越好

 

CPU 性能工具

炒雞重點

把性能指標和性能工具聯繫起來,下面個將從兩個維度來講這個點

 

第一個維度:從 CPU 的性能指標出發

  • 也就是說,當你要查看某個性能指標時,要清楚知道哪些工具可以做到
  • 總結:哪個工具可以查看哪些指標

 

第二個維度:從工具觸發

要明確知道這個工具能提供哪些指標

 

重點!重點!重點!來了!

 

如何快速分析 CPU 的性能瓶頸

在實際生產環境中,我們通常都希望儘可能定位系統的瓶頸,然後儘可能優化性能,也就是要又快又准地解決性能問題

 

認知

  • 雖然 CPU 的性能指標比較多,但要知道,既然都是描述系統的 CPU 性能,它們就不會是完全孤立的,很多指標間都有一定的關聯
  • 想弄清楚性能指標的關聯性,就要通曉每種性能指標的工作原理

 

舉個栗子

  • 用戶 CPU 使用率(us)高,應該去排查進程的用戶態而不是內核態,因為用戶 CPU 使用率反映的就是用戶態的 CPU 使用情況
  • 而內核態的 CPU 使用情況只會反映到系統 CPU 使用率(sy)上

 

CPU 使用率高的場景,如何進行一系列的性能分析

列出了 top、vmstat 和 pidstat 分別提供的重要的 CPU 指標,並用虛線表示關聯關係,對應出了性能分析下一步的方向

下面舉些小栗子

 

栗子一

  1. top 看到用戶態 CPU 使用率偏高
  2. 可以根據 pidstat 的輸出進一步觀察是否是某個進程導致的問題
  3. 找出 CPU 使用率偏高的進程之後就要用進程分析工具來分析進程的行為
  4. 比如使用 strace 分析系統調用情況,perf 分析調用鏈中各級函數的執行情況

 

栗子二

  1. top 看到平均負載升高
  2. 通過 vmstat 查看 R 狀態和 B 狀態的進程數,是否有數量上的異常
  3. 如果不可中斷狀態的進程數過多,需要做 I/O 的分析,可以通過 dstat sar 工具來分析 I/O
  4. 如果是運行狀態的進程數過多,可以通過 pidstat 確認處於運行狀態的進程,然後用進程分析工具做進一步分析

 

栗子三

  1. top 看到軟中斷 CPU 使用率(si)偏高,進程列表能看到軟中斷進程 CPU 使用率也偏高
  2. 可以根據讀取 /proc/softirqs 查看軟中斷類型和變化頻率
  3. 如果是網路相關軟中斷導致的問題,可以進一步通過網路分析工具 sartcpdump 來分析