目录
3.2 查看CPU使用率 —— ps/top/pidstat
三、CPU使用率 —— 用户CPU
CPU 使用率是单位时间内 CPU 使用情况的统计,以百分比的方式展示。
/proc/stat 提供的就是系统的 CPU 和任务统计信息。
3.1 CPU使用率相关重要指标
以top命令查看到信息为例:
- user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。
- nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
- system(通常缩写为 sys),代表内核态 CPU 时间。
- idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。
- iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。
- irq(通常缩写为 hi),代表处理硬中断的 CPU 时间。
- softirq(通常缩写为 si),代表处理软中断的 CPU 时间。
- steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
- guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。
- guest_nice(通常缩写为 gnice),代表以低优先级运行虚拟机的时间。
CPU 使用率,就是除了空闲时间外的其他时间占总 CPU 时间的百分比
为了计算 CPU 使用率,性能工具一般都会取间隔一段时间(比如 3 秒)的两次值,作差后,再计算出这段时间内的平均 CPU 使用率
3.2 查看CPU使用率 —— ps/top/pidstat
top 显示了系统总体的 CPU 和内存使用情况,以及各个进程的资源使用情况,且top 默认使用 3 秒时间间隔。
ps 则只显示了每个进程的资源使用情况,使用的是进程的整个生命周期。
top、ps等性能分析工具给出的都是间隔一段时间的平均 CPU 使用率,所以要注意间隔时间的设置,特别是用多个工具对比分析时,你一定要保证它们用的是相同的间隔时间。由于top默认是3s的时间间隔,而ps是进程的整个生命周期,导致二者查询到的数据不一致。
3.2.1 top命令
top默认显示的是所有CPU的平均值,按下数字 1 ,可以切换到每个CPU的使用率。
每个进程都有一个%CPU列,表示进程的CPU使用率。是用户态和内核态CPU使用率的总和,包括us(进程用户空间使用的CPU)、sys(通过系统调用执行的内核空间CPU)、以及在wa(就绪队列等待运行的CPU)。在虚拟环境中,他还包括了st(运行虚拟机占用的CPU)。
3.2.2 pidstat命令
#展示了间隔1秒进程的5组CPU使用率。
pidstat 1 5
- %usr:用户态CPU使用率
- %system:内核态CPU使用率
- %guest:运行虚拟机CPU使用率
- %wait:等待CPU使用率
- %cpu:总的CPU使用率
- Average:计算5组数据的平均值
3.3 CPU使用率过高怎么办?
3.3.1 perf —— 分析进程的CPU问题
- 分析系统事件
- 分析系统内核性能
- 分析指定应用程序的性能问题
常用分析方式:
yum install -y perf
perf top
#实时显示占用CPU时钟最多的函数或者指定,用于查找热点函数 perf top // perf top 虽然实时展示了系统的性能信息,但它的缺点是并不保存数据,也就无法用于离 //线或者后续的分析
- 第一行主要以下三个数据:
- Samples 采样数
- 如果采样数过少(比如只有十几个),那下面的排序和百分比就没什么实际参考价值了。
- event 事件类型
- Event count 事件总数量
- Samples 采样数
- 第一列 Overhead:该符号的性能时间在所有采样中的额比例,用百分比来表示
- 第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
- Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
- 最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
perf record
#保存数据的功能,保存后的数据,需要你用 perf report 解析展示
perf record // 按 Ctrl+C 终止采样
perf report // 展示类似于 perf top 的报告
3.4 CPU使用率案例分析 —— ab
ab(apache bench)是一个常用的 HTTP 服务性能测试工具,这里用来模拟 Ngnix 的客户端。
# 并发 10 个请求测试 Nginx 性能,总共测试 100 个请求
ab -c 10 -n 100 http://192.168.0.10:10000/
This is ApacheBench, Version 2.3 <$Revision: 1706008 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd,
...
Requests per second: 11.63 [#/sec] (mean)
Time per request: 859.942 [ms] (mean)
...
ab -c 10 -n 10000 http://10.240.0.5:10000/
此时CPU的使用率如下:
系统中有几个 php-fpm 进程的 CPU 使用率加起来接近 200%;而每个 CPU 的用户使用率(us)也已经超过了 98%,接近饱和。这样,我们就可以确认,正是用户空间的 php-fpm 进程,导致 CPU 使用率骤升。
怎么知道是 php-fpm 的哪个函数导致了 CPU 使用率升高呢?我们来用 perf 分析一下。在第一个终端运行下面的 perf 命令:
# -g 开启调用关系分析,-p 指定 php-fpm 的进程号 21515
perf top -g -p 21515
按方向键切换到 php-fpm,再按下回车键展开 php-fpm 的调用关系,你会发现,调用关系最终到了 sqrt 和 add_function。看来,我们需要从这两个函数入手了。
3.5 当CPU使用率升高时,分析方式
- 通过 top、pidstat 等工具,确认引发 CPU 性能问题的来源
- 再使用 perf 等工具,排查出引起性能问题的具体函数
java实例频繁出现FGC,或发生死循环、线程阻塞、IO wait
解决方案如下:
- top 命令查看CPU使用率比较高的进程
- top -Hp pid 定位使用CPU最高的线程
- printf '0x%x' pid 将线程pid转成16进制
- jstack pid | grep tid 找到CPU使用率最高线程堆栈(tid就是16进制的pid)
3.6 当CPU使用率升高时,找不到pid
系统的 CPU 使用率,不仅包括进程用户态和内核态的运行,还包括中断处理、等待 I/O 以及内核线程等。当你发现系统的 CPU 使用率很高的时候,不一定能找到相对应的高 CPU 使用率的进程。
问题描述:
用户 CPU 使用率已经高达 80%,通过top命令以及pidstat命令查看不到那个进程使用率高,要如何解决?
3.6.1 常规办法
先使用top,pidstat,pstree分析CPU使用率高的情况,并且通过perf生成报告来进行分析
# 记录性能事件,等待大约15秒后按 Ctrl+C 退出
perf record -g
# 查看报告
perf report
//补充
#查看进程的父进程的命令
pstree
3.6.2 execsnoop
execsnoop 就是一个专为短时进程设计的工具。它通过 ftrace 实时监控进程的 exec() 行为,并输出短时进程的基本信息,包括进程 PID、父进程 PID、命令行参数以及执行的结果。
3.7 总结
3.7.1 不同CPU使用率升高的排查思路
CPU 使用率是最直观和最常用的系统性能指标,需要弄清楚用户(%user)、Nice(%nice)、系统(%system) 、等待 I/O(%iowait) 、中断(%irq)以及软中断(%softirq)这几种不同 CPU 的使用率。
- 用户 CPU 和 Nice CPU 高,说明用户态进程占用了较多的 CPU,所以应该着重排查进程的性能问题
- 系统 CPU 高,说明内核态占用了较多的 CPU,所以应该着重排查内核线程或者系统调用的性能问题。
- I/O 等待 CPU 高,说明等待 I/O 的时间比较长,所以应该着重排查系统存储是不是出现了 I/O 问题。
- 软中断和硬中断高,说明软中断或硬中断的处理程序占用了较多的 CPU,所以应该着重排查内核中的中断服务程序。
3.7.2 常规问题无法解释的 CPU 使用率情况
当常规问题无法解释的 CPU 使用率情况,有可能是短时应用导致的问题。
- 应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top 等工具也不容易发现。
- 应用本身在不停地崩溃重启,而启动过程的资源初始化,很可能会占用相当多的 CPU。
解决办法如下:
用 pstree 或者 execsnoop 找到它们的父进程,再从父进程所在的应用入手,排查问题的根源。