基本概念
CPU使用率:通过测量一段时间内cpu实例忙于执行工作的时间比例获得,以百分比表示
CPI(每指令周期数):用来描述cpu如何使用它的时钟周期,同时也可以用来理解CPU使用率的本质;CPI较高代表cpu进场陷入停滞,通常都是在访问内存,较低的CPI表示cpu基本没有停滞,指令吞吐较高
IPC(每周期指令数):它为CPI的倒数
饱和度:一个100%使用率的cpu称为饱和
cpu上下文切换 过多的上下文切换会把cpu时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,从而缩短进程真正运行的时间,导致系统的整体性能大幅下降
cpu使用率说明相关指标
user(us),代表用户态cpu时间,它不包括nice时间,包括guest时间
nice(ni),代表低优先级用户态cpu时间
system(sys),代表内核态cpu时间
idle(id),代表空闲时间,不包括等待io的时间(iowait)
irq(hi),代表处理硬中断的cpu时间
softirq(si),代表处理软中断的cpu时间
steal(st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的cpu时间
guest(guest),运行虚拟机的cpu时间
guest_nice(gnice),代表以低优先级运行虚拟机的时间
CPU使用说明例子
CPU 很无辜,是个任劳任怨的打工仔,每时每刻都有工作在做(进程、线程)并且自己有一张工作清单(可运行队列),由老板(进程调度)来决定他该干什么,他需要 和老板沟通以便得到老板的想法并及时调整自己的工作(上下文切换),部分工作做完以后还需要及时向老板汇报(中断),所以打工仔(CPU)除了做自己该做 的工作以外,还有大量时间和精力花在沟通和汇报上。
打工仔接受和完成多少任务并向老板汇报了(中断);
打工仔和老板沟通、协商每项工作的工作进度(上下文切换);
打工仔的工作列表是不是都有排满(可运行队列);
打工仔工作效率如何,是不是在偷懒(CPU 利用率)。
性能命令如下 - uptime
- top
- vmstart
- mpstat
- pidstat
- dstat
说明如下:
uptime命令,用来统计系统当前的运行状态 12:02:32 up 235 days, 18:58, 4 users, load average: 0.02, 0.10, 0.07
其中load average这三个值表示系统在1min,5min,15min内的平均负载,这三个值一般不能大于系统CPU的个数。如果长期大于cpu个数表示cpu不足以服务线程,说明cpu繁忙,有些线程在等待,可能会影响系统性能
平均负载:表示对cpu资源的需求,通过汇总正在运行的线程数(使用率)和正在排队等待运行的线程数(饱和度)计算得到.
top 查看负载情况 主要关注负载1,5,15min 该命令显示了最消耗cpu的任务,并带有cpu消耗百分比,TIME和%CPU显示了CPU占用的时间(这里是分钟时间)
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head 查看占用cpu资源最多的10个进程方法
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head 查看占用内存资源最多的10个进程方法
ps -eo comm,pid,pcpu,pmem --sort -pcpu | head -20
vmstart 命令(虚拟内存统计), 最后几列显示了cpu平均负载,少于10%可能是一个有问题 vmstart [-V] [-n] [delay [count]]
-V 表示打印出版本信息,可选参数
-n 表示在周期性循环输出,输出的头部信息仅显示一次
delay 表示两次输出之间的时间间隔
count 表示按照“delay”指定的时间间隔统计的次数,默认为1次
1
2
3
4
5
vmstart 3 5
1 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
2 r b swpd free buff cache si so bi bo in cs us sy id wa st
3 2 0 7400 171448 171212 7667080 0 0 70 605 0 0 2 1 97 1 0
4 0 0 7400 171828 171212 7667100 0 0 0 2387 1322 1572 1 1 99 0 0
在cpu评估中,主要注意procs项中的r项的值和cpu项中us、sy和id列的值 这些值都是所有cpu的系统平均数,r除外,是总数r 应小于cpu个数 当脏页达到内存页面设置的值时,开始写入硬盘,通过 /sbin/sysctl -n vm.dirty_background_ratio 查看,默认值为10 当系统物理内存剩余量在该值范围时,开始大量使用swap交换空间1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
r,所有等待的加上正在运行的线程数,这些线程都是可运行状态,只不过 CPU 暂时不可用;
b,被 blocked 的进程数,正在等待 IO 请求;
in,被处理过的中断数
cs,系统上正在做上下文切换的数目
us,用户占用 CPU 的百分比
sys,内核和中断占用 CPU 的百分比
wa,所有可运行的线程被 blocked 以后都在等待 IO,这时候 CPU 空闲的百分比
id,CPU 完全空闲的百分比
swpd,已使用的 SWAP 空间大小,KB 为单位;
free,可用的物理内存大小,KB 为单位;
buff,物理内存用来缓存读写操作的 buffer 大小,KB 为单位;
cache,物理内存用来缓存进程地址空间的 cache 大小,KB 为单位;
si,数据从 SWAP 读取到 RAM(swap in)的大小,KB 为单位;
so,数据从 RAM 写到 SWAP(swap out)的大小,KB 为单位;
bi,磁盘块从文件系统或 SWAP 读取到 RAM(blocks in)的大小,block 为单位;
bo,磁盘块从 RAM 写到文件系统或 SWAP(blocks out)的大小,block 为单位;
mpstat命令 (每个CPU统计信息),检查单个cpu是否繁忙1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mpstat -P ALL 1
05:43:50 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
05:43:51 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
05:43:51 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
05:43:51 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
05:43:51 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
05:43:51 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
05:43:51 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
05:43:51 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
05:43:51 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
05:43:51 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
-P ALL 用来打印每个CPU的信息
-P 1 1 用来打印第二个cpu的信息
%usr :用户态时间
%nice :以nice优先级运行的进程用户态时间
%sys :系统态时间(内核)
%iowait :I/O等待
%irq :硬件中断CPU用量
%soft :软件中断CPU用量
%steal :耗费在服务其他租户的时间
%guest :花在访客虚拟机的时间
%idle:空闲时间
重要列有:usr,sys和idle
pidstat 按进程或线程来打印cpu用量 包括用户态和系统态时间的分解,默认情况下仅输出活动的进程的信息1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pidstat 1
05:49:59 PM PID %usr %system %guest %CPU CPU Command
05:50:00 PM 37 0.00 0.99 0.00 0.99 3 kblockd/3
05:50:00 PM 60 0.00 0.99 0.00 0.99 0 kswapd0
05:50:00 PM 18520 0.99 0.99 0.00 1.98 0 pidstat
05:50:00 PM 18524 0.00 16.83 0.00 16.83 0 tar
05:50:00 PM 18525 53.47 13.86 0.00 67.33 0 gzip
-t 打印每个线程的统计信息
-p ALL 用来打印所有的进程,包括空闲进程
常用命令:
pidstat -d -p pid 1 # 每秒查看对应pid对应进程的io使用情况
pidstat -d 1 # 每秒查看所有程序对应的io情况
pidstat -u 1 # 每秒获取所有程序对应的cpu情况
pidstat -r 1 # 每秒查看所有程序对应的内存情况
pidstat -w 5 # 查看进程的上下文切换情况
- cswch/s 每秒自愿上下文切换的次数,进程无法获取所需资源导致的上下文切换,如io,内存等系统资源不足
- nvcswch/s 每秒非自愿上下文切换的次数,被系统强制调度,进而发生的上下文切换,如大量进程都在争抢cpu,cpu成为瓶颈
dstat 命令,比较全部的查看系统资源信息 常用命令: dstat -cdlnmpsy 查看比较全面的信息1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-c cpu
-d disk
-l load
-n net
-m memory
-p procs
-s swap
-y system
--output xxx.csv 生成csv文件,可以通过excel打开
dstat -cdlnmpsy
---total-cpu-usage---- -dsk/total- ---load-avg--- -net/total- ---procs--->
usr sys idl wai hiq siq| read writ| 1m 5m 15m | recv send|run blk new>
2 1 97 0 0 0| 73k 115k| 0 0.01 0.05| 0 0 | 0 0 1.2>
0 1 99 0 0 0| 0 0 | 0 0.01 0.05| 146B 1058B| 0 0 0>
0 1 100 0 0 0| 0 0 | 0 0.01 0.05| 146B 514B| 0 0 0>
1 0 99 0 0 0| 0 0 | 0 0.01 0.05| 146B 514B| 0 0 0>
0 0 100 0 0 0| 0 0 | 0 0.01 0.05| 146B 514B| 0 0 0>
0 1 99 0 0 0| 0 12k| 0 0.01 0.05| 146B 514B|1.0 0 0>
dstat --top-io --top-bio
PS:相关内容参照《性能之巅-洞悉系统、企业与云计算》第6章-cpu章节