CPU性能指标
CPU使用率
用户CPU使用率, 包括用户态(user)和低优先级用户态(nice). 该指标过高说明应用程序比较繁忙.
系统CPU使用率, CPU在内核态运行的时间百分比(不含中断). 该指标高说明内核比较繁忙.
等待I/O的CPU使用率, iowait, 该指标高说明系统与硬件设备I/O交互时间比较长.
软/硬中断CPU使用率, 该指标高说明系统中发生大量中断.
steal CPU / guest CPU, 表示虚拟机占用的CPU百分比.
平均负载
理想情况下平均负载等于逻辑CPU个数,表示每个CPU都被充分利用. 若大于则说明系统负载较重.
平均负载:单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。它和我们传统意义上理解的CPU使用率并没有直接关系。
其中不可中断进程是正处于内核态关键流程中的进程(如常见的等待设备的I/O响应)。不可中断状态实际上是系统对进程和硬件设备的一种保护机制。
平均负载多少时合理
实际生产环境中将系统的平均负载监控起来,根据历史数据判断负载的变化趋势。当负载存在明显升高趋势时,及时进行分析和调查。当然也可以当设置阈值(如当平均负载高于CPU数量的70%时)
现实工作中我们会经常混淆平均负载和CPU使用率的概念,其实两者并不完全对等:
CPU 密集型进程,大量 CPU 使用会导致平均负载升高,此时两者一致
I/O 密集型进程,等待 I/O 也会导致平均负载升高,此时 CPU 使用率并不一定高
大量等待 CPU 的进程调度会导致平均负载升高,此时 CPU 使用率也会比较高
平均负载高时可能是 CPU 密集型进程导致,也可能是 I/O 繁忙导致。具体分析时可以结合 mpstat/pidstat 工具辅助分析负载来源。
上下文切换
CPU 上下文切换,就是把前一个任务的 CPU 上下文(CPU 寄存器和 PC)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的位置,运行新任务。其中,保存下来的上下文会存储在系统内核中,待任务重新调度执行时再加载,保证原来的任务状态不受影响。
CPU 上下文切换分为:
- 进程上下文切换
- 线程上下文切换
- 中断上下文切换
进程上下文切换
进程是由内核管理和调度的,进程上下文切换只能发生在内核态。因此相比系统调用来说,在保存当前进程的内核状态和CPU寄存器之前,需要先把该进程的虚拟内存,栈保存下来。再加载新进程的内核态后,还要刷新进程的虚拟内存和用户栈。
进程只有在调度到CPU上运行时才需要切换上下文,有以下几种场景:CPU时间片轮流分配,系统资源不足导致进程挂起,进程通过sleep函数主动挂起,高优先级进程抢占时间片,硬件中断时CPU上的进程被挂起转而执行内核中的中断服务。
线程上下文切换
线程上下文切换分为两种:
- 前后线程同属于一个进程,切换时虚拟内存资源不变,只需要切换线程的私有数据,寄存器等;
- 前后线程属于不同进程,与进程上下文切换相同。
同进程的线程切换消耗资源较少,这也是多线程的优势。
中断上下文切换
中断上下文切换并不涉及到进程的用户态,因此中断上下文只包括内核态中断服务程序执行所必须的状态(CPU寄存器,内核堆栈,硬件中断参数等)。
中断处理优先级比进程高,所以中断上下文切换和进程上下文切换不会同时发生
CPU缓存命中率
CPU缓存的复用情况,命中率越高性能越好. 其中L1/L2常用在单核,L3则用在多核中
性能工具
平均负载案例
先用uptime查看系统平均负载
判断负载在升高后再用mpstat和pidstat分别查看每个CPU和每个进程CPU使用情况.找出导致平均负载较高的进程.
上下文切换案例
先用vmstat查看系统上下文切换和中断次数
再用pidstat观察进程的自愿和非自愿上下文切换情况
最后通过pidstat观察线程的上下文切换情况
进程CPU使用率高案例
先用top查看系统和进程的CPU使用情况,定位到进程
再用perf top观察进程调用链,定位到具体函数
系统CPU使用率高案例
先用top查看系统和进程的CPU使用情况,top/pidstat都无法找到CPU使用率高的进程
重新审视top输出
从CPU使用率不高,但是处于Running状态的进程入手
perf record/report发现短时进程导致 (execsnoop工具)
不可中断和僵尸进程案例
先用top观察iowait升高,发现大量不可中断和僵尸进程
strace无法跟踪进程系统调用
perf分析调用链发现根源来自磁盘直接I/O
软中断案例
top观察系统软中断CPU使用率高
查看/proc/softirqs找到变化速率较快的几种软中断
sar命令发现是网络小包问题
tcpdump找出网络帧的类型和来源,确定SYN FLOOD攻击导致
根据指标找工具(cpu性能)
性能指标 | 工具 | 说明 |
---|---|---|
平均负载 | uptime top | uptime最简单; top提供更全面指标 |
系统整体CPU使用率 | vmstat mpstat top sar | top、vmstat、mpstat:只能动态查看 sar:可以记录历史数据 |
进程CPU使用率 | top pidstat ps htop atop | top、ps:按CPU使用率排序 pidstat:只显示实际使用CPU的进程 htop、atop:以不同颜色显示 |
系统上下文切换 | vmstat | 查看上下文切换 查看运行状态 查看不可中后段进程数量 |
进程上下文切换 | pidstat | pidstat -w: 自愿上下文切换 非自愿上下文切换 |
软中断 | top mpstat /proc/softirqs | top:软中断CPU使用率 mpstat和/proc/softirqs:提供各个软中断在每个CPU的运行次数 |
硬中断 | vmstat /proc/interrupts | vmstat提供总的中断次数 /proc/interrupts提供各种中断在CPU上运行的累积次数 |
网络 | dstat sar tcpdump | dstat、sar:提供总的网络接收和发送情况 tcpdump:动态抓取正在进行的网络通讯 |
I/O | dstat sar | 都提供I/O的整体情况 |
CPU | lscpu /proc/cpuinfo | lscpu更直观 |
事件剖析 | perf execsnoop | perf:分析CPU的缓存以及内核调用链 execsnoop:监控短时进程 |
一:top命令
top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。
语法
top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]
参数说明:
d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称
S : 累积模式,会将己完成或消失的子进程 ( dead child process ) 的 CPU time 累积起来
s : 安全模式,将交谈式指令取消, 避免潜在的危机
i : 不显示任何闲置 (idle) 或无用 (zombie) 的进程
n : 更新的次数,完成后将会退出 top
b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内
实例
[mi@app ~]$ top
top - 14:30:35 up 124 days, 2:58, 2 users, load average: 0.16, 0.07, 0.08
Tasks: 214 total, 1 running, 212 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.5 us, 0.4 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.1 st
KiB Mem : 32945484 total, 1922560 free, 15182068 used, 15840856 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 17345600 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1949 migu 20 0 8584668 2.1g 14104 S 2.3 6.6 118:06.68 java
20531 migu 20 0 8512308 2.4g 13892 S 1.3 7.7 26:43.37 java
23440 migu 20 0 7196668 1.1g 7688 S 1.0 3.3 814:26.26 java
31040 migu 20 0 108548 1292 728 S 1.0 0.0 1:48.01 pidstat
1942 migu 20 0 8275420 1.3g 15028 S 0.7 4.0 69:23.56 java
含义
前5行为系统总体资源统计情况
top - | 系统当前时间 |
---|---|
up | 系统已开机多长时间 |
users | 当前用户数 |
load average | cpu平均负载,三个数值分别为,1分钟,5分钟,15分钟 |
Tasks | 系统当前进程数, total:总进程数, running:正在运行的进程数, sleeping:睡眠的进程数, stopped:停止的进程数, zombie:僵尸进程数 |
%Cpu(s) | cpu使用率 us:用户使用cpu百分百, sy:系统内核使用cpu百分百, ni 用户进程空间内改变过优先级的进程占用CPU百分比 id:空闲的cpu百分比 wa 等待输入输出的CPU时间百分比 hi 硬中断(Hardware IRQ)占用CPU的百分比 si 软中断(Software Interrupts)占用CPU的百分比 st 用于有虚拟cpu的情况,用来指示被虚拟机偷掉的cpu时间 |
Mem | 内存使用信息, total:总内存大小, free:空闲的内存, used:已使用的内存, buff/cache:缓存的内存大小 |
Swap | 虚拟内存信息 |
PID | 进程id |
USER | 进程所有者 |
PR | 优先级 |
NI | nice值,负值表示高优先级,正值表示低优先级 |
VIRT | 进程使用的虚拟内存总量 |
RES | 进程使用的物理内存大小 |
SHR | 共享内存大小 |
S | 进程状态,D:不可中断的睡眠状态,R:运行,S:睡眠,T:跟踪/停止,Z:僵尸进程 |
%CPU | 进程使用的CPU占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME | 进程使用的CPU时间总计 |
COMMAND | 命令名 |
二:vmstat命令
vmstat命令的含义为显示虚拟内存状态(“Virtual Memory Statistics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。
语法
[root@localhost ~]# vmstat [-a] [刷新延时 刷新次数]
[root@localhost ~]# vmstat [选项]
vmstat命令常用选项及含义
选项 | 含义 |
---|---|
-fs | -f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。 -s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。 |
-S | -S : 单位. 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 |
-d | -d: 列出硬盘有关读写总量的统计表。 |
-p | -p: 分区设备文件名.查看硬盘分区的读写情况。 |
实例
[mi@app ~]$ 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
2 0 0 2067240 155952 15568772 0 0 0 9 0 0 0 0 99 0 0
1 0 0 2065044 155952 15568772 0 0 0 112 3736 5584 2 1 97 0 0
0 0 0 2067176 155952 15568772 0 0 0 108 3941 5805 1 1 98 0 0
0 0 0 2067092 155952 15568780 0 0 0 0 3147 5378 0 0 99 0 0
0 0 0 2066596 155952 15568780 0 0 0 0 3260 5420 0 0 99 0 0
0 0 0 2066480 155952 15568972 0 0 0 0 5358 7234 2 1 98 0 0
含义
字段 | 含义 |
---|---|
procs | 进程信息字段: -r:等待运行的进程数,数量越大,系统越繁忙。 -b:不可被唤醒的进程数量,数量越大,系统越繁忙。 |
memory | 内存信息字段: -swpd:虚拟内存的使用情况,单位为 KB。 -free:空闲的内存容量,单位为 KB。 -buff:缓冲的内存容量,单位为 KB。 -cache:缓存的内存容量,单位为 KB。 |
swap | 交换分区信息字段: -si:从磁盘中交换到内存中数据的数量,单位为 KB。 -so:从内存中交换到磁盘中数据的数量,单位为 KB。 这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。 |
io | 磁盘读/写信息字段: -bi:从块设备中读入的数据的总量,单位是块。 -bo:写到块设备的数据的总量,单位是块。 这两个数越大,代表系统的 I/O 越繁忙。 |
system | 系统信息字段: -in:每秒被中断的进程次数。 -cs:每秒进行的事件切换次数。 这两个数越大,代表系统与接口设备的通信越繁忙。 |
cpu | CPU信息字段: -us:非内核进程消耗 CPU 运算时间的百分比。 -sy:内核进程消耗 CPU 运算时间的百分比。 -id:空闲 CPU 的百分比。 -wa:等待 I/O 所消耗的 CPU 百分比。 -st:被虚拟机所盗用的 CPU 百分比。 |
三:pidstat
pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。
pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
安装
pidstat 是sysstat软件套件的一部分,sysstat包含很多监控linux系统状态的工具,它能够从大多数linux发行版的软件源中获得。
yum install sysstat
语法
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
常用的参数:
-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
-p:指定进程号
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL }
这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-V:版本号
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数
实例
(一)查看进程的cpu上下文切换
vmstat只能查看总的cpu上下文切换,pidstat可以查看每个进程的上下文切换
语法
[migu@app-hbbjhbqomclb01amg ~]$ pidstat -w 1
Linux 3.10.0-1160.25.1.el7.x86_64 (app-hbbjhbqomclb01amg) 11/29/2022 _x86_64_ (8 CPU)
11:15:17 AM UID PID cswch/s nvcswch/s Command
11:15:18 AM 0 1 0.99 0.00 systemd
11:15:18 AM 0 6 0.99 0.00 ksoftirqd/0
11:15:18 AM 0 9 121.78 0.00 rcu_sched
11:15:18 AM 0 11 0.99 0.00 watchdog/0
11:15:18 AM 0 12 0.99 0.00 watchdog/1
11:15:18 AM 0 13 0.99 0.00 migration/1
11:15:18 AM 0 17 0.99 0.00 watchdog/2
11:15:18 AM 0 19 0.99 0.00 ksoftirqd/2
11:15:18 AM 0 22 0.99 0.00 watchdog/3
11:15:18 AM 0 27 0.99 0.00 watchdog/4
含义
cswch/s | 表示每秒自愿上下文切换(voluntary context switches)的次数 |
---|---|
ncswch/s | 表示每秒非自愿上下文切换(non voluntary context switches)的次数 |
- 自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
- 而非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
(二)查看进程的cpu使用率
语法
[mi@app ~]$ pidstat -u 5
Linux 3.10.0-1160.25.1.el7.x86_64 (app-hbbjhbqomclb01amg) 11/29/2022 _x86_64_ (8 CPU)
03:15:06 PM UID PID %usr %system %guest %CPU CPU Command
03:15:11 PM 0 9 0.00 0.20 0.00 0.20 7 rcu_sched
03:15:11 PM 0 434 1.00 1.20 0.00 2.20 3 systemd-journal
03:15:11 PM 1000 492 0.00 0.20 0.00 0.20 5 mgweb
03:15:11 PM 1000 493 0.00 0.20 0.00 0.20 4 mgweb
03:15:11 PM 0 1331 0.40 0.20 0.00 0.60 2 rsyslogd
03:15:11 PM 1000 1850 4.79 0.20 0.00 4.99 3 python3
03:15:11 PM 1000 1930 0.20 0.00 0.00 0.20 6 java
03:15:11 PM 1000 1942 1.00 0.40 0.00 1.40 0 java
03:15:11 PM 1000 1949 1.00 0.40 0.00 1.40 5 java
03:15:11 PM 1000 1955 0.40 0.00 0.00 0.40 7 java
03:15:11 PM 1000 3795 1.20 0.00 0.00 1.20 7 java
03:15:11 PM 0 4917 0.20 0.00 0.00 0.20 4 titan_monitor
03:15:11 PM 1000 8865 0.00 0.20 0.00 0.20 6 pidstat
03:15:11 PM 1000 20531 0.80 0.60 0.00 1.40 6 java
03:15:11 PM 1000 22578 0.20 0.00 0.00 0.20 0 redis-server
03:15:11 PM 1000 23440 0.20 0.40 0.00 0.60 7 java
含义
每隔 5 秒输出 1 组数据
%usr | 用户空间的cpu使用率 |
---|---|
%system | 内核空间的cpu使用率 |
%wait | 等待上下文切换的cpu使用率 |
%CPU | 总的cpu使用率 |
# -d 展示 I/O 统计数据,-p 指定进程号,间隔 1 秒输出 3 组数据
$ pidstat -d -p 4344 1 3
06:38:50 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
06:38:51 0 4344 0.00 0.00 0.00 0 app
06:38:52 0 4344 0.00 0.00 0.00 0 app
06:38:53 0 4344 0.00 0.00 0.00 0 app
kB_rd/s:表示每秒读的 KB 数
kB_wr/s: 表示每秒写的 KB 数
iodelay: 表示 I/O 的延迟(单位是时钟周期)
四、mpstat
mpstat的全称为Multiprocessor Statistics,是一款常用的多核CPU性能分析工具,用来实时查询每个CPU的性能指标,以及所有CPU的平均指标
安装
它是Linux性能工具集sysstat中的一个工具.(和pidstat一样)
yum install sysstat
语法
mpstat [-P {cpu|ALL}] [interval [count]]
参数 | 描述 |
---|---|
-P | {cpu|ALL} 表示监控哪个CPU,ALL是所有 |
internval | 相邻两次采样的间隔时间 |
count | 采样的次数,count只能和internval一起使用 |
实例
查看多核CPU核心的当前运行状况信息, 每2秒更新一次
[mi@app ~]$ mpstat -P ALL 2
Linux 3.10.0-1160.25.1.el7.x86_64 (app-hbbjhbqomclb01amg) 11/30/2022 _x86_64_ (8 CPU)
10:15:57 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:15:59 AM all 0.44 0.00 0.31 0.00 0.00 0.00 0.12 0.00 0.00 99.12
10:15:59 AM 0 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 99.00
10:15:59 AM 1 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 99.00
10:15:59 AM 2 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
10:15:59 AM 3 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
10:15:59 AM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:15:59 AM 5 1.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 98.51
10:15:59 AM 6 0.50 0.00 0.00 0.00 0.00 0.00 0.50 0.00 0.00 99.00
10:15:59 AM 7 0.00 0.00 0.50 0.00 0.00 0.00 0.99 0.00 0.00 98.51