單位時間內,系統處於可運行狀態和不可終端狀態的平均進程數也就是平均活躍進程數,它和cpu使用率並無直接關係,linux
正在使用的cpu或者正在等待cpu的進程bash
進程是正處於內核關鍵流程中的進程,而且這些流程是不可打斷的,好比最多見的是等待硬件設備I/O響應,也就是咱們在ps命令中看到的D狀態的狀態網絡
或者中斷打斷的 ,這個時候的 進程處於不可終端狀態,若是此時的進程被打斷了 ,就容易出現磁盤數據與進程不一致的 問題工具
因此,不可中斷狀態其實是系統對進程和硬件的一種保護機制測試
既然是平均的活躍進程數,那麼最理想的,就是每一個cpu上都恰好運行着一個進程,這樣每一個cpu都獲得了充分利用,好比當平均負載2時,意味着什麼呢?ui
一、在只有2個CPU的系統上,意味着全部的CPU都恰好被徹底佔用spa
二、在4個CPU的系統上,意味着CPU有50%的空閒操作系統
三、而在只有1個CPU的系統上,則意味着有一半的進程競爭不到CPU.net
平均負載最理想的狀況等於CPU的個數blog
# 關於 grep 和 wc 的用法請查詢它們的手冊或者網絡搜索
$ grep 'model name' /proc/cpuinfo | wc -l 2
當平均負載高於 CPU 數量 70% 排查負載高的問題了。一旦負載太高,就可能致使進程響應變慢,進而影響服務的正常功能。
一、正在使用 CPU 的進程,
二、等待 CPU
三、等待 I/O 的進程。
是單位時間內CPU繁忙狀況的 統計,跟平均負載並不必定徹底對應
一、CPU 密集型進程,使用大量 CPU 會致使平均負載升高,此時這二者一直的
二、I/O 密集型進程,等待 I/O 也會致使平均負載升高,但 CPU 使用率不必定很高;
三、大量等待 CPU 的進程調度也會致使平均負載升高,此時的CPU 使用率也會比較高
一、操做系統
[root@luoahong ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)
二、測試工具
yum install stress-ng sysstat -y wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
三、升級sysstat版本到11.5以上
rpm -qa|grep sysstat wget http://www.rpmfind.net/linux/mageia/distrib/cauldron/x86_64/media/core/release/sysstat-12.1.3-1.mga7.x86_64.rpm rpm -Uvh sysstat-12.1.3-1.x86_64.rpm rpm -qa|grep sysstat
一、窗口1
[root@luoahong ~]# stress --cpu 1 --timeout 600 stress: info: [1307] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
二、窗口2
[root@luoahong ~]# stress --cpu 1 --timeout 600 stress: info: [1307] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
1 分鐘的平均負載會慢慢增長到 1.00
三、窗口3
#-P ALL 表示監控全部 CPU,後面數字 5 表示間隔 5 秒後輸出一組數據 [root@luoahong ~]# mpstat -P ALL 5 03:47:20 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 03:47:25 PM all 25.29 0.00 0.05 0.05 0.00 0.05 0.00 0.00 0.00 74.55 03:47:25 PM 0 99.80 0.00 0.00 0.00 0.00 0.20 0.00 0.00 0.00 0.00 03:47:25 PM 1 0.00 0.00 0.20 0.20 0.00 0.00 0.00 0.00 0.00 99.59 03:47:25 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 03:47:25 PM 3 0.21 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.79 03:47:25 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 03:47:30 PM all 24.94 0.00 0.10 0.00 0.00 0.05 0.00 0.00 0.00 74.91 03:47:30 PM 0 99.80 0.00 0.00 0.00 0.00 0.20 0.00 0.00 0.00 0.00 03:47:30 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 03:47:30 PM 2 0.00 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.80 03:47:30 PM 3 0.00 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.80
正好有一個 CPU 的使用率爲 100%,但它的只有 0。這說明,平均負載的升高正是因爲 CPU 使用率爲 100% 。
那麼,究竟是哪一個進程致使了 CPU 使用率爲 100% 呢?你可使用 pidstat 來查詢
[root@luoahong ~]# pidstat -u 5 1 Linux 3.10.0-693.el7.x86_64 (luoahong) 02/05/2019 _x86_64_ (4 CPU) 03:51:51 PM UID PID %usr %system %guest %wait %CPU CPU Command 03:51:56 PM 0 79 0.00 0.59 0.00 0.20 0.59 2 kworker/2:2 03:51:56 PM 0 309 0.00 0.20 0.00 0.00 0.20 0 xfsaild/sda2 03:51:56 PM 0 738 0.40 0.00 0.00 0.20 0.40 1 vmtoolsd 03:51:56 PM 0 1308 99.80 0.20 0.00 0.00 100.00 3 stress 03:51:56 PM 0 1501 0.20 0.20 0.00 0.00 0.40 0 watch 03:51:56 PM 0 1752 0.00 0.40 0.00 0.00 0.40 1 pidstat Average: UID PID %usr %system %guest %wait %CPU CPU Command Average: 0 79 0.00 0.59 0.00 0.20 0.59 - kworker/2:2 Average: 0 309 0.00 0.20 0.00 0.00 0.20 - xfsaild/sda2 Average: 0 738 0.40 0.00 0.00 0.20 0.40 - vmtoolsd Average: 0 1308 99.80 0.20 0.00 0.00 100.00 - stress Average: 0 1501 0.20 0.20 0.00 0.00 0.40 - watch Average: 0 1752 0.00 0.40 0.00 0.00 0.40 - pidstat
從這裏能夠明顯看到,stress 進程的 CPU 使用率爲 99.80
一、窗口1
stress-ng -i 1 --hdd 1 --timeout 600
二、窗口2
# -d 參數表示高亮顯示變化的區域 $ watch -d uptime ..., load average: 2.17, 0.84, 0.40
三、窗口3
[root@luoahong ~]# mpstat -P ALL 5 1 Linux 3.10.0-693.el7.x86_64 (luoahong) 02/05/2019 _x86_64_ (2 CPU) 08:58:00 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 08:58:05 PM all 0.32 0.00 54.64 40.51 0.00 1.79 0.00 0.00 0.00 2.74 08:58:05 PM 0 0.43 0.00 27.55 66.59 0.00 3.47 0.00 0.00 0.00 1.95 08:58:05 PM 1 0.21 0.00 80.29 15.81 0.00 0.21 0.00 0.00 0.00 3.49 Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle Average: all 0.32 0.00 54.64 40.51 0.00 1.79 0.00 0.00 0.00 2.74 Average: 0 0.43 0.00 27.55 66.59 0.00 3.47 0.00 0.00 0.00 1.95 Average: 1 0.21 0.00 80.29 15.81 0.00 0.21 0.00 0.00 0.00 3.49
1 分鐘的平均負載會慢慢增長到 1.00
其中一個 CPU 的系統 CPU 使用率升高到了 27.55,而 iowait 高達 66.59%。這說明,平均負載的升高是因爲 iowait 的升高。
那麼,究竟是哪一個進程致使了 CPU 使用率爲 100% 呢?
[root@luoahong ~]# pidstat -u 5 1 Linux 3.10.0-693.el7.x86_64 (luoahong) 02/05/2019 _x86_64_ (2 CPU) 09:02:14 PM UID PID %usr %system %guest %wait %CPU CPU Command 09:02:19 PM 0 3 0.00 2.17 0.00 0.79 2.17 0 ksoftirqd/0 09:02:19 PM 0 9 0.00 0.40 0.00 3.36 0.40 0 rcu_sched 09:02:19 PM 0 13 0.00 0.20 0.00 1.19 0.20 1 ksoftirqd/1 09:02:19 PM 0 291 0.00 0.20 0.00 0.99 0.20 0 xfsaild/sda2 09:02:19 PM 0 683 0.20 0.20 0.00 0.59 0.40 0 vmtoolsd 09:02:19 PM 0 3732 0.00 1.78 0.00 1.78 1.78 0 kworker/0:0 09:02:19 PM 0 4492 0.59 72.33 0.00 0.79 72.92 0 stress-ng-hdd 09:02:19 PM 0 4493 0.00 3.75 0.00 0.79 3.75 0 stress-ng-io 09:02:19 PM 0 4496 0.00 6.13 0.00 0.20 6.13 0 kworker/u256:1 09:02:19 PM 0 4589 0.00 0.40 0.00 0.40 0.40 1 kworker/1:2 09:02:19 PM 0 4621 0.00 0.40 0.00 0.00 0.40 1 pidstat Average: UID PID %usr %system %guest %wait %CPU CPU Command Average: 0 3 0.00 2.17 0.00 0.79 2.17 - ksoftirqd/0 Average: 0 9 0.00 0.40 0.00 3.36 0.40 - rcu_sched Average: 0 13 0.00 0.20 0.00 1.19 0.20 - ksoftirqd/1 Average: 0 291 0.00 0.20 0.00 0.99 0.20 - xfsaild/sda2 Average: 0 683 0.20 0.20 0.00 0.59 0.40 - vmtoolsd Average: 0 3732 0.00 1.78 0.00 1.78 1.78 - kworker/0:0 Average: 0 4492 0.59 72.33 0.00 0.79 72.92 - stress-ng-hdd Average: 0 4493 0.00 3.75 0.00 0.79 3.75 - stress-ng-io Average: 0 4496 0.00 6.13 0.00 0.20 6.13 - kworker/u256:1 Average: 0 4589 0.00 0.40 0.00 0.40 0.40 - kworker/1:2 Average: 0 4621 0.00 0.40 0.00 0.00 0.40 - pidstat
當系統中運行進程超出CPU運行能力時,就會出現等待CPU的進程。
好比,咱們仍是使用stress,但此次模擬的 是8個進程:
一、窗口1
[root@luoahong ~]# stress -c 8 --timeout 600 stress: info: [5270] dispatching hogs: 8 cpu, 0 io, 0 vm, 0 hdd
二、窗口2
[root@luoahong ~]# uptime 21:16:07 up 1:43, 3 users, load average: 5.98, 2.14, 1.19
三、窗口3
[root@luoahong ~]# pidstat -u 5 1 Linux 3.10.0-693.el7.x86_64 (luoahong) 02/05/2019 _x86_64_ (2 CPU) 09:15:30 PM UID PID %usr %system %guest %wait %CPU CPU Command 09:15:35 PM 0 683 0.20 0.00 0.00 1.37 0.20 0 vmtoolsd 09:15:35 PM 0 1049 0.00 0.20 0.00 0.00 0.20 0 tuned 09:15:35 PM 0 4622 0.00 0.39 0.00 0.39 0.39 1 kworker/1:0 09:15:35 PM 0 4624 0.20 0.20 0.00 0.59 0.39 0 watch 09:15:35 PM 0 5271 24.31 0.00 0.00 74.31 24.31 1 stress 09:15:35 PM 0 5272 24.51 0.00 0.00 74.12 24.51 0 stress 09:15:35 PM 0 5273 24.31 0.00 0.00 73.92 24.31 1 stress 09:15:35 PM 0 5274 24.12 0.00 0.00 74.12 24.12 0 stress 09:15:35 PM 0 5275 24.31 0.00 0.00 74.12 24.31 1 stress 09:15:35 PM 0 5276 24.31 0.20 0.00 73.73 24.51 0 stress 09:15:35 PM 0 5277 24.31 0.20 0.00 74.31 24.51 1 stress 09:15:35 PM 0 5278 24.31 0.20 0.00 74.71 24.51 0 stress 09:15:35 PM 0 5326 0.00 0.20 0.00 0.39 0.20 0 pidstat Average: UID PID %usr %system %guest %wait %CPU CPU Command Average: 0 683 0.20 0.00 0.00 1.37 0.20 - vmtoolsd Average: 0 1049 0.00 0.20 0.00 0.00 0.20 - tuned Average: 0 4622 0.00 0.39 0.00 0.39 0.39 - kworker/1:0 Average: 0 4624 0.20 0.20 0.00 0.59 0.39 - watch Average: 0 5271 24.31 0.00 0.00 74.31 24.31 - stress Average: 0 5272 24.51 0.00 0.00 74.12 24.51 - stress Average: 0 5273 24.31 0.00 0.00 73.92 24.31 - stress Average: 0 5274 24.12 0.00 0.00 74.12 24.12 - stress Average: 0 5275 24.31 0.00 0.00 74.12 24.31 - stress Average: 0 5276 24.31 0.20 0.00 73.73 24.51 - stress Average: 0 5277 24.31 0.20 0.00 74.31 24.51 - stress Average: 0 5278 24.31 0.20 0.00 74.71 24.51 - stress Average: 0 5326 0.00 0.20 0.00 0.39 0.20 - pidstat
能夠看出,8 個進程在爭搶 2 個 CPU,每一個進程等待CPU 的時間(也就是代碼塊中的 %wait 列)高達 75%這些超出 CPU 計算能力的進程,最終致使 CPU 過載。
一、平均負載高有多是 CPU 密集型進程致使的; 二、平均負載負載高並不必定表明 CPU 使用率高,還有多是 I/O I/O 更繁忙了三、當發現負載高的時候,你可使用 mpstat、pidstat等工具,輔助分析負載的來源