课程连接https://time.geekbang.org/column/intro/100020901

这里是学习课程的时候记录的一些学习笔记

一 CPU 性能指标

首先,最容易想到的应该是 CPU 使用率,这也是实际环境中最常见的一个性能指标。
CPU 使用率描述了非空闲时间占总 CPU 时间的百分比,根据 CPU 上运行任务的不同,又被分为用户 CPU、系统 CPU、等待 I/O CPU、软中断和硬中断等。

  • 用户 CPU 使用率,包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice),表示 CPU 在用户态运行的时间百分比。
  • 用户 CPU 使用率高,通常说明有应用程序比较繁忙。
  • 系统 CPU 使用率,表示 CPU 在内核态运行的时间百分比(不包括中断)。
  • 系统 CPU 使用率高,说明内核比较繁忙。
  • 等待 I/O 的 CPU 使用率,通常也称为 iowait,表示等待 I/O 的时间百分比。iowait 高,通常说明系统与硬件设备的 I/O 交互时间比较长。
  • 软中断和硬中断的 CPU 使用率,分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。
  • 它们的使用率高,通常说明系统发生了大量的中断。
    除了上面这些,还有在虚拟化环境中会用到的窃取 CPU 使用率(steal)和客户 CPU 使用率(guest),分别表示被其他虚拟机占用的 CPU 时间百分比,和运行客户虚拟机的 CPU 时间百分比。

第二个比较容易想到的,应该是平均负载(Load Average),也就是系统的平均活跃进程数。它反应了系统的整体负载情况,主要包括三个数值,分别指过去 1 分钟、过去 5 分钟和过去 15 分钟的平均负载。
理想情况下,平均负载等于逻辑 CPU 个数,这表示每个 CPU 都恰好被充分利用。如果平均负载大于逻辑 CPU 个数,就表示负载比较重了。

第三个,进程上下文切换,包括:

  • 无法获取资源而导致的自愿上下文切换;
  • 被系统强制调度导致的非自愿上下文切换。
  • 上下文切换,本身是保证 Linux 正常运行的一项核心功能。
  • 但过多的上下文切换,会将原本运行进程的 CPU 时间,消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成为性能瓶颈。
    除了上面几种,还有一个指标,CPU 缓存的命中率。由于 CPU 发展的速度远快于内存的发展,CPU 的处理速度就比内存的访问速度快得多。这样,CPU 在访问内存的时候,免不了要等待内存的响应。为了协调这两者巨大的性能差距,CPU 缓存(通常是多级缓存)就出现了。

    就像上面这张图显示的,CPU 缓存的速度介于 CPU 和内存之间,缓存的是热点的内存数据。根据不断增长的热点数据,这些缓存按照大小不同分为 L1、L2、L3 等三级缓存,其中 L1 和 L2 常用在单核中, L3 则用在多核中。
    从 L1 到 L3,三级缓存的大小依次增大,相应的,性能依次降低(当然比内存还是好得多)。而它们的命中率,衡量的是 CPU 缓存的复用情况,命中率越高,则表示性能越好。
    https://www.processon.com/view/link/5fc227ba6376895e9ae57515

二 性能工具

掌握了 CPU 的性能指标,我们还需要知道,怎样去获取这些指标,也就是工具的使用。

  • 首先,平均负载的案例。我们先用uptime, 查看了系统的平均负载;而在平均负载升高后,又用 mpstatpidstat ,分别观察了每个 CPU 和每个进程 CPU 的使用情况,进而找出了导致平均负载升高的进程,也就是我们的压测工具stress
  • 第二个,上下文切换的案例。我们先用 vmstat,查看了系统的上下文切换次数和中断次数;然后通过pidstat,观察了进程的自愿上下文切换和非自愿上下文切换情况;最后通过pidstat,观察了线程的上下文切换情况,找出了上下文切换次数增多的根源,也就是我们的基准测试工具 sysbench
  • 第三个,进程 CPU 使用率升高的案例。我们先用 top,查看了系统和进程的 CPU 使用情况,发现 CPU 使用率升高的进程是 php-fpm;再用perf top,观察 php-fpm 的调用链,最终找出 CPU 升高的根源,也就是库函数 sqrt()
  • 第四个,系统的 CPU 使用率升高的案例。我们先用 top 观察到了系统 CPU 升高,但通过 toppidstat,却找不出高 CPU 使用率的进程。于是,我们重新审视 top 的输出,又从 CPU 使用率不高但处于 Running 状态的进程入手,找出了可疑之处,最终通过perf recordperf report ,发现原来是短时进程在捣鬼。
  • 另外,对于短时进程,我还介绍了一个专门的工具 execsnoop,它可以实时监控进程调用的外部命令。
  • 第五个,不可中断进程和僵尸进程的案例。我们先用 top 观察到了 iowait升高的问题,并发现了大量的不可中断进程和僵尸进程;接着我们用dstat发现是这是由磁盘读导致的,于是又通过pidstat找出了相关的进程。但我们用 strace查看进程系统调用却失败了,最终还是用 perf分析进程调用链,才发现根源在于磁盘直接 I/O 。
  • 最后一个,软中断的案例。我们通过 top 观察到,系统的软中断 CPU 使用率升高;接着查看 /proc/softirqs, 找到了几种变化速率较快的软中断;然后通过sar命令,发现是网络小包的问题,最后再用 tcpdump,找出网络帧的类型和来源,确定是一个 SYN FLOOD攻击导致的。

虽然工具很多,但是从不同的维度来理解他们,可以活学活用

三 把性能指标和性能工具联系起来

1. 第一个维度

从 CPU 的性能指标出发。也就是说,当你要查看某个性能指标时,要清楚知道哪些工具可以做到。

根据不同的性能指标,对提供指标的性能工具进行分类和理解。这样,在实际排查性能问题时,你就可以清楚知道,什么工具可以提供你想要的指标,而不是毫无根据地挨个尝试,撞运气。

比如用 top 发现了软中断 CPU 使用率高后,下一步自然就想知道具体的软中断类型。那在哪里可以观察各类软中断的运行情况呢?当然是 proc 文件系统中的 /proc/softirqs 这个文件。

紧接着,比如说,我们找到的软中断类型是网络接收,那就要继续往网络接收方向思考。系统的网络接收情况是什么样的?什么工具可以查到网络接收情况呢?在案例中,用的正是 dstat。

虽然你不需要把所有工具背下来,但如果能理解每个指标对应的工具的特性,一定更高效、更灵活地使用。这里,我把提供 CPU 性能指标的工具做成了一个表格,方便你梳理关系和理解记忆,当然,你也可以当成一个“指标工具”指南来使用。

2.第二个维度

从工具出发。也就是当你已经安装了某个工具后,要知道这个工具能提供哪些指标。
这在实际环境特别是生产环境中也是非常重要的,因为很多情况下,你并没有权限安装新的工具包,只能最大化地利用好系统中已经安装好的工具,这就需要你对它们有足够的了解。

具体到每个工具的使用方法,一般都支持丰富的配置选项。不过不用担心,这些配置选项并不用背下来。你只要知道有哪些工具、以及这些工具的基本功能是什么就够了。真正要用到的时候, 通过 man 命令,查它们的使用手册就可以了。
同样的,我也将这些常用工具汇总成了一个表格,方便你区分和理解,自然,你也可以当成一个“工具指标”指南使用,需要时查表即可。

四 如何迅速分析 CPU 的性能瓶颈

如果挨个用一遍 这样效率太低了,所以,在实际生产环境中,我们通常都希望尽可能快地定位系统的瓶颈,然后尽可能快地优化性能,也就是要又快又准地解决性能问题。
虽然 CPU 的性能指标比较多,但要知道,既然都是描述系统的 CPU 性能,它们就不会是完全孤立的,很多指标间都有一定的关联。想弄清楚性能指标的关联性,就要通晓每种性能指标的工作原理。这也是为什么我在介绍每个性能指标时,都要穿插讲解相关的系统原理,希望你能记住这一点。

用户 CPU 使用率高,我们应该去排查进程的用户态而不是内核态。因为用户 CPU 使用率反映的就是用户态的 CPU 使用情况,而内核态的 CPU 使用情况只会反映到系统 CPU 使用率上。
所以,为了缩小排查范围,我通常会先运行几个支持指标较多的工具,如 topvmstatpidstat

我列出了 top、vmstat 和 pidstat 分别提供的重要的 CPU 指标,并用虚线表示关联关系,对应出了性能分析下一步的方向。
通过这张图你可以发现,这三个命令,几乎包含了所有重要的 CPU 性能指标,比如:

  • 从 top 的输出可以得到各种 CPU 使用率以及僵尸进程和平均负载等信息。
  • 从 vmstat 的输出可以得到上下文切换次数、中断次数、运行状态和不可中断状态的进程数。
  • 从 pidstat 的输出可以得到进程的用户 CPU 使用率、系统 CPU 使用率

以及自愿上下文切换和非自愿上下文切换情况。
第一个例子,pidstat 输出的进程用户 CPU 使用率升高,会导致 top 输出的用户 CPU 使用率升高。所以,当发现 top 输出的用户 CPU 使用率有问题时,可以跟 pidstat 的输出做对比,观察是否是某个进程导致的问题。

而找出导致性能问题的进程后,就要用进程分析工具来分析进程的行为,比如使用 strace 分析系统调用情况,以及使用 perf 分析调用链中各级函数的执行情况。

如果是不可中断进程数增多了,那么就需要做 I/O 的分析,也就是用 dstat 或 sar 等工具,进一步分析 I/O 的情况。
如果是运行状态进程数增多了,那就需要回到 top 和 pidstat,找出这些处于运行状态的到底是什么进程,然后再用进程分析工具,做进一步分析。

最后一个例子,当发现 top 输出的软中断 CPU 使用率升高时,可以查看 /proc/softirqs 文件中各种类型软中断的变化情况,确定到底是哪种软中断出的问题。比如,发现是网络接收中断导致的问题,那就可以继续用网络分析工具 sar 和 tcpdump 来分析。

五 小结

常见的 CPU 性能指标,梳理了常见的 CPU 性能观测工具,最后还总结了快速分析 CPU 性能问题的思路。虽然 CPU 的性能指标很多,相应的性能分析工具也很多,但熟悉了各种指标的含义之后,你就会发现它们其实都有一定的关联。顺着这个思路,掌握常用的分析套路并不难。

如何迅速分析出系统CPU的瓶颈在哪里相关推荐

  1. 11 | 套路篇:如何迅速分析出系统CPU的瓶颈在哪里?

    CPU 的性能指标那么多,CPU 性能分析工具也是一抓一大把,如果离开专栏,换成实际的工作场景,我又该观察什么指标.选择哪个性能工具呢? 不要担心,今天我就以多年的性能优化经验,给你总结出一个&quo ...

  2. 如何迅速分析出系统CPU的瓶颈在哪里?

    内容出自极客时间专栏<Linux 性能优化实战> CPU 的性能指标那么多,CPU 性能分析工具一抓一大把,换成实际的工作场景,该观察什么指标.选择哪个性能工具呢? 不要担心,今天我就以多 ...

  3. 30 | 套路篇:如何迅速分析出系统I/O的瓶颈在哪里?

    前几节学习中,我们通过几个案例,分析了各种常见的 I/O 性能问题.通过这些实战操作,你应该已经熟悉了 I/O 性能问题的分析和定位思路,也掌握了很多 I/O 性能分析的工具. 不过,我想你可能还是会 ...

  4. sar 找出系统瓶颈的利器 目前Linux上最为全面的系统性能分析工具之一 直接 sar -dur 1 30 即可看内存 CPU和IO占用...

    12. sar 找出系统瓶颈的利器 sar是System Activity Reporter(系统活动情况报告)的缩写.sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行 ...

  5. Linux 系统 CPU 使用率简单分析

    CPU 使用率是单位时间内 CPU 使用情况的统计,以百分比的方式展示. CPU 使用率 为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 ...

  6. CPU分析系列--sysstat(mpstat+pidstat)分析系统CPU和I/O负载

    目录 mpstat:关于CPU的详细信息,单独输出或者分组输出; pidstat:关于运行中的进程/任务.CPU.内存等的统计信息; 1.模拟cpu密集型负载: 1.stress --cpu 1 -- ...

  7. 3.为方便旅客,某航空公司拟开发一个机票预订系统。写出问题定义并分析此系统的可行性。

    3.为方便旅客,某航空公司拟开发一个机票预订系统.旅行社把预订机票的旅客信息(姓名.性别.工作单位.身份证号码,旅行时间,旅行目的地等)输入进该系统,系统为旅客安排航班,印出取票通知和账单,旅客在飞机 ...

  8. AIX系统CPU监控与评估

    AIX系统CPU监控与评估 一, VMSTAT命令(CPU) 1.1 cpu 1.2 kthr(内核等待) 1.3 faults故障 1.4 memory(内存) 1.5 page磁盘交换 二, io ...

  9. 分析linux系统的运行性能,Linux系统下常见性能分析工具的使用

    在前面的文章中,我简单介绍了影响linux性能的几个方面以及如何解决这些方面的问题,但是如何才能从系统上发现是某个方面或某几个方面出现问题了呢,这就需要使用linux系统提供的几个常用性能分析工具,下 ...

  10. 如何应对CPU帧率瓶颈和卡顿?腾讯游戏学院专家带你剖析

    CPU上帧率低和卡顿是性能优化中最易出现的一部分,尤其对于手游,提到卡,就大概率是在CPU上出现的问题,CPU上的卡顿一般是卡逻辑或是卡渲染,本篇将详细系统的介绍基于UE的手游对CPU瓶颈的剖析方法. ...

最新文章

  1. 这 4 款 MySQL 调优工具 yyds
  2. 4.Ext JS Ext.data.Store本地过滤
  3. 清除浮动,消除FF和IE的区别
  4. vim的常用配置及使用方法
  5. 文献学习(part14)--Structural Deep Network Embedding
  6. 哥大首位华裔女校长:人工智能的春天来了
  7. Openfire性能优化与压力测试小结
  8. Java之WeakReference与SoftReference使用讲解
  9. java 两个数据合并_R:两个数据帧合并
  10. Dart 基礎 - 3
  11. android之list排序
  12. 关闭ant的tree_ant-design Tree组件问题
  13. oracle创建用户、创建表空间、授权、建表
  14. 数据丢失与重复_面试官:如何保证消息的可靠性传输?如何处理消息丢失的问题?...
  15. InstallShield2022程序构建可靠
  16. 第三方SDK:SMSSDK
  17. dcdc模块降额设计_大功率IGBT模块及驱动技术
  18. cad计算机试题及答案,CAD考试试题库及参考答案整理版.doc
  19. 有了这套前端数据可视化框架,人人都能快速上手(赠100套前端可视化大屏模板)
  20. 天啦噜,竟然用AI来点名!你还敢逃课吗

热门文章

  1. win32项目中使用 skia渲染的一个编译问题
  2. 深入理解Amazon Alexa Skill(四)
  3. 汽车电子中的2520贴片晶振
  4. 三极管工作原理_10分钟分析稳压三极管工作原理
  5. ide-eval-resetter
  6. 微信渐变国旗头像来了!一键生成
  7. 计算机专业可以评电力工程职称吗,电力工程类职称评审专业范围,你了解多少?...
  8. 【随笔】一名蒟蒻的自白
  9. Java自定义类的属性、方法结合数组简单使用
  10. 5G千兆无线路由器,国产工业级稳定通信