看完这篇文章,我再也不用担心线上出现 CPU 性能问题了(上)

news2024/9/22 5:35:12

目录

    • CPU 使用率
    • 平均负载
    • 进程上下文切换
    • 总结

生产环境上出现 CPU 性能问题是非常典型的一类问题,往往这个时候就比较考验相关人员排查问题的能力

我相信不少小伙伴在工作当中多多少少都会碰到 CPU 出现性能瓶颈

不知道小伙伴们有没有跟我一样的感受——当 CPU 出现性能瓶颈的时候,会有一种“拔剑四顾心茫然”的感觉,CPU 性能指标这么多,CPU性能分析工具也是一抓一大把

**该观察哪些性能指标?又该用什么工具来进行观察?**你会发现排查问题往往比解决问题更难

那么今天就给大家分享一下咸鱼熬夜整理的 CPU 性能排查套路,告诉大家如何“快准狠”地找到问题所在,让大家在面对 CPU 出现性能瓶颈的时候不再手足无措

CPU 使用率

当 CPU 出现性能瓶颈的时候,最容易想到的就是 CPU 使用率,这也是生产环境中最常见的一个性能指标

CPU使用率是指在单位时间内CPU处在非空闲态的时间比,反映了CPU的繁忙程度

比如说单核 CPU 一秒内处在非空闲态的时间为 0.6s,那么这时候的 CPU 使用率就是 60%;双核 CPU 一秒内处在非空闲态的时间分别为 0.6s 和 0.4s,那么 CPU 使用率为(0.4+0.6)/ 2 * 100% = 50%

根据 CPU 上运行的任务的不同,又被分为用户 CPU、系统 CPU、等待 I/O CPU、软中断和硬中断等

  • 用户 CPU 使用率

包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice)

表示 CPU 处在用户态运行的时间的百分比,用户 CPU 使用率高,通常说明用户进程比较忙,占用了较多的 CPU 时间,着重排查进程的性能问题

  • 系统 CPU 使用率

表示 CPU 处在内核态运行的时间的百分比(不包括中断),系统 CPU 使用率高,说明内核比较繁忙,占用了较多的 CPU 时间,着重排查内核线程或者系统调用的性能问题

  • 等待 I/O 的 CPU 使用率

通常称作 iowait,表示系统等待 I/O 的时间的百分比

iowait 高,通常说明系统与硬件设备的 I/O 交互时间比较长,应该着重排查系统存储设备是不是出现了 I/O 问题

  • 软中断和硬中断的 CPU 使用率

分别表示内核调用软中断处理程序,硬中断处理程序的时间的百分比

这两个指标高,通常说明系统发生了大量的中断,着重排查内核的中断服务程序

尤其是是软中断 CPU 使用率过高,是很常见的一种 CPU 性能问题

在 Linux 中,每个 CPU 都对应着一个软中断内核线程,名字是 ksoftirqd/CPU 编号在这里插入图片描述
当软中断事件的频率过高时,就会因为软中断 CPU 使用率过高导致内核线程无法及时处理软中断,进而引发像网络收发延迟,调度缓慢等性能问题

在这里我举个软中断使用率升高的例子:

当计算机网卡接收到数据后,会将数据先放到缓冲区中,然后触发中断,通知内核来处理数据,这是一个异步的过程,在等待内核处理数据的过程中网卡是可以继续接收网络数据的

因为有缓冲区的参与,我们可以将网卡看成生产者,内核看出消费者,而缓冲区就是消息队列

生产者生产消息速度过快(网卡不断接收数据不断触发中断),消费者消费速度过慢(内核还未来得及处理 A 中断,B
中断就又来了),就会引起消息挤压和消息处理延时问题

平均负载

第二个要注意的性能指标,就是平均负载(Load Average)了

平均负载指的是单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率没有直接关系

它反应了系统的整体负载情况,主要包括三个数值,分别指过去 1 分钟、过去 5 分钟和过去 15 分钟的平均负载

# uptime 
load average: 0.00, 0.01, 0.05

既然平均的是活跃进程数,那么理想情况下就是每个 CPU 上都刚好运行着一个进程,这样每个 CPU 都得到了充分利用

比如当平均负载为2时意味着什么呢?

  • 如果 CPU 为两个,意味着所有的 CPU 刚好被完全占用
  • 如果 CPU 为四个,意味着有 50% 的 CPU 是空闲的
  • 如果CPU 为一个,意味着有一半的进程竞争不到 CPU

那么生产环境上的 CPU 平均负载为多少比较合理呢?

我们知道,平均负载最理想的状况是等于逻辑 CPU 个数,所以我们要首先知道系统有几个 CPU

知道了 CPU 个数之后,我们就可以判断出平均负载比 CPU 个数还大时,系统已经出现了过载

但是这样就结束了吗?且慢,我们从上面 uptime 输出的结果可以看到,平均负载有三个数值,我们该参考哪一个呢?

