1. 1. 基本概念
    1. 1.1. cpu上下文切换
    2. 1.2. cpu使用率说明相关指标
    3. 1.3. CPU使用说明例子
    4. 1.4. 性能命令如下
      1. 1.4.1. uptime命令,用来统计系统当前的运行状态
      2. 1.4.2. top 查看负载情况 主要关注负载1,5,15min
      3. 1.4.3. vmstart 命令(虚拟内存统计),
      4. 1.4.4. mpstat命令
      5. 1.4.5. pidstat 按进程或线程来打印cpu用量
      6. 1.4.6. dstat 命令,比较全部的查看系统资源信息

基本概念


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章节