Linux平均負載理解
當系統便慢時,我們常用的命令便是top或者uptime,輸入uptime系統會有如下顯示
三個資訊從左往右分別表示:系統當前時間與系統已執行時間,使用者數,平均負載。
平均負載這裡總共有三個引數,分別不是過去1分鐘,5分鐘,15分鐘的平均負載。
假設我們在一個單 CPU 系統上看到平均負載為1.73,0.60,7.98,那麼說明在過去 1 分鐘內,系統有 73% 的超載,而在 15 分鐘內,有 698 %的超載,從整體趨勢來看,系統的負載在降低。
平均負載和cpu使用率很容易混淆,平均負載是指單位時間內,處於可執行狀態和不可中斷狀態的程序數。
簡單來說,平均負載是指單位時間內,系統處於可執行狀態和不可中斷狀態的平均程序數,也就是平均活躍程序數,它和 CPU使用率沒有直接的關係。
所謂可執行狀態的程序,是指正在使用 CPU 或者正在等待 CPU 的程序,也就是我們常用 ps 命令看到的,處於 R 狀態(Running 或 Runnable)的程序。
不可中斷狀態的程序則是正處於核心態關鍵流程中的程序,並且這些流程是不可打斷的,比如最常見的是等待硬體裝置的 I/O 響應,也就是我們在 ps 命令中看到的 D 狀態(Uninterruptible Sleep,也稱為 Disk Sleep)的程序。
所以,它不僅包括了正在使用 CPU 的程序,還包括等待 CPU 和等待 I/O 的程序。
而 CPU 使用率,是單位時間內 CPU 繁忙情況的統計,跟平均負載並不一定完全對應。比如
CPU 密集型程序,使用大量 CPU 會導致平均負載升高,此時兩者是一致的
I/O 密集型程序,等待 I/O 也會導致平均負載升高,但CPU使用率不一定高
大量等待 CPU 的程序排程也會導致平均負載升高,此時的 CPU 使用率也會比較高。
我們可以通過模擬實際的場景去分析
首先需要在機器上預先安裝 stress 和 sysstat 包
yum install -y epel-release
yum install -y stress
下載安裝stress;
安裝成功
yum install sysstat
sar -V
安裝成功。
注:此種方式預設使用的系統的包,版本可能比較老,centos建議使用原始碼的方式安裝,sysstat建議使用11.5.5以上版本
升級sysstat監控工具:
下載11.5.5以上版本的軟體
wget http://pagesperso-orange.fr/sebastien.godard/sysstat-12.1.1.tar.gz
解壓
tar xf sysstat-12.1.1.tar.gz
進入目錄
cd /opt/tools/sysstat-12.1.1
設定引數
# sa_lib_dir=/usr/lib/sa\
sa_dir=/var/log/sa\
conf_dir=/etc/sysconfig \
./configure --prefix=/usr \
--disable-file-attr
&& make && make install
設定sysstat全域性變數及開機啟動
ln -s /安裝路徑/sysstat-11.5.5/sysstat /usr/local/bin/
ln -s /安裝路徑/sysstat-11.5.5/sysstat /etc/init.d/sysstat
chkconfig --add sysstat
chkconfig --list | grep sysstat
手動啟動sysstat
# /etc/rc.d/init.d/sysstat start
檢視下是否可用
sar -u 1 5
執行完以上發現不是最新版本按照以下方式:
cd /opt/tools/sysstat-12.1.1
./configure
make && make install
檢視版本
[[email protected] bin]# sar -V
sysstat version 12.1.1
(C) Sebastien Godard (sysstat <at> orange.fr)
驗證
# pidstat -u 5 1
Linux 3.10.0-693.2.2.el7.x86_64 11/26/2018 _x86_64_ (2 CPU)
02:16:28 PM UID PID %usr %system %guest %wait %CPU CPU Command
使用stress命令,模擬CPU使用率100%(CPU 密集型程序)
$ stress --cpu 1 --timeout 600
這次模擬 I/O 壓力,即不停地執行 sync(I/O 密集型程序)
$ stress -i 1 --timeout 600
系統中執行程序超出 CPU 執行能力時,就會出現等待 CPU的程序,使用stress模擬8個程序(大量程序的場景)
$ stress -c 8 --timeout 600
# 顯示所有 CPU 的指標,並在間隔 5 秒輸出一組資料
$ mpstat -P ALL 5 1
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:41:28 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13:41:33 all 0.21 0.00 12.07 32.67 0.00 0.21 0.00 0.00 0.00 54.84
13:41:33 0 0.43 0.00 23.87 67.53 0.00 0.43 0.00 0.00 0.00 7.74
13:41:33 1 0.00 0.00 0.81 0.20 0.00 0.00 0.00 0.00 0.00 98.99
# 間隔 5 秒後輸出一組資料,-u 表示 CPU 指標
$ pidstat -u 5 1
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:42:08 UID PID %usr %system %guest %wait %CPU CPU Command
13:42:13 0 104 0.00 3.39 0.00 0.00 3.39 1 kworker/1:1H
13:42:13 0 109 0.00 0.40 0.00 0.00 0.40 0 kworker/0:1H
13:42:13 0 2997 2.00 35.53 0.00 3.99 37.52 1 stress
13:42:13 0 3057 0.00 0.40 0.00 0.00 0.40 0 pidstat