基本概念 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%可能是一个有问题
-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列的值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章节