【linux性能優化5】某個應用CPU使用率很高

CPU使用率的概念

CPU使用率是單位時間內CPU的使用情況,以百分比的方式展示。Linux是一個多任務的操作系統,將每個CPU的時間劃分爲很短的時間片,再通過調度器輪流分配給各個任務,爲了維護CPU時間,Linux通過事先定義的節拍率,內核中用HZ表示,觸發時間中斷,並使用全局變量Jiffies記錄開機以來的節拍數。每發生了一次中斷,節拍數Jiffies就加1.
節拍率HZ是內核的配置選項,可以設置爲100,250,1000等。不同的系統設置的節拍率可能不一樣,可以使用下面的命令來查看當前系統的節拍率。
在這裏插入圖片描述
Linux通過proc虛擬文件系統,向用戶空間提供系統的內部狀態的信息,而/proc/stat提供的就是系統的cpu和任務統計信息。
使用下面的命令可只輸出各個CPU的狀態信息

cat /proc/stat | grep ^cpu

在這裏插入圖片描述
以上輸出的是一個表格,第一列是CPU編號,如CPU0 CPU1等,第一行沒有CPU編號表示的是所有CPU的累加信息。其他列則表示不同場景下CPU的累加節拍數,單位爲USER_HZ也就是10ms,也就是不同場景下的CPU時間。
通過 man proc命令可以查看如上輸出信息的具體含義。
在這裏插入圖片描述

在這裏插入圖片描述

  • User 縮寫爲us 代表了用戶CPU時間。它不包括下面的nice時間,但是包括了guest時間
  • Nice 縮寫爲ni 代表了低優先級用戶態CPU時間。也就是進程的nice只被調整爲1-19之間時的CPU時間。Nice的值越大優先級越低
  • System 縮寫爲sys 代表內核態CPU時間
  • Idle 縮寫爲id 代表CPU空閒時間,它不包括等待io的時間iowait。
  • Iowait 所繫爲wa,代表等待IO的CPU時間
  • Irq縮寫爲hi 代表處理中斷的CPU時間
  • Softirq 縮寫爲si 代表數據軟中斷的CPU時間
  • Steal 縮寫爲st,代表當系統正在虛擬機中運行時,被其他虛擬機佔用的CPU時間
  • Guest 縮寫爲guest 代表通過虛擬機運行其他操作系統的時間,也就是運行虛擬機的CPU時間
  • Guest_nice 縮寫爲gnice代表以低優先級運行虛擬機的時間

通常所說的CPU使用率,就是指除了空閒時間之外的其他時間佔總的CPU時間的百分比。
在這裏插入圖片描述
跟系統指標類似,linux系統也爲每個進程提供了運行情況的統計信息,也就是/proc/[pid]/stat.其輸出信息的具體含義同樣可以通過man proc來查看。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

如何查看CPU使用率

查看CPU使用率,首先想到的肯定是top ps命令。Top和ps是最常用的性能分析工具,其中:

  • Top顯示了系統總體的CPU和內存使用情況,以及各個進程的資源使用情況
  • Ps只顯示每個進程的資源使用情況
    Top命令的輸出格式如下
    在這裏插入圖片描述
    輸出結果的第三行中%Cpu(s)就是系統的CPU使用率,top默認顯示的是所有cpu的平均值,在該界面按下數字1就可以切換到顯示每個CPU的時間了。
    在這裏插入圖片描述
    繼續分析top的輸出信息,空白行之後就是每個進程的實時信息,每個進程都一個%CPU列,就表示該進程的CPU使用率。它是用戶態和內核態CPU使用率的總和,包括了進程用戶空間使用的CPU、通過系統調用執行內核空間的CPU、以及在就緒隊列等待運行的CPU時間。因此top命令的輸出並沒有區分用戶態CPU和內核態CPU,如要查看每個進程在不同空間下的CPU使用率就需要使用pidstat這個命令。
    Pidstat命令正是分析各個進程CPU使用情況的工具。
pidstat 1 5

在這裏插入圖片描述
上面的命令每隔1秒輸出5組進程的CPU使用信息,其中包括
%usr:用戶態cpu使用率
%system:內核態cpus使用率
%guest:運行虛擬機cpu使用率
%CPU:總的CPU使用率。

CPU使用率過高怎麼辦?

通過上面的top ps以及pidstat命令可以很快的找到cpu使用率高的進程,但是如何找到佔用CPU使用率的到底是代碼裏的哪個函數呢?只有找到他纔有可能更高效的更有針對性的去優化。
這裏推薦的工具是perf,perf是linux2.6.31之後內置的性分析工具。它以性能事件採樣爲基礎,不僅可以分析系統的各種事件和內核性能,還可以用來分析指定的應用程序的性能問題。
Perf命令第一個常見用法是perf top。類似於top 它能夠實時顯示佔用CPU時鐘最多的函數或者指令,因此可以用來查找佔用cpu的具體函數。
在這裏插入圖片描述
Perf top的輸出結果中,第一行包含是三個數據分別是採樣數Samples、事件類型Event和事件總數量Event Count。
第一列overhead,是該符號的性能事件在所有采樣中所佔的比例。
第二列shared,是該函數或者指令所在的動態共享對象,如內核、進程名、動態鏈接庫名、內核模塊名等
第三列object,是動態共享對象的類型。[.]表示用戶空間的可執行程序或者動態鏈接庫,[k]則表示內核空間。
最後一列symbol是符號名,也就是函數名。當函數名未知時使用16進制的地址來表示

發佈了93 篇原創文章 · 獲贊 93 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章