做為一個測試工程師,每當我們發現計算機變慢的時候,我們通常執行 uptime 或 top 命令,來了解系統的負載情況。或者使用相關可視化平台直接查看平均負載和CPU使用率。
那么這二者具體是什么呢?有什么關系呢?
先說平均負載,
標准定義:單位時間內,系統中處於可運行狀態和不可中斷狀態的平均進程數。
CPU 負載值在 Linux 系統中表示正在運行,處於可運行狀態的平均作業數(讀取一組與流程執行線程對應的機器語言的程序指令),或者非常重要,休眠但不可中斷(不可交錯的休眠狀態))。也就是說,要計算 CPU 負載的值,只考慮正在運行或等待分配 CPU 時間的進程。不考慮正常的休眠過程(休眠狀態),僵屍或停止的過程。
可運行狀態的進程:正在使用cpu或者正在等待cpu的進程,即 ps aux 命令下 STAT 處於 R 狀態的進程。
不可中斷狀態的進程:處於內核態關鍵流程中的進程,且不可被打斷,如等待硬件設備IO響應,ps 命令 D 狀態的進程。
理想狀態:每個cpu上都有一個活躍進程,即平均負載數等於cpu數。
過載值:平均負載高於cpu數量 70% 的時候。
再說cup使用率
CPU使用率定義:單位時間內cpu繁忙情況的統計。
如果我們觀察在給定時間間隔內通過CPU的不同進程,則利用率百分比將表示相對於CPU執行與每個進程相對應的指令的那個時間間隔的時間部分。但這種計算只運行的進程,而不是那些正在等待,無論它們是在隊列(可運行狀態)還是睡着但不可中斷(例如在等待輸入/輸出操作的結束)被認為。
因此,這個指標可以讓我們了解哪些進程最大程度地擠壓CPU,但是如果系統狀態過載或者未充分利用,則不能給出真實的系統狀態圖。
一個類比
上面還看太懂怎么辦?沒事,我們來看一個簡單的類比例子。
先假設最簡單的情況,你的計算機只有一個 CPU,所有的運算都必須由這個 CPU 來完成。
那么,我們不妨把這個 CPU 想象成一座大橋,橋上只有一根車道,所有車輛都必須從這根車道上通過。(很顯然,這座橋只能單向通行。)
系統負載為 0,意味着大橋上一輛車也沒有。
系統負載為 0.5,意味着大橋一半的路段有車。
系統負載為 1.0,意味着大橋的所有路段都有車,也就是說大橋已經"滿"了。但是必須注意的是,直到此時大橋還是能順暢通行的。
系統負載為 1.7,意味着車輛太多了,大橋已經被占滿了(100%),后面等着上橋的車輛為橋面車輛的 70%。以此類推,系統負載 2.0,意味着等待上橋的車輛與橋面的車輛一樣多;系統負載 3.0,意味着等待上橋的車輛是橋面車輛的 2 倍。總之,當系統負載大於 1,后面的車輛就必須等待了;系統負載越大,過橋就必須等得越久。
CPU 的系統負載,基本上等同於上面的類比。大橋的通行能力,就是CPU 的最大工作量;橋梁上的車輛,就是一個個等待 CPU 處理的進程(process)。
如果CPU 每分鍾最多處理100個進程,那么系統負載0.2,意味着CPU在這 1 分鍾里只處理 20 個進程;系統負載 1.0,意味着 CPU 在這 1 分鍾里正好處理 100 個進程;系統負載 1.7,意味着除了 CPU 正在處理的100 個進程以外,還有 70 個進程正排隊等着CPU處理。
為了計算機順暢運行,系統負載最好不要超過 1.0,這樣就沒有進程需要等待了,所有進程都能第一時間得到處理。很顯然,1.0 是一個關鍵值,超過這個值,系統就不在最佳狀態了,你要動手干預了。
Linux系統平均負載和CPU使用率是我們查看服務器性能的關鍵指標,二者相互聯系,又相輔相成。若是看單個指標,數據可能有誤,建議同時查看。