CPU負載
什麼是cpu負載:負載就是cpu在一段時間內正在處理以及等待cpu處理的進程數之和的統計信息,也就是cpu使用隊列的長度統計信息,這個數字越小越好(如果超過CPU核心*0.7就是不正常)
查看cpu負載
怎麼查看cpu負載?有好幾種方式。
1、w命令。
Linux w命令用於顯示目前登入系統的用戶信息。執行這項指令可得知目前登入系統的用戶有哪些人,以及他們正在執行的程序。但是w命令輸出的第一行,也有cpu負載的信息。w命令會在第一行顯示下列信息:當前時間、系統運行了多久時間、當前登錄的用戶有多少,以及前 1、5 和 15 分鐘系統的平均負載。
14:23:49 up 276 days, 4:15, 6 users, load average: 2.13, 0.77, 0.41
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/7 30.15.153.33 09:54 3:24m 0.49s 0.46s mysql -h
2、uptime命令,輸出的信息同w命令的第一行。
#uptime
14:28:13 up 276 days, 4:19, 6 users, load average: 2.15, 2.95, 1.52
3、top
命令。也是大多數人用的最多的命令。
top - 14:40:15 up 276 days, 4:31, 6 users, load average: 0.61, 1.18, 1.58
Tasks: 244 total, 1 running, 238 sleeping, 4 stopped, 1 zombie
Cpu(s): 3.3%us, 0.9%sy, 0.0%ni, 95.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16467424k total, 16358540k used, 108884k free, 166780k buffers
Swap: 0k total, 0k used, 0k free, 5494548k cached
第一行:同uptime
第三行:cpu(s),裏面這幾個需要解釋下。
us(user cpu
time
):用戶態使用的cpu時間比。該值較高時,說明用戶進程消耗的 CPU 時間比較多,比如,如果該值長期超過 50%,則需要對程序算法或代碼等進行優化。
sy(system cpu
time
):系統態使用的cpu時間比。
ni(user
nice
cpu
time
):用做
nice
加權的進程分配的用戶態cpu時間比
id
(idle cpu
time
):空閒的cpu時間比。如果該值持續爲0,同時sy是us的兩倍,則通常說明系統則面臨着 CPU 資源的短缺。
wa(io wait cpu
time
):cpu等待磁盤寫入完成時間。該值較高時,說明IO等待比較嚴重,這可能磁盤大量作隨機訪問造成的,也可能是磁盤性能出現了瓶頸。
hi(hardware irq):硬中斷消耗時間
si(software irq):軟中斷消耗時間
st(steal
time
):虛擬機偷取時間
這一行所有值加起來應該等於100%。
在Linux/Unix下,CPU利用率分爲用戶態,系統態和空閒態,分別表示CPU處於用戶態執行的時間,系統內核執行的時間,和空閒系統進程執行的時間。平時所說的CPU利用率是指:CPU執行非系統空閒進程的時間 / CPU總的執行時間。
CPU負載高
cpu低而負載高也就是說等待磁盤I/O完成的進程過多,就會導致隊列長度過大,這樣就體現到負載過大了,但實際是此時cpu被分配去執行別的任務或空閒。
場景一:磁盤讀寫請求過多就會導致大量I/O等待。
cpu的工作效率要高於磁盤,而進程在cpu上面運行需要訪問磁盤文件,這個時候cpu會向內核發起調用文件的請求,讓內核取磁盤取文件,這個時候會切換到其他進程,這個任務會變成不可中斷睡眠狀態。
注:與不可中斷睡眠狀態相對的是可中斷睡眠狀態。
不可中斷睡眠:是短時間的等待狀態。例如磁盤輸入輸出等待。被IO阻塞的進程。
可中斷睡眠:爲恢復時間無法預測的長時間等待狀態。如,來自鍵盤設備的輸入。
場景二:MySQL中存在沒有索引的語句或存在死鎖等情況。
mysql的數據是存儲在硬盤中,如果需要進行sql查詢,需要先把數據從磁盤加載到內存中。當數據特別大的時候,如果執行的sql語句沒有索引,就會造成掃描表的行數過大導致I/O阻塞,或者語句中存在死鎖,也會造成I/O阻塞,從而導致不可中斷睡眠進程過多,導致負載過大。