load average的概念
系統平均負載定義:在特定時間間隔內運行隊列中(在CPU上運行或者等待運行多少進程)的平均進程數。如果一個進程滿足以下條件則其就會位於運行隊列中:
- 它沒有在等待I/O操作的結果
- 它沒有主動進入等待狀態(也就是沒有調用’wait’)
- 沒有被停止(例如:等待終止)
在Linux中,進程分為三種狀態,一種是阻塞的進程blocked process,一種是可運行的進程runnable process,另外就是正在運行的進程running process
進程可運行狀態時,它處在一個運行隊列run queue中,與其他可運行進程爭奪CPU時間。 系統的load是指正在運行和准備好運行的進程的總數
比如現在系統有2個正在運行的進程,3個可運行進程,那么系統的load就是5。load average就是一定時間內的load數量
只要每個CPU的當前活動進程數不大於3那么系統的性能就是良好的,如果每個CPU的任務數大於5,那么就表示這台機器的性能有嚴重問題
CPU使用率高並不總是意味着CPU工作繁忙,它有可能是正在等待其他子系統。在進行性能分析時,將所有子系統當做一個整體來看是非常重要的,
因為在子系統中可能會出現瀑布效應。衡量CPU 系統負載的指標是load,load 就是對計算機系統能夠承擔的多少負載的度量,簡單的說是進程隊列的長度。
簡單的例子比如食堂有五個窗口,當有小於五個學生來打飯,五個窗口都能及時處理,但是當學生個數超過5個,必然會出現等待的學生。請求大於當前的處理能力,會出現等待,引起load升高。
Load Average 就是一段時間(1min,5min,15min)內平均Load。平均負載的最佳值是1,這意味着每個進程都可以在一個完整的CPU 周期內完成。
cpu load高的排查思路
1. 首先排查cpu使用率高的進程中各線程的cpu使用率,通過命令 ps -Lp pid cu 或者 top -Hp pid
2. ps p 9534 -L -o pcpu,pmem,pid,tid,time,tname,cmd
3.追蹤線程內部,查看load過高對應的thread,jstack pid > stack.out