实际上我们三个都要看,三个不同时间间隔的平均值其实给我们提供了系统负载的趋势

1、如果1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳

2、如果 1 分钟的值远小于 15 分钟的值,就说明系统最近 1 分钟的负载在减少,而过去 15 分钟内却有很大的负载

3、如果 1 分钟的值远大于 15 分钟的值,就说明最近 1 分钟的负载在增加,这种增加有可能只是临时性的,也有可能还会持续增加下去,所以就需要持续观察。一旦 1 分钟的平均负载接近或超过了 CPU 的个数,就意味着系统正在发生过载的问题,这时就得分析调查是哪里导致的问题,并要想办法优化了

举个例子:

假设在单个 CPU 的系统上观察到平均负载为:1.89、0.60、7.98。那么说明在过去一分钟内系统有 73%
的超载,但是在15分钟内,系统有 689% 的超载,从时间线来看系统的负载正在降低

在生产环境中,当观察到系统负载有明显升高的趋势时(比如说负载翻倍了)就要着重进行排查是哪些进程导致负载变高了

进程上下文切换

第三个要注意的性能指标,就是进程的上下文切换

在介绍进程上下文切换之前,我们先来看看 CPU 上下文切换

Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行,当然这些任务并不是真的在同时运行,而是因为系统在极短时间内将 CPU 轮流分配给他们,造成宏观上多任务同时进行的错觉

而在轮流运行每个任务前,CPU 都需要知道任务从哪里加载,又从哪里开始运行。即 CPU 需要实现设置好 CPU 寄存器和程序计数器

CPU 寄存器,是 CPU 内置的容量小、但速度极快的内存。而程序计数器,则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。它们都是 CPU 在运行任何任务前,必须的依赖环境,因此也被叫做 CPU 上下文

在这里插入图片描述
知道了什么是 CPU 上下文之后,CPU 上下文切换也就很好理解了

CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务

而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行

根据任务的不同,CPU 的上下文切换就可以分为几个不同的场景,也就是进程上下文切换、线程上下文切换以及中断上下文切换

  • 进程上下文切换

进程上下文切换,是指从一个进程切换到另一个进程运行

我们知道,进程是由内核来管理和调度的,进程的切换只能发生在内核态,而内核需要在 CPU 上运行才能完成
在这里插入图片描述

所以说,过多的上下文切换,会将原本运行进程的 CPU 时间,消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成为性能瓶颈

既然知道进程上下文切换有可能导致 CPU 性能问题,那么什么时候会出现进程上下文切换呢?

  • 为了保证所有进程可以得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。这样,当某个进程的时间片耗尽了,就会被系统挂起,切换到其它正在等待 CPU 的进程运行
  • 进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行
  • 进程通过睡眠函数 sleep 这样的方法将自己主动挂起时,会重新调度
  • 当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行
  • 发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核中的中断服务程序

一旦出现上下文切换的性能问题,就要着重分析是以上哪个场景导致的

总结

在这里插入图片描述
本篇文章介绍了三个常用的 CPU 性能指标,当 CPU 出现性能瓶颈的时候,就可以根据这些性能指标进行逐个排查分析

前提是需要对每个性能指标背后的原理要熟悉,只有这样才能够缩小排查范围,提高效率,既省时又省力

举个例子,当你观察到用户 CPU 使用率升高的时候,我们应该去着重排查进程的用户态而不是内核态,因为用户 CPU 使用率反映的就是用户态的
CPU 使用情况,而内核态的 CPU 使用情况只会反映到系统 CPU 使用率上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小红书排行榜 | 粉丝增量500w+,探寻爆款种草内容密码

随着兔年来临,回首上个月小红书母婴动态,行业热度依旧高涨,越来越多的达人和新品牌都涌入了小红书,母婴品牌要如何巧用小红书数据分析工具抢占用户心智?增量500w+的母婴博主有何亮点之处?和我一…

【甘特图软件部件】上海道宁与​DlhSoft助力您的Windows与移动应用程序开发

DlhSoft支持 使用可自定义的甘特图 时间轴、项目调度、资源负载图表、 看板、PERT图表和网络图 为您的WPF、ASP .NET、JavaScript 或macOS和iOS应用程序 设计更智能的应用程序 DlhSoft提供了 真正强大的甘特图软件部件 Apple平台开发人员可以 轻松地将其集成到 他们自…

equals和 == 的区别

1 问题equals和 都可以对于值类型,然后比较代数值是否相等。那么equals和 的具体区别是什么?2 方法 是运算符,可以使用在基本数据类型变量和引用数据类型变量中,如果比较的是基本数据类型:比较的是两个变量保存额数据…

嵌入式实时操作系统的设计与开发(二)

