在系统变慢时,通过top或uptime命令可以看到系统运行情况。
$ uptime
02:34:03 up 2 days, 20:14, 1 user, load average: 0.63, 0.83, 0.88
02:34:03 //当前时间
up 2 days, 20:14 //系统运行时间
1 user //正在登录用户数
load average //CPU的平均负载,3个值分别表示,1分钟,5分钟,15分钟内的平均负载
估计可以这样认为,假如有2个CPU,平均负载为1,就说明有一个CPU跑满了,还有一个CPU空闲。如果平均为2,说明两个CPU都跑满了,如果平均负载值大于了CPU的个数,说明发生了CPU的竞争。
如何查看CPU个数,使用下面的命令
$ grep 'model name' /proc/cpuinfo | wc -l
4
grep 'model name' /proc/cpuinfo #是从/proc/cpuinfo文件中,获取model name的行,并显示出来
| #是管道,意思是将前面命令的结果作为下条命令的输入
wc -l #wc是一个统计程序,-l参数表明统计行数
在这里可以看到我的服务器是4核的CPU
如果load average的3个值逐渐增大,比如:2,1,0.8,说明1分钟,5分钟,15分钟的平均负载为2,1,0.8,说明CPU负载逐步升高。如果1分钟的负载值 小于 15分钟的负载值,说明CPU负载逐步减少。
我们可以使用iostat、mpstat、pidstat 三个命令来查找平均负载高的根源。
# -P ALL 表示监控所有CPU,后面数字5表示间隔5秒后输出一组数据,5后面可以再跟一个数字,表明打印次数
$ mpstat -P ALL 5
Linux 3.10.0-957.21.3.el7.x86_64 (Tbj3-omie-web1) 07/21/2020 _x86_64_ (4 CPU)
05:54:05 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
05:54:10 PM all 0.20 0.00 0.20 0.10 0.00 0.00 0.00 0.00 0.00 99.50
05:54:10 PM 0 0.40 0.00 0.20 0.60 0.00 0.00 0.00 0.00 0.00 98.80
05:54:10 PM 1 0.00 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.80
05:54:10 PM 2 0.20 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.60
05:54:10 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
CPU: all表示全部,0,1,2,3代表是4个CPU
%usr:表示用户态
%sys:表示内核态
%iowait:表示io等待
%idle:表示空闲率
如果想知道是哪个进程引起的CPU负载高,可以使用pidstat命令
$ pidstat -u 5 1
Linux 3.10.0-957.21.3.el7.x86_64 (Tbj3-omie-web1) 07/21/2020 _x86_64_ (4 CPU)
05:58:12 PM UID PID %usr %system %guest %CPU CPU Command
05:58:18 PM 0 9 0.00 0.20 0.00 0.20 1 rcu_sched
05:58:18 PM 0 6370 0.80 0.00 0.00 0.80 1 barad_agent
05:58:18 PM 0 13113 0.00 0.20 0.00 0.20 1 pidstat
05:58:18 PM 0 14814 0.00 0.20 0.00 0.20 0 java
05:58:18 PM 0 17475 0.00 0.20 0.00 0.20 1 kworker/1:2
05:58:18 PM 0 18150 0.40 0.20 0.00 0.60 0 YDService
PID:表示进程id
%usr:表示用户态
%system:表示内核态
%CPU:表示CPU使用率
CPU:表示是第几个CPU在执行