本篇文章算是一篇读书笔记,基本上是把CPU相关的知识作了一个归纳整理,方便后续查看和排查问题。
对于CPU来说,涉及到的主要指标包括:CPU使用率、平均负载、上下文切换、硬中断、软中断、等待io和CPU缓存,而CPU的性能问题也都是与这些指标一一对应的,下面是针对不同的指标的一个定位关联图示。
一、CPU性能指标
二、常用工具介绍
1、top: // 默认5s输出一次
$ top
# 进程数量 568个,有5个处于running状态,563个处于sleeping状态,线程总量是2842个(备注:zombie表示僵尸进程)
Processes: 568 total, 5 running, 563 sleeping, 2842 threads
# Load Avg:平均负载1分钟、5分钟、15分钟的情况分别是3.21个、3.33个、3.60个
# CPU usage :CPU使用率用户态:7.77%,内核态:6.85%,闲置状态是:85.37% 09:26:12
Load Avg: 3.21, 3.33, 3.60 CPU usage: 7.77% user, 6.85% sys, 85.37% idle
SharedLibs: 362M resident, 41M data, 32M linkedit.
MemRegions: 330357 total, 3469M resident, 148M private, 2426M shared.
PhysMem: 16G used (2987M wired), 38M unused.
VM: 4939G vsize, 2317M framework vsize, 6032657(64) swapins, 6655146(0) swapouts.
# Networks网络:入口流量 in,出口流量 out。Disks:read磁盘读,written磁盘写。
Networks: packets: 22961127/8872M in, 25262557/4362M out. Disks: 6564652/128G read, 6301617/84G written.
# PID:进程号,COMMAND:程序名或者执行命令,%CPU:CPU占比,TIME:运行时长,TH:线程数量,WQ:io-wait等待IO数量,PPID:父进程ID,STATE:进程状态
PID COMMAND %CPU TIME #TH #WQ #PORTS MEM PURG CMPRS PGRP PPID STATE
17975 iTerm2 25.3 06:47.68 7 4 343+ 106M+ 22M 19M- 17975 1 sleeping
151 WindowServer 22.5 10:36:59 16/1 6 3580+ 707M+ 348M- 80M+ 151 1 running
815 �~A�~Z微� 20.9.6 0:13:39 94/3 2 25447+ 8+67M+ 2+M 628M 815 1 982 sleeping
223 �coreaudiod 9.4 44:00.51 9/1 4 505 21M 0B 10M 223 1 running
18953 top 8.4 00:04.66 1/1 0 28 7252K 0B 0B 18953 17982 running
0 kernel_task 6.7 03:01:47 217/8 0 0 295M- 0B 0B 0 0 running
8325 EasyConnect 5.6 02:40.11 30 1 361 55M+ 72K 0B 8325 1 sleeping
15687 com.apple.Ap 3.5 01:03.82 3 2 78 900K 0B 0B 15687 1 sleeping
883 gamecontroll 3.2 40:47.93 3 2 87 2248K 0B 368K 883 1 sleeping
814 WeChat 3.0 88:35.76 53 12 1589+ 377M+ 9112K 165M 814 1 sleeping
108 wsdlpd 1.3 31:04.32 40 3 146 94M 0B 79M 108 1 leeping
1104 DLPHelperSer 1.0 08:42.41 6 2 92+ 2908K+ 0B 1428K- 1104 1 sleeping
296 ESDaemonBund 0.9 44:08.64 8 3 33 82M 0B 18M 296 1 sleeping
85 JamfDaemon 0.9 18:36.32 3 2 77 57M 0B 38M 85 1 sleeping
818 wpsoffice 0.8 05:07.68 49 5 325 256M- 0B 209M- 818 1 sleeping
2.uptime:
$ uptime
15:17 up 3 days, 1:11, 2 users, load averages: 3.44 3.34 3.48
# 指标分别表示:
15:17 // 当前时间
up 3 days, 1:11 // 系统运行时间
2 users // 正在登录用户数
3.44 3.34 3.48 // 1分钟、5分钟、15分钟的平均负载
3. pidstat:
# 间隔1秒输出一组数据
$ pidstat 1
...
# UID:用户ID,PID:进程ID,%usr:用户态占比, %system:内核态占比, %guest:运行虚拟机 CPU 使用率 %wait:io-wait指标,CPU:几号CPU,Command:程序名
04:36:24 UID PID %usr %system %guest %wait %CPU CPU Command
04:36:25 0 6882 1.00 3.00 0.00 0.00 4.00 0 docker-containe
04:36:25 101 6947 1.00 2.00 0.00 1.00 3.00 1 nginx
4.mpstat:
显示所有CPU的指标
# 显示所有CPU的指标,并在间隔5秒输出一组数据
$ mpstat -P ALL 5 1
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:41:28 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13:41:33 all 0.21 0.00 12.07 32.67 0.00 0.21 0.00 0.00 0.00 54.84
13:41:33 0 0.43 0.00 23.87 67.53 0.00 0.43 0.00 0.00 0.00 7.74
13:41:33 1 0.00 0.00 0.81 0.20 0.00 0.00 0.00 0.00 0.00 98.99
5. vmstat
存储相关的查看工具
# 每隔1秒输出1组数据
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 7743608 1112 92168 0 0 0 0 52 152 0 1 100 0 0
0 0 0 7743608 1112 92168 0 0 0 0 36 92 0 0 100 0 0
buff 和 cache 就是我们前面看到的 Buffers 和 Cache,单位是 KB。
bi 和 bo 则分别表示块设备读取和写入的大小,单位为块 / 秒。因为 Linux 中块的大小是 1KB,所以这个单位也就等价于 KB/s
6.dsstat:
# 间隔1秒输出10组数据
$ dstat 1 10
You did not select any stats, using -cdngy by default.
--total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read writ| recv send| in out | int csw
0 0 96 4 0|1219k 408k| 0 0 | 0 0 | 42 885
0 0 2 98 0| 34M 0 | 198B 790B| 0 0 | 42 138
0 0 0 100 0| 34M 0 | 66B 342B| 0 0 | 42 135
0 0 84 16 0|5633k 0 | 66B 342B| 0 0 | 52 177
0 3 39 58 0| 22M 0 | 66B 342B| 0 0 | 43 144
0 0 0 100 0| 34M 0 | 200B 450B| 0 0 | 46 147
0 0 2 98 0| 34M 0 | 66B 342B| 0 0 | 45 134
0 0 0 100 0| 34M 0 | 66B 342B| 0 0 | 39 131
0 0 83 17 0|5633k 0 | 66B 342B| 0 0 | 46 168
0 3 39 59 0| 22M 0 | 66B 342B| 0 0 | 37 134
7.查看中断
/proc/softirqs 提供了软中断的运行情况
/proc/interrupts 提供了硬中断的运行情况
# NET_RX 表示网络接收中断,而 NET_TX 表示网络发送中断
#TIMER:定时中断,SCHED:内核调度
$ cat /proc/softirqs
CPU0 CPU1
HI: 0 0
TIMER: 811613 1972736
NET_TX: 49 7
NET_RX: 1136736 1506885
BLOCK: 0 0
IRQ_POLL: 0 0
TASKLET: 304787 3691
SCHED: 689718 1897539
HRTIMER: 0 0
RCU: 1330771 1354737
8.execsnoop:是一个专为短时进程设计的工具
# 按 Ctrl+C 结束
$ execsnoop
PCOMM PID PPID RET ARGS
sh 30394 30393 0
stress 30396 30394 0 /usr/local/bin/stress -t 1 -d 1
sh 30398 30393 0
stress 30399 30398 0 /usr/local/bin/stress -t 1 -d 1
sh 30402 30400 0
stress 30403 30402 0 /usr/local/bin/stress -t 1 -d 1
sh 30405 30393 0
stress 30407 30405 0 /usr/local/bin/stress -t 1 -d 1
...
https://github.com/brendangregg/perf-tools/blob/master/execsnoop
9. tcpdump
# -i eth0 只抓取eth0网卡,-n不解析协议名和主机名
# tcp port 80表示只抓取tcp协议并且端口号为80的网络帧
$ tcpdump -i eth0 -n tcp port 80
15:11:32.678966 IP 192.168.0.2.18238 > 192.168.0.30.80: Flags [S], seq 458303614, win 512, length 0
...
三、CPU问题定位顺序
这些指标都是描述系统的 CPU 性能,它们不会是完全孤立的,很多指标间都有一定的关联,下面的图可以给个很好的指导