加载应用程序与创建程序运行环境 将应用程序从Flash加载到RAM的实现代码是一定在启动代码中的。 计算机系统的运行其实是CPU到相应的内存地址去取回指令,然后译码并执行指令,再依次从下一个地址取指、执行,而程序就是指令与数据的集合。 程序…

JAVAWeb开发(基于分片的网络状态查询方法、装置及存储介质)

本文基于分片的网络状态查询方法、装置及存储介质已是申请的专利。本人为第一发明人,这里给出来是提供一种写专利的范本,仅供参考。专利申请号:CN202110346967.5正文部分:技术领域本申请涉及但不限于计算机网络数据传输一致性领域…

opencv--颜色物体追踪 图片的形态学处理函数

目录 一、主要函数介绍 1. cv2.erode() 2. cv2.dilate() 3. cv2.findContours() 4. cv2.circle() 5. cv2.line() 二、代码 这里首先确定是否安装imutils库,这个库能让调整大小或者翻转屏幕等基本任务更加容易实现。这一次主要应用的是对于图片的形态学处理函…

【Android春招】Android基础day1

一、填空题 1.Android是基于__ 的移动端开源操作系统。 Linux 2.Android系统是由__公司推出的。 谷歌 3.Android 11对应的API编号是__。 30 4.App除了在手机上运行,还能在电脑的__上运行。 模拟器(AVD&…

测试之概念篇【需求、测试用例、Bug描述、产品的生命周期、开发模型、测试模型】

文章目录1. 什么是需求2. 测试用例是什么3. Bug 是描述4. 产品的生命周期5. 软件测试贯穿于软件的整个生命,如何贯穿?6. 开发模型(瀑布模型、螺旋模型、增量模型和迭代模型、敏捷模型)7. 测试模型(V模型、W模型&#x…

【Java寒假打卡】Java基础-BigDecimal

【Java寒假打卡】Java基础-BigDecimal构造方法四则运算BigDecimal的特殊方法基本数据类型包装类自动装箱与自动拆箱Integer的类型转换将数字字符串进行拆分成整数数组构造方法 package com.hfut.edu.test1;import java.math.BigDecimal;public class test3 {public static void…

Crontab命令详解

crontab命令是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行。crontab命令可以精确到分(精确到秒的一般写脚本),相当于闹钟。 如果不使用crontab,那么任…

GD32F103-TIMER模块

定时器是一个功能强大的外设。 一般功能: 定时中断,计时器,给定一个时间,到达时间后产生一个中断定时器输出比较的功能,用于PWM波形的产生,驱动电机定时器输入捕获,测频率 核心关键参数&#…

基于Java+SpringBoot+vue+element实现新冠疫情物资管理系统详细设计

基于JavaSpringBootvueelement实现新冠疫情物资管理系统详细设计 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录基于…

文件IO----(open、close、read、write、lseek)

1.文件IO 介绍:(系统IO、系统调用) POSIX(可移植操作系统接口)定义的一组函数,不提供缓冲机制,每次读写操作都引起系统调用,核心概念是文件描述符,访问各种文件类型,Lin…

Keychron 键盘指南

文章目录QQ1Q2Q3Q4Q5KK1K2k3 && k3proK3 VS K7k6 && K6prok7K8k10K12K14CVV1V2V3V4V5V6SQ Q1 Q1 是一款革命性的全金属键盘,每个开关、键帽、稳定器、旋钮甚至面板都具有可定制的功能。它专为个性化体验和卓越的打字舒适度而设计。 双垫片设计…

Cadence PCB仿真使用Allegro PCB SI配置仿真库的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI软件选择需要仿真的网络的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可这样…

模型微调,低预算,高期望!

作为迁移学习中的常用技术,Fine-tuning(微调)已经成为了深度学习革命的重要部分。微调不需要针对新任务从头开始学习,只需要加载预训练模型的参数,然后利用新任务的数据进行一步训练模型即可。也可以说微调是对开放域任…

一文简单了解并部署Zookeeper集群

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:蟹黄瓜子文章来源:GreatSQL社区投稿 1.Zookeeper概述 Zookeeper对于很多人开始可能都有所耳闻&am…

基于Java+SpringBoot+vue+element实现爱心捐赠平台系统

基于JavaSpringBootvueelement实现爱心捐赠平台系统 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

排他思想的运用

思路简述 需求:桌子上有一排灯,点哪个亮哪个,但是要求每次只能点亮一盏。如果不使用排他思想,操作过程如下: 第一次打开一盏灯,记为 A,记录下来。第二次打开灯之前,先去找记录&…

[cpp进阶]C++智能指针

文章目录为什么需要智能指针?智能指针的原理及使用智能指针的原理智能指针的使用C中的智能指针C智能指针的发展历程std::auto_ptrstd::auto_ptr的使用std::auto_ptr的模拟实现std::unique_ptrstd::unique_ptr的使用std::unique_ptr的模拟实现std::shared_ptrstd::shared_ptr的…