Linux性能優化-CPU使用率


CPU 使用率是單位時間內 CPU 使用情況的統計,以百分比的方式展示。那么,作為最常用也是最熟悉的 CPU 指標,你能說出 CPU 使用率到底是怎么算出來的嗎?再有,諸如 top、ps 之類的性能工具展示的 %user、%nice、 %system、%iowait 、%steal 等等,你又能弄清楚它們之間的不同嗎?

什么指標來描述系統的CPU性能

CPU使用率

用什么指標來描述系統的 CPU 性能呢 ? 不是平均負載,也不是CPU上下文切換,而是另一個更直觀的指標CPU使用
率 ,CPU 使用率是單位時間內 CPU 使用情況的統計,以百分比的方式展示。

節拍率的概念

Linux 作為一個多任務操作系統,將每個 CPU 的時間划分為很短的時間片,再通過調度器輪流分配給各個任務使用,因此造成多任務同時運行的錯覺。

為了維護 CPU 時間,Linux 通過事先定義的節拍率(內核中表示為 HZ),觸發時間中斷,並使用全局變量 Jiwies 記錄了開機以來的節拍數。每發生一次時間中斷,Jiwies 的值就加 1。

查看系統節拍率

不同的系統可能設置不同數值,你可以通過查詢 /boot/config 內核選項來查看它的配置值。

[root@iZwz91q87vgg7bo2ixi9wjZ ~]# grep 'CONFIG_HZ=' /boot/config-$(uname -r)
CONFIG_HZ=1000

1000代表每秒鍾觸發 1000 次時間中斷

用戶節拍率

正因為節拍率 HZ 是內核選項,所以用戶空間程序並不能直接訪問。為了方便用戶空間程序,內核還提供了一個用戶空間節拍率 USER_HZ,它總是固定為 100,也就是 1/100 秒。這樣,用戶空間程序並不需要關心內核中 HZ 被設置成了多少,因為它看到的總是固定值 USER_HZ。

CPU使用率公式

CPU使用率,就是除了空閑時間外的其他時間占總CPU時間的百分比,用公式來表示就是
image

事實上,為了計算機CPU使用率,性能能工具一般都會間隔一段時間(比如 3 秒)的兩次值,做差后,再計算出這段時間的平均CPU使用率
image
這個公式,就是我們用各種性能工具所看到的 CPU 使用率的實際計算方法。

怎么查看CPU使用率

查看 CPU 使用率 top 、ps 和pidstat是最常用的性能分析工具 :

  • top 顯示了系統總體的 CPU 和內存使用情況,以及各個進程的資源使用情況。
  • ps 則只顯示了每個進程的資源使用情況。
  • pidstat分析每個進程CPU使用情況

top命令

top顯示了系統總體的CPU和內存使用情況,以及各個進程的資源使用情況
image

top命令圖解

使用top命令查看系統的當前運行的情況。如圖對top命令執行的結果做了簡單的圖解,下面針對每一項做詳細的解釋。
image

top命令的第一行“top - 19:56:47 up 39 min, 3 users, load average: 0.00, 0.00, 0.00”顯示的內容依次為“系統當前時間 、系統到目前為止已運行的時間、當前登錄系統的用戶數量、系統負載(任務隊列的平均長度)三個值分別為1分鍾、5分鍾、15分鍾前到現在的平均值【這三個一般會小於1,如果持續高於5,請仔細查看哪個程序影響系統的運行】”

image

top命令的第二行“Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie”顯示的內容依次“所有啟動的進程數”、“正在運行的進程數”、“掛起的進程數”、“停止的進程數”、“僵屍進程數”。
image

top命令的第三行“Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st”顯示的內容依次為“用戶空間占用CPU百分比”、“內核空間占用CPU百分比”、“用戶空間內改變過優先級的進程占用CPU百分比”、“空閑CPU百分比”、“等待輸入輸出CPU時間百分比”、“CPU服務於硬件中斷所耗費的時間總額”、“CPU服務軟中斷所耗費的時間總額”、“Steal Time”
image

top命令第四行“Mem: 508820k total, 480172k used, 28648k free, 41944k buffers”顯示內容依次為“物理內存總量”、“已使用的物理內存”、“空閑物理內存”、“內核緩存內存量”。
image

top命令第5行“PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND ”顯示內容依次為“進程ID”、“進程所有者”、“優先級”、“nice值,負值表示高優先級,正值表示低優先級”、“進程使用的虛擬內存總量”、“進程使用的、未被換出的物理內存大小”、“共享內存大小”、“進程狀態”、“上次更新到現在的CPU時間占用百分比”、“進程使用的物理內存百分比”、“進程使用CPU總時間”、“命令名、命令行”。
image

pidstat命令

top並沒有細分進程的用戶態CPU和內核態CPU,通過pidstat分析每個進程CPU使用情況

[root@iZwz91q87vgg7bo2ixi9wjZ ~]# pidstat 1 5
Linux 3.10.0-1160.11.1.el7.x86_64 (iZwz91q87vgg7bo2ixi9wjZ) 	2021年11月24日 	_x86_64_	(2 CPU)

16時50分32秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
16時50分33秒     0      1144    0.99    0.00    0.00    0.99     1  AliYunDun

image

CPU使用率過高怎么辦

  1. 找到CPU使用率過高的進程
    通過top、ps 、pidstat等工具

  2. 找到占用CPU高的到底是代碼里的哪個函數
    通過perf工具,perf 是 Linux 2.6.31 以后內置的性能分析工具。它以性能事件采樣為基礎,不僅可以分析系統的各種事件和內核性能,還可以用來分析指定應用程序的性能問題。

安裝perf工具

yum -y install httpd-tools

perf top

第一種常見用法是 perf top,類似於 top,它能夠實時顯示占用 CPU 時鍾最多的函數或者
指令,因此可以用來查找熱點函數,使用界面如下所示:
image

輸出結果中,第一行包含三個數據,分別是采樣數(Samples)、事件類型(event)和事件總數量(Event count)。
另外,采樣數需要我們特別注意。如果采樣數過少(比如只有十幾個),那下面的排序和百分比就沒什么實際參考價值了。

再往下看是一個表格式樣的數據,每一行包含四列,分別是:

  • 第一列 Overhead ,是該符號的性能事件在所有采樣中的比例,用百分比來表示。
  • 第二列 Shared ,是該函數或指令所在的動態共享對象(Dynamic Shared Object),如內核、進程名、動態鏈接庫名、內核模塊名等。
  • 第三列 Object ,是動態共享對象的類型。比如 [.] 表示用戶空間的可執行程序、或者動態鏈接庫,而 [k] 則表示內核空間。
  • 最后一列 Symbol 是符號名,也就是函數名。當函數名未知時,用十六進制的地址來表示。

perf record / perf report

接着再來看第二種常見用法,也就是 perf record 和 perf report。 perf top 雖然實時展示了系統的性能信息,但它的缺點是並不保存數據,也就無法用於離線或者后續的分析。而perf record 則提供了保存數據的功能,保存后的數據,需要你用 perf report 解析展示。

# -g 開啟調用關系分析,-p 指定 php-fpm 的進程號 21515
# 按方向鍵選擇進程 按回車鍵展開詳情
 perf top -g -p 21515
perf record # 按 Ctrl+C 終止采樣
perf report # 展示類似於 perf top 的報告

在實際使用中,我們還經常為 perf top 和 perf record 加上 -g 參數,開啟調用關系的采樣,方便我們根據調用鏈來分析性能問題。


免責聲明!

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



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