性能测试必备知识(7)- 深入理解“CPU 使用率”
时间:2022-07-22
本文章向大家介绍性能测试必备知识(7)- 深入理解“CPU 使用率”,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
做性能测试的必备知识系列,可以看下面链接的文章哦
https://www.cnblogs.com/poloyy/category/1806772.html
回顾
CPU 使用率是单位时间内 CPU 使用情况的统计,以百分比的方式展示
灵魂拷问
最常用什么指标来描述系统的 CPU 性能?
回答
CPU 使用率,而不是平均负载,CPU 上下文切换
CPU 使用率
前言
前面说过,Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,在通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉
了解节拍率
- 为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数
- 每发生一次时间中断,Jiffies 的值 就加 1。
- 节拍率 HZ 是内核的可配选项,可以设置为 100、250、1000 等
- 不同的系统可能设置不同数值,你可以通过查询 内核选项来查看它的配置值
/boot/config
- 比如在我的系统中, 节拍率设置成了 1000,也就是每秒钟触发 1000 次时间中断。
grep 'CONFIG_HZ=' /boot/config-$(uname -r)
了解用户空间节拍率
- 因为节拍率 HZ 是内核选项,所以用户空间程序并不能直接访问
- 为了方便用户空间程序,内核还提供了一个用户空间节拍率 USER_HZ
- 它总是固定为 100,也就是 1/100 秒
- 这样,用户空间程序并不需要关心内核中 HZ 被设置成了多少,因为它看到的总是固定值 USER_HZ
系统 CPU 数据来(了解)
- Linux 通过 虚拟文件系统,向用户空间提供了系统内部状态的信息
/proc
- 而 提供的就是系统的 CPU 和任务统计信息
/proc/stat
只查看 CPU 的数据
cat /proc/stat | grep ^cpu
结果分析
从左往右一共 11 列哦
- CPU 编号:第一行是 CPU 的累加
- 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:通过虚拟化运行其他操作系统的时间,就是运行虚拟机的 CPU 时间
- guest_nice(gnice):以低优先级运行虚拟机的时间
CPU 使用率计算公式(了解)
除了空闲时间外的其他时间占总 CPU 时间的百分比
灵魂拷问
/proc/stat 的数据,算的是什么时间段的 CPU 使用率?
回答
这是开机以来的节拍数累加值,所以直接算出来的,是开机以来的平均 CPU 使用率,一般没啥参考价值
性能工具所看到的 CPU 使用率的实际计算方法
为了计算 CPU 使用率,性能工具一般都会取间隔一段时间(比如 3 秒)的两次值,作差后,再计算出这段时间内的平均 CPU 使用率
总结下
- 各种各样的性能分析工具已经帮我们计算好了 CPU 平均使用率,不需要自己单独计算
- 不过要注意的是,性能分析工具给出的都是间隔一段时间的平均 CPU 使用率,所以要注意间隔时间的设置,
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- OC循环方法推荐-块循环遍历(比for循环好用)
- oc工程中oc、swift混编代码打包成静态framework踩坑笔记
- alloc 和 init都做了什么验证。
- 回顾冒泡排序(新增优化代码)
- 计算输入的一句英文语句中单词数
- 《剑指offer》第21天:合并两个有序链表
- 单细胞转录组基础分析六:伪时间分析
- 使用PaintCode便捷地实现动画效果
- 用墨卡托和GPS坐标计算距离时误差测试
- 单细胞转录组基础分析五:细胞再聚类
- Semaphore回顾
- iOS13 关闭黑暗模式+状态栏显示问题解决方法
- 0807-6.2.0-CDSW中Session列表和team分析
- 单细胞转录组基础分析八:可视化工具总结
- 单细胞转录组基础分析七:差异基因富集分析