1. 程式人生 > >到底該怎麼理解平均負載

到底該怎麼理解平均負載

linux系統基礎
每次我們發現系統變慢或者監控發現CPU有異常飈高,都會使用linux系統命令檢視,比如top,uptime,等命令,瞭解當時系統負載情況;
$uptime
10:43:42 up 124 days, 19:22, 16 users, load average: 0.22, 0.13, 0.14
/當前時間 /執行時間 /登入使用者數
比如uptime,上面每一個輸出的含義,後面三個一次是1分鐘、5分鐘、15分鐘的平均負載
那麼問題來了,0.22到底代表的是什麼?是單位時間內的CPU使用率?
我們可以使用man uptime 瞭解平均負載的詳細解釋;

**平均負載**
單位時間內,系統處於可執行狀態和不可中斷狀態的平均程序數,也就是平均活躍程序數;和CPU使用率並沒有直接關係

可執行狀態的程序,是指正在使用CPU或者正在等待CPU的程序,也就是ps命令看到的處於R狀態的程序

不可中斷狀態的程序是正處於核心態關鍵流程的程序,比如最常見的是等待硬體裝置的I/O響應, 也就是ps命令中看到的D狀態的程序;
因此可簡單理解為,平均負載其實就是平均活躍程序數,單位時間內的活躍程序數;
例子:當平均負載為2時,意味著什麼?
  • 在只有2個CPU的系統上,意味著所有的CPU都剛好被完全佔用
  • 在4個CPU的系統行,意味著CPU有50%的空閒
  • 而在只有一個CPU的系統中,則有一半的程序競爭不到CPU

那麼平均負載多少比較合理?
平均負載最理想的狀態是等於系統CPU個數(邏輯核數)
當平均負載高於CPU數量70%的時候就應該關注;

實際排查中,我們肯定不會只用uptime看平均負載,會結合很多其他效能命令一起排查,比如dstat,pidstat,top,iowait,iostat等;

平均負載於CPU使用率
在學習文章之前我經常混淆這兩個概念,load和idle到底該看那個,是不是load高,idle就一定低?
在回到上面的平均負載,單位時間內,處於可執行狀態和不可中斷狀態的程序數,因此,它不僅包括正在使用的CPU的程序還包括等待CPU和等待I/O的程序;
而CPU使用率:單位時間內CPU繁忙情況的統計,跟平均負載不一定完全對應。比如:

  • CPU密集型程序,使用大量CPU會平均負載高,CPU使用率繁忙,此時這兩者是一致的
    * I/O密集型程序,等待I/O會導致平均負載高,但CPU使用率不一定高
  • 大量等待CPU的程序會導致平均負載高,此時CPU使用率也會高

所以主要差別是I/O密集型,I/O等待會導致平均負載高,但不一定會導致CPU使用率高,這時候就可以結合其他命令檢視,最通用的是先使用pidstat 確認是idle還是IO問題,再用pidstat確認具體程序。

具體演示例子可自行設計。

學習資料地址:https://time.geekbang.org/column/article/69618