1.3-CPU性能-CPU 使用率

目录

三、CPU使用率 —— 用户CPU

3.1 CPU使用率相关重要指标

3.2 查看CPU使用率 —— ps/top/pidstat

3.3 CPU使用率过高怎么办?

3.4 CPU使用率案例分析 —— ab

3.5 当CPU使用率升高时,分析方式

3.6 当CPU使用率升高时,找不到pid

3.7 总结


三、CPU使用率 —— 用户CPU

CPU 使用率是单位时间内 CPU 使用情况的统计,以百分比的方式展示。

/proc/stat 提供的就是系统的 CPU 和任务统计信息。

3.1 CPU使用率相关重要指标

以top命令查看到信息为例:

 

  1. user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。
  2. nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
  3. system(通常缩写为 sys),代表内核态 CPU 时间。
  4. idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。
  5. iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。
  6. irq(通常缩写为 hi),代表处理硬中断的 CPU 时间。
  7. softirq(通常缩写为 si),代表处理软中断的 CPU 时间。
  8. steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
  9. guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。
  10. 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 虽然实时展示了系统的性能信息,但它的缺点是并不保存数据,也就无法用于离 //线或者后续的分析

  1. 第一行主要以下三个数据:
    1. Samples 采样数
      1. 如果采样数过少(比如只有十几个),那下面的排序和百分比就没什么实际参考价值了。
    2. event 事件类型
    3. Event count 事件总数量
  2. 第一列 Overhead:该符号的性能时间在所有采样中的额比例,用百分比来表示
  3. 第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
  4. Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
  5. 最后一列 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使用率升高时,分析方式

  1. 通过 top、pidstat 等工具,确认引发 CPU 性能问题的来源
  2. 再使用 perf 等工具,排查出引起性能问题的具体函数

java实例频繁出现FGC,或发生死循环、线程阻塞、IO wait

解决方案如下:

  1. top 命令查看CPU使用率比较高的进程
  2. top -Hp pid 定位使用CPU最高的线程
  3. printf '0x%x' pid 将线程pid转成16进制
  4. 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 使用率情况,有可能是短时应用导致的问题。

  1. 应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top 等工具也不容易发现。
  2. 应用本身在不停地崩溃重启,而启动过程的资源初始化,很可能会占用相当多的 CPU。

解决办法如下:

用 pstree 或者 execsnoop 找到它们的父进程,再从父进程所在的应用入手,排查问题的根源。

上一篇:3 当某个应用的CPU使用达到100%,该怎么办?


下一篇:grep awk 搜索日志常用命令