性能分析(6)- 如何迅速分析出系統 CPU 的瓶頸在哪裡
- 2020 年 8 月 12 日
- 筆記
- 性能分析, 測試高級進階技能系列 - 性能分析
性能分析小案例系列,可以通過下面鏈接查看哦
//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 指標,並用虛線表示關聯關係,對應出了性能分析下一步的方向
下面舉些小栗子
栗子一
- top 看到用戶態 CPU 使用率偏高
- 可以根據 pidstat 的輸出進一步觀察是否是某個進程導致的問題
- 找出 CPU 使用率偏高的進程之後就要用進程分析工具來分析進程的行為
- 比如使用 strace 分析系統調用情況,perf 分析調用鏈中各級函數的執行情況
栗子二
- top 看到平均負載升高
- 通過 vmstat 查看 R 狀態和 B 狀態的進程數,是否有數量上的異常
- 如果不可中斷狀態的進程數過多,需要做 I/O 的分析,可以通過 dstat 或 sar 工具來分析 I/O
- 如果是運行狀態的進程數過多,可以通過 pidstat 確認處於運行狀態的進程,然後用進程分析工具做進一步分析
栗子三
- top 看到軟中斷 CPU 使用率(si)偏高,進程列表能看到軟中斷進程 CPU 使用率也偏高
- 可以根據讀取 /proc/softirqs 查看軟中斷類型和變化頻率
- 如果是網路相關軟中斷導致的問題,可以進一步通過網路分析工具 sar、tcpdump 來分析