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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
CPU 使用率
用户 CPU 使用率
user - 用户态 CPU 使用率
nice - 低优先级用户态 CPU 使用率
系统 CPU 使用率
软中断和硬中断 CPU 使用率
其他
steal - 虚拟化环境中会用到的窃取 CPU 利用率:被其他虚拟机占用的 CPU 时间百分比
guest - 客户 CPU 使用率:运行客户虚拟机的 CPU 时间百分比

上下文切换
自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题
非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;
中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。

平均负载
如果 1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。
如果 1 分钟的值远小于 15 分钟的值,就说明系统最近 1 分钟的负载在减少,而过去 15 分钟内却有很大的负载。
如果 1 分钟的值远大于 15 分钟的值,就说明最近 1 分钟的负载在增加
这种增加有可能只是临时性的,也有可能还会持续增加下去,所以就需要持续观察。
一旦 1 分钟的平均负载接近或超过了 CPU 的个数,就意味着系统正在发生过载的问题,这时就得分析调查是哪里导致的问题,并要想办法优化了。

CPU 缓存命中率

工具
平均负载
uptime
top
系统整体 CPU 使用率
vmstat
mpstat
运行 mpstat 查看 CPU 使用率的变化情况:
# -P ALL 表示监控所有CPU,后面数字5表示间隔5秒后输出一组数据
$ mpstat -P ALL 5
top
sar
/proc/stat
其他性能工具的数据来源
进程 CPU 使用率
top
pidstat
# 间隔5秒后输出一组数据
$ pidstat -u 5 1
# 每隔1秒输出1组数据(需要 Ctrl+C 才结束)
# -w参数表示输出进程切换指标,而-u参数则表示输出CPU使用指标
$ pidstat -w -u 1
pidstat 默认显示进程的指标数据,加上 -t 参数后,才会输出线程的指标。
# 每隔1秒输出一组数据(需要 Ctrl+C 才结束)
# -wt 参数表示输出线程的上下文切换指标
$ pidstat -wt 1
ps
htop
atop
系统上下文切换
vmstat
# 每隔5秒输出1组数据
# vmstat 5
cs(context switch)是每秒上下文切换的次数。
in(interrupt)则是每秒中断的次数。
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。
b(Blocked)则是处于不可中断睡眠状态的进程数。
进程上下文切换
pidstat
给它加上 -w 选项,你就可以查看每个进程上下文切换的情况了
$ pidstat -w 5 1
cswch ,表示每秒自愿上下文切换(voluntary context switches)的次数
nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数
软中断
top
/proc/softirqs
mpstat
网络
dstat
sar
# -n DEV 表示显示网络收发的报告,间隔1秒输出一组数据
$ sar -n DEV 1
tcpdump
# -i eth0 只抓取eth0网卡,-n不解析协议名和主机名
# tcp port 80表示只抓取tcp协议并且端口号为80的网络帧
$ tcpdump -i eth0 -n tcp port 80
I/O
dstat
dstat 的好处是,可以同时查看 CPU 和 I/O 这两种资源的使用情况,便于对比分析。
# 间隔1秒输出10组数据
$ dstat 1 10
ipstat
# -d 展示 I/O 统计数据,-p 指定进程号,间隔 1 秒输出 3 组数据
$ pidstat -d -p 4344 1 3
sar
CPU 个数
/proc/cpuinfo
lscpu
事件剖析
perf
perf top:类似于 top,它能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数
第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事件总数量(Event count)。
再往下看是一个表格式样的数据,每一行包含四列,分别是:
Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
perf record 和 perf report
$ perf record # 按Ctrl+C终止采样
§ $ perf report # 展示类似于perf top的报告
# -g开启调用关系分析,-p指进程号21515
$ perf top -g -p 21515
execsnoop