CPU利用率和負載

CPU利用率和CPU負載的區(qū)別是什么
提到CPU利用率,就必須理解時間片。什么是CPU時間片?我們現(xiàn)在所使用的Windows、Linux、Mac OS都是“多任務操作系統(tǒng)”,就是說他們可以“同時”運行多個程序,比如一邊打開Chrome瀏覽器瀏覽網頁還能一邊聽音樂。

但是,實際上一個CPU內核在同一時刻只能干一件事,那操作系統(tǒng)是如何實現(xiàn)“多任務”的呢?大概的方法是讓多個進程輪流使用CPU一小段時間,由于這個“一小段時間”很短(在linux上為5ms-800ms之間),用戶感覺不到,就好像是幾個程序同時在運行了。上面提到的“一小段時間”就是我們所說的CPU時間片,CPU的現(xiàn)代分時多任務操作系統(tǒng)對CPU都是分時間片使用的。

CPU使用率,就是程序對CPU時間片的占用情況,即CPU使用率 = CPU時間片被程序使用的時間 / 總時間。比如A進程占用10ms,然后B進程占用30ms,然后空閑60ms,再又是A進程占10ms,B進程占30ms,空閑60ms,如果在一段時間內都是如此,那么這段時間內的CPU占用率為40%。CPU利用率顯示的是程序在運行期間實時占用的CPU百分比。

大多數(shù)操作系統(tǒng)的CPU占用率分為用戶態(tài)CPU使用率和系統(tǒng)態(tài)CPU使用率。用戶態(tài)CPU使用率是指執(zhí)行應用程序代碼的時間占總CPU時間的百分比。相比而言,系統(tǒng)態(tài)CPU使用率是指應用執(zhí)行操作系統(tǒng)調用的時間占總CPU時間的百分比。系統(tǒng)態(tài)的CPU使用率高意味著共享資源有競爭或者I/O設備之間有大量的交互。

而CPU負載顯示的是一段時間內正在使用和等待使用CPU的平均任務數(shù)。

簡單理解,一個是CPU的實時使用情況,一個是CPU的當前以及未來一段時間的使用情況。舉例來說:如果我有一個程序它需要一直使用CPU的運算功能,那么此時CPU的使用率可能達到100%,但是CPU的工作負載則是趨近于“1”,因為CPU僅負責一個工作嘛!如果同時執(zhí)行這樣的程序兩個呢?CPU的使用率還是100%,但是工作負載則變成2了。所以也就是說,CPU的工作負載越大,代表CPU必須要在不同的工作之間進行頻繁的工作切換。無論CPU的利用率是高是低,跟后面有多少任務在排隊(CPU負載)沒有必然關系。

如果單核CPU的話,負載達到1就代表CPU已經達到滿負荷的狀態(tài)了,超過1,后面的進行就需要排隊等待處理了。如果是是多核多CPU,假設現(xiàn)在服務器是2個CPU,每個CPU有2個核,那么總負載不超過4都沒什么問題。

可以通過uptime、w命令查看CPU平均負載,使用top命令還能看到CPU負載總體使用率以及各個進程占用CPU的比例。

image.png

查看物理CPU個數(shù)

cat /proc/cpuinfo| grep “physical id”| sort | uniq| wc -l

查看每個物理CPU中core的個數(shù)(即核數(shù))

cat /proc/cpuinfo| grep “cpu cores” | uniq

查看邏輯CPU的個數(shù)

cat /proc/cpuinfo| grep “processor”| wc -l

如果CPU負載很高,利用率卻很低該怎么辦

CPU負載很高,利用率卻很低,說明處于等待狀態(tài)的任務很多,負載越高,代表可能很多僵死的進程。通常這種情況是IO密集型的任務,大量任務在請求相同的IO,導致任務隊列堆積。

生產環(huán)境造成CPU利用率低負載高的具體場景常見的有如下幾種。

場景一:磁盤讀寫請求過多就會導致大量I/O等待

進程在cpu上面運行需要訪問磁盤文件,這個時候cpu會向內核發(fā)起調用文件的請求,讓內核去磁盤取文件,這個時候cpu會切換到其他進程或者空閑,這個任務就會轉換為不可中斷睡眠狀態(tài)。當這種讀寫請求過多就會導致不可中斷睡眠狀態(tài)的進程過多,從而導致負載高,cpu低的情況。

場景二:MySQL中存在沒有索引的語句或存在死鎖等情況

我們都知道MySQL的數(shù)據(jù)是存儲在硬盤中,如果需要進行sql查詢,需要先把數(shù)據(jù)從磁盤加載到內存中。當在數(shù)據(jù)特別大的時候,如果執(zhí)行的sql語句沒有索引,就會造成掃描表的行數(shù)過大導致I/O阻塞,或者是語句中存在死鎖,也會造成I/O阻塞,從而導致不可中斷睡眠進程過多,導致負載過大。

同樣,可以先通過top命令觀察,假設發(fā)現(xiàn)現(xiàn)在確實是高負載低使用率。

圖片

然后,再通過命令ps -aux查看是否存在狀態(tài)為D的進程,這個狀態(tài)指的就是不可中斷的睡眠狀態(tài)的進程。處于這個狀態(tài)的進程無法終止,也無法自行退出,只能通過恢復其依賴的資源或者重啟系統(tǒng)來解決。以下圖中沒有D狀態(tài)的進程。

圖片

Linux上進程的五種狀態(tài)

  • R (TASK_RUNNING):可執(zhí)行狀態(tài),只有在該狀態(tài)的進程才可能在CPU上運行。而同一時刻可能有多個進程處于可執(zhí)行狀態(tài)。

  • S (TASK_INTERRUPTIBLE):可中斷的睡眠狀態(tài),處于這個狀態(tài)的進程因為等待某某事件的發(fā)生(比如等待socket連接、等待信號量),而被掛起。

  • D (TASK_UNINTERRUPTIBLE):不可中斷的睡眠狀態(tài),進程處于睡眠狀態(tài),但是此刻進程是不可中斷的。TASK_UNINTERRUPTIBLE狀態(tài)存在的意義就在于,內核的某些處理流程是不能被打斷的。

  • T (TASK_STOPPED or TASK_TRACED):暫停狀態(tài)或跟蹤狀態(tài)。

  • Z (TASK_DEAD - EXIT_ZOMBIE):退出狀態(tài),進程成為僵尸進程。進程已終止,但進程描述還在,直到父進程調用wait4()系統(tǒng)調用后釋放。

CPU利用率達到100%怎么排查問題

1、通過top找到CPU占用率高的進程

圖片

2、通過top -Hp pid命令查看CPU占比靠前的線程ID

圖片

3、再把線程ID轉化為16進制,printf “0x%x\n” 74317,得到0x1224d

image.png

4、通過命令jstack 72700 | grep ‘0x1224d’ -C5 --color找到有問題的代碼

注意:jstack的對象是java進程的PID,而不是java線程的PID。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • CPU利用率與負載的關系: Linux 下 CPU 使用率與機器負載的關系與區(qū)別: linux 下查看機器是cpu...
    shuff1e閱讀 660評論 0 0
  • CPU使用率其實就是你運行的程序占用的CPU資源,表示你的機器在某個時間點的運行程序的情況。使用率越高,說明你的機...
    linbj閱讀 3,761評論 0 1
  • CPU利用率和Load Average的區(qū)別 CPU利用率:CPU利用率在過去常常被我們這些外行認為是判斷機器是否...
    迷糊銀兒閱讀 674評論 0 0
  • CPU的load和使用率傻傻分不清 1. 什么是Cpu的Load 查看方式:uptimetopcat /proc/...
    木石文若閱讀 2,583評論 0 0
  • 1理解CPU平均負載 啥是CPU平均負載呢? 日常運維我們常用uptime或top命令查看系統(tǒng)當前負載,也可以使用...
    Alice暗閱讀 942評論 0 1

友情鏈接更多精彩內容