性能分析(6)- 如何迅速分析出系统 CPU 的瓶颈在哪里
性能分析小案例系列,可以通过下面链接查看哦
https://www.cnblogs.com/poloyy/category/1814570.html
前言
- 在做性能测试时,我们会需要对 Linux 系统的性能指标进行分析
- 这一篇就来讲下 CPU 性能指标的一个整体分析思路流程
- 总结出一个“又快又准”的瓶颈定位套路,在不同场景下,指标工具怎么选,性能瓶颈怎么找
CPU 性能指标
一共有四个需要掌握了解的性能指标
CPU 使用率
再次总结
- 最常见的一个性能指标
- 描述了非空闲时间占总 CPU 时间的百分比
- 根据 CPU 上运行任务的不同,又被分为:用户 CPU、系统 CPU、等待 I/O CPU、软中断、硬中断
用户 CPU 使用率
- 表示 CPU 在用户态运行的时间百分比
- 包括:用户态的 CPU 使用率(user)和低优先级的用户态 CPU 使用率(nice)
- 用户 CPU 使用率高,说明有应用程序比较繁忙
系统 CPU 使用率
- 表示 CPU 在内核态运行的时间百分比(不包括中断)
- 系统 CPU 使用率高,说明内核比较繁忙
等待 I/O 的 CPU 使用率
- 通常也称为 iowait,表示等待 I/O 的时间百分比
- iowait 高,通常说明系统与硬件设备的 I/O 交互时间比较长
软中断和硬中断的 CPU 使用率
- 分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比
- 它们的使用率高,通常说明系统发生了大量的中断
虚拟化环境
- 窃取 CPU 使用率(steal):被其他虚拟机占用的 CPU 时间百分比
- 客户 CPU 使 用率(guest):运行客户虚拟机的 CPU 时间百分比
平均负载
平均活跃进程数
理想情况
- 平均负载等于逻辑 CPU 个数,这表示每个 CPU 都恰好被充分利用
- 如果平均负载大于逻辑 CPU 个数,就表示负载比较重了
进程上下文切换
两种类型
- 自愿上下文切换:无法获取资源而导致
- 非自愿上下文切换:被系统强制调度而导致
重点知识
- CPU 上下文切换本身是保证 Linux 正常运行的一项核心功能
- 过多的上下文切换,会将运行进程的 CPU 时间,消耗在寄存器、内核栈、虚拟内存等数据的保存和恢复上
- 最终,缩短进程真正运行的时间,成为性能瓶颈
CPU 缓存命中率
为什么会有缓存命中率
- 由于 CPU 发展的速度远快于内存的发展,CPU 的处理速度就比内存的访问速度快得多
- 这样,CPU 在访问内存的时候,免不了要等待内存的响应
- 为了协调这两者巨大的性能差距,CPU 缓存(通常是多级缓存)就出现了
- 就像上面这张图显示的,CPU 缓存的速度介于 CPU 和内存之间,缓存的是热点的内存数据
- 根据不断增长的热点数据,这些缓存按照大小不同分为 L1、L2、L3 等三级缓存,其中 L1 和 L2 常用在单核中, L3 则用在多核中
- 从 L1 到 L3,三级缓存的大小依次增大,相应的,性能依次降低(当然比内存还是好得 多)
- 而它们的命中率,衡量的是 CPU 缓存的复用情况,命中率越高,则表示性能越好
CPU 性能工具
炒鸡重点
把性能指标和性能工具联系起来,下面个将从两个维度来讲这个点
第一个维度:从 CPU 的性能指标出发
- 也就是说,当你要查看某个性能指标时,要清楚知道哪些工具可以做到
- 总结:哪个工具可以查看哪些指标
第二个维度:从工具触发
要明确知道这个工具能提供哪些指标
重点!重点!重点!来了!
如何快速分析 CPU 的性能瓶颈
在实际生产环境中,我们通常都希望尽可能快地定位系统的瓶颈,然后尽可能快地优化性能,也就是要又快又准地解决性能问题
认知
- 虽然 CPU 的性能指标比较多,但要知道,既然都是描述系统的 CPU 性能,它们就不会是完全孤立的,很多指标间都有一定的关联
- 想弄清楚性能指标的关联性,就要通晓每种性能指标的工作原理
举个栗子
- 用户 CPU 使用率(us)高,应该去排查进程的用户态而不是内核态,因为用户 CPU 使用率反映的就是用户态的 CPU 使用情况
- 而内核态的 CPU 使用情况只会反映到系统 CPU 使用率(sy)上
CPU 使用率高的场景,如何进行一系列的性能分析
列出了 top、vmstat 和 pidstat 分别提供的重要的 CPU 指标,并用虚线表示关联关系,对应出了性能分析下一步的方向
下面举些小栗子
栗子一
- top 看到用户态 CPU 使用率偏高
- 可以根据 pidstat 的输出进一步观察是否是某个进程导致的问题
- 找出 CPU 使用率偏高的进程之后就要用进程分析工具来分析进程的行为
- 比如使用 strace 分析系统调用情况,perf 分析调用链中各级函数的执行情况
栗子二
- top 看到平均负载升高
- 通过 vmstat 查看 R 状态和 B 状态的进程数,是否有数量上的异常
- 如果不可中断状态的进程数过多,需要做 I/O 的分析,可以通过 dstat 或 sar 工具来分析 I/O
- 如果是运行状态的进程数过多,可以通过 pidstat 确认处于运行状态的进程,然后用进程分析工具做进一步分析
栗子三
- top 看到软中断 CPU 使用率(si)偏高,进程列表能看到软中断进程 CPU 使用率也偏高
- 可以根据读取 /proc/softirqs 查看软中断类型和变化频率
- 如果是网络相关软中断导致的问题,可以进一步通过网络分析工具 sar、tcpdump 来分析
性能分析(6)- 如何迅速分析出系统 CPU 的瓶颈在哪里的更多相关文章
- 如何迅速分析出系统CPU的瓶颈在哪里?
内容出自极客时间专栏<Linux 性能优化实战> CPU 的性能指标那么多,CPU 性能分析工具一抓一大把,换成实际的工作场景,该观察什么指标.选择哪个性能工具呢? 不要担心,今天我就以多 ...
- Db2性能:系统CPU高问题分析的一些思路
Db2性能:系统CPU高问题分析的一些思路 1. 如何判断CPU高? 有很多操作系统的命令可以看出来,比如ps -elf,iostat, vmstat, top/topas, 2. 收集数据 CPU高 ...
- 性能监控工具以及java堆分析OOM
一.性能监控工具 1.系统性能监控 Linux -确定系统运行的整体状态,基本定位问题所在 -uptime: ------系统时间 ------运行时间(例子中为127天) ------连接数(每 ...
- netty源码分析(十八)Netty底层架构系统总结与应用实践
一个EventLoopGroup当中会包含一个或多个EventLoop. 一个EventLoop在它的整个生命周期当中都只会与唯一一个Thread进行绑定. 所有由EventLoop所处理的各种I/O ...
- jQuery-1.9.1源码分析系列(四) 缓存系统
先前在分析Sizzle的时候分析到Sizzle有自己的缓存机制,点击这里查看.不过Sizzle的缓存只是对内使用的(内部自己存,自己取).接下来分析jQuery可以对外使用的缓存(可存可取). 首先需 ...
- sql中varchar(n),nvarchar(n) 长度性能及所占空间分析
sql中varchar(n),nvarchar(n) 长度性能及所占空间分析 1.varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. ...
- Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)
Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...
- sar 找出系统瓶颈的利器
sar 找出系统瓶颈的利器sar是System Activity Reporter(系统活动情况报告)的缩写.sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态.它的 ...
- Linux系统CPU的性能监控及调优
前言: 性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢.接口超时,服务器负载高.并发数低,数据库频繁死锁等.尤其是在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码的 ...
随机推荐
- Onedrive分享型网盘搭建 - OneManager
注册账号 部署OneManager 注册完账号后打开网址:https://heroku.com/deploy?template=https://github.com/qkqpttgf/OneManag ...
- Java 线程与同步的性能优化
本文探讨的主题是,如何挖掘出Java线程和同步设施的最大性能. 1.线程池与ThreadPoolExecutor 1)线程池与ThreadPoolExecutor 线程池的实现可能有所不同,但基本概念 ...
- [jvm] -- 引用篇
四种引用及其应用场景 强引用 强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收. 使用场景:啥时候都在使用 软引用 软引用在程序内存不足时,会被回收. 使用场景:创建缓存 ...
- java计算下一个整5分钟时间点
需求背景 我的需求是获取当前时间之后的下一个"整5分钟时间点". 首先,那么何为"整5分钟时间点"? 满足以下两个条件的时间: 分钟数等于以下时间中的一个,且秒 ...
- Git的忽略文件
*.iml.gradle.idea/local.properties/.idea/workspace.xml/.idea/libraries.DS_Store/build/captures.exter ...
- dos格式迭代转为unix
#!/bin/bash function recurse_convert() { local path=$ if [ "$path" == "" ];then ...
- 小书MybatisPlus第9篇-常用字段默认值自动填充
本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总 ...
- Golang获取目录下的文件及目录信息
一.获取当前目录下的文件或目录信息(不包含多级子目录) func main() { pwd,_ := os.Getwd() //获取当前目录 //获取文件或目录相关信息 fileInfoList ...
- 可能会用的到的JQ插件
├─lib │ jquery jQuery类库(v1.9.1) │ bootstrapSwitch 开关控件 │ Hui-iconfont_v1.0 阿里图标字体库(H-ui定制) │ font-aw ...
- windows:shellcode 远程线程hook/注入(一)
https://www.cnblogs.com/theseventhson/p/13199381.html 上次分享了通过APC注入方式,让目标线程运行shellcode.这么做有个前提条件:目标线程 ...