1. 背景
每次發現系統變慢時,我們通常做的第一件事,就是執行 top 或者 uptime 命令,來了解系統的負載情況。如下所示我輸入uptime

我們會看到 load average: 0.00, 0.04, 0.05。這三個數字,依次則是過去 1 分鍾、5 分鍾、15 分鍾的平均負載(Load Average)
2. 平均負載
我之前理解為,過去1分鍾,5分鍾,15分鍾,cpu使用率。比如過去5分鍾為4%,cpu閑得蛋疼。這種理解其實是錯誤的,簡單來說,平均負載是指單位時間內,系統處於可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數。
3. 可運行狀態和不可中斷狀態
可運行狀態的進程,是指正在使用 CPU 或者正在等待 CPU 的進程,也就是我們常用 ps 命令看到的,處於 R 狀態(Running 或 Runnable)的進程。
不可中斷狀態的進程則是正處於內核態關鍵流程中的進程,並且這些流程是不可打斷的,比如最常見的是等待硬件設備的 I/O 響應,也就是我們在 ps 命令中看到的 D 狀態(Uninterruptible Sleep,也稱為 Disk Sleep)的進程。
4. 平均負載多少合理
理想情況,一個cpu一個進程最合理,也就是4核cpu,平均負載為4的時候最合理。但是,通常我們會認為平均負載到了70%的時候,就應該觀察了。如果4核cpu,那么就是2.8的時候。
查看cpu核數:
grep 'model name' /proc/cpuinfo | wc -l
cpu使用率與cpu平均負載有什么關系呢,真相是沒有必然聯系。如果是cpu密集型工作,那兩者是一致的。如果是io密集型工作,那cpu使用率可能比較低,但是平均負載比較高。
5. 案例分析
准備:
-
安裝stress
yum install epel-release
yum install stress
stress 是一個 Linux 系統壓力測試工具,這里我們用作異常進程模擬平均負載升高的場景 -
安裝 sysstat
yum install sysstat
sysstat 包含了常用的 Linux 性能工具,用來監控和分析系統的性能。我們的案例會用到這個包的兩個命令 mpstat 和 pidstat。
mpstat 是一個常用的多核 CPU 性能分析工具,用來實時查看每個 CPU 的性能指標,以及所有 CPU 的平均指標。
pidstat 是一個常用的進程性能分析工具,用來實時查看進程的 CPU、內存、I/O 以及上下文切換等性能指標。
案例一(cpu密集型)
開一個終端
stress --cpu 1 --timeout 600 #模擬一個cpu 100%
開第二個終端
uptime 多執行幾次,可以發現第一個數字會變成1

開第三個終端:
mpstat -P ALL 5 #-P ALL 代表所有cpu,5代表5秒輸出一次

可以看到cpu100%,沒有io等待
停止輸出,執行 pidstat -u 5 1 #表示5秒執行一次

可以看出是stress進程引起的
案例二(IO密集型)
開一個終端
stress -i 1 --timeout 600
其他的跟案例一一樣
案例三(大量進程搶占cpu)
開一個終端
stress -c 8 --timeout 600
其他跟案例一一樣
6. 總結
平均負載提供了一個快速查看系統整體性能的手段,反映了整體的負載情況。但只看平均負載本身,我們並不能直接發現,到底是哪里出現了瓶頸。所以,在理解平均負載時,也要注意:是否cpu的確繁忙,還是存在大量io等待,又或者是很多線程搶占cpu。需要根據mpstat和pidstat來分析