Linux内核《CPU负载计算》

news2024/10/5 16:32:58

目录

  • 前言
  • 一、什么是CPU负载?
  • 二、如何计算CPU负载
  • 三、计算CPU负载的一个脚本
  • 四、top命令详解

前言

  在实际的产品开发中,我们往往需要关注CPU的负载,确保程序可以长久稳定的运行,并且能够重复发挥SOC的性能。Linux中提供了一些命令可以帮助我们统计这些信息,如top、uptime ,但是关于负载的计算原理我们大多时候并不是很清楚,今天就和大家一起学习了解下!

一、什么是CPU负载?

  在Linux内核中,CPU负载通常是指系统中正在使用和等待资源的进程数量,即使系统中的处理器核心没有100%的利用率。CPU负载可以帮助我们评估系统中的工作负荷,并判断是否有足够的处理资源可用。

  也可以认为,Linux 内核CPU负载是指在某个时间段内,CPU正在执行的进程数或线程数。它反映了CPU的负荷情况,在高负荷的情况下,CPU可能会变得不稳定或过热。

  在Linux系统中,CPU负载常由三个数字表示,称为负载平均值(load average)。这些值分别代表过去 1 分钟、5 分钟和 15 分钟内的平均负载。你可以使用 uptime 命令或 top 命令来查看当前的 CPU 负载。

  例如,运行 uptime 命令会输出像这样的信息:

05:40:52 up 1 day, 2 min,  1 user,  load average: 0.65, 1.21, 1.42

  其中 load average 后面的三个数字(0.65, 1.21, 1.42)表示过去的 1 分钟、5 分钟和 15 分钟内的平均负载。通常,这些数字应该尽可能接近系统的 CPU 核心数量,例如 1 表示接近满负荷,0.5 表示负载一半等等。

  请注意,负载平均值并不仅仅反映 CPU 利用率,它还包括等待其他资源的进程数量,如磁盘访问、网络请求等。因此,在解释和分析负载时,需要结合其他指标和上下文来全面评估系统的性能。

  值得一提的是,如果负载平均值持续高于系统的处理能力,那可能意味着系统存在性能问题。此时,你可以通过查看运行中的进程、分析系统使用的资源和优化配置等方式来进一步调查和解决问题。

二、如何计算CPU负载

  在Linux内核中,计算CPU负载主要是通过查看/proc/stat文件来获取系统级别的CPU使用信息。以下是一个简单的步骤来计算CPU负载:

  1. 打开终端并使用任何文本编辑器打开/proc/stat文件:

    cat /proc/stat
    

    在这里插入图片描述

  2. 在/proc/stat文件中,找到以"cpu"开头的相关行。这些行包含了各个CPU核心的使用信息。通常,第一行对应所有CPU核心的总和,之后的行分别对应各个独立的CPU核心。

  3. 读取每个核心的使用信息。每行的格式类似于:

    cpuX user nice system idle ...
    

    其中,cpuX表示CPU核心的索引,user表示用户态执行的时间,nice表示低优先级的任务执行的时间,system表示内核态执行的时间,idle表示空闲时间。

  4. 计算CPU总使用时间。总使用时间可以通过将用户态、低优先级任务和内核态执行的时间相加而得到,即:

    total_time = user + nice + system
    
  5. 计算CPU空闲时间。空闲时间即idle字段的数值。

  6. 计算CPU负载。CPU负载可以通过以下公式计算得到:

    load = (total_time - previous_total_time) / (interval_time * num_cores) * 100
    

    其中,previous_total_time表示上一次采样的总使用时间,interval_time表示两次采样的时间间隔,num_cores表示CPU核心的数量。
      根据上述步骤,你可以编写一个脚本或程序来自动计算CPU负载。请注意,这只是一个简单的计算方法,具体的实现可能会因为系统版本和配置而有所差异。在实际应用中,你也可能会使用更高级的工具和库来获取和分析系统的CPU负载信息,例如sar、top、mpstat等。

三、计算CPU负载的一个脚本

  当我们计算Linux内核的CPU负载时,可以使用bash脚本编写一个简单的脚本来实现。下面是一个示例脚本:

#!/bin/bash

# 获取CPU核心数
num_cores=$(grep -c ^processor /proc/cpuinfo)

# 获取负载平均值
load_average=$(uptime | awk -F 'load average:' '{print $2}')

# 获取各个时间段的负载值,并将其转换为整数
load1=$(echo $load_average | awk -F ',' '{print $1*100}' | awk '{print int($1)}')
load5=$(echo $load_average | awk -F ',' '{print $2*100}' | awk '{print int($1)}')
load15=$(echo $load_average | awk -F ',' '{print $3*100}' | awk '{print int($1)}')

# 计算百分比负载
load1_percent=$(awk "BEGIN {printf \"%.2f\n\", $load1 / $num_cores}")
load5_percent=$(awk "BEGIN {printf \"%.2f\n\", $load5 /$num_cores}")
load15_percent=$(awk "BEGIN {printf \"%.2f\n\", $load15 /$num_cores}")

# 打印结果
echo "负载平均值:$load_average"
echo "过去1分钟的负载:$load1_percent%"
echo "过去5分钟的负载:$load5_percent%"
echo "过去15分钟的负载:$load15_percent%"

  将上述脚本保存为 cpu_load.sh 文件,并使用 chmod +x cpu_load.sh 命令使其可执行。然后,执行 ./cpu_load.sh 命令即可运行该脚本,显示当前的CPU负载情况。

  请注意,该脚本仅计算CPU负载,它并不包括其他系统资源的负载。在实际应用中,可能需要更多的指标和算法来评估系统的整体负载情况,并根据需要进行适当的调整和优化。

解释上述脚本中的语法,以下是涉及到的主要部分的说明:

1. `#!/bin/bash`:这是脚本的第一行,用于指定使用Bash作为脚本的解释器。

2. `$(command)`:这是命令替换的语法,它会执行括号中的命令并将其输出结果插入到脚本中。

3. `grep -c ^processor /proc/cpuinfo`:此命令使用grep来计算/proc/cpuinfo文件中
    以"processor"开头的行的数量,从而获取CPU核心数。

4. `uptime`:此命令显示系统的运行时间和当前的负载平均值。

5. `awk -F 'load average:' '{print $2}'`:这个awk命令根据"load average:"字段作为
    分隔符,提取uptime命令输出的负载平均值。

6. `echo $load_average | awk -F ',' '{print $1*100}' | awk '{print int($1)}'`:这个
    管道命令将负载平均值中的各个时间段分隔开,并将其转换为整数格式。

7. `awk "BEGIN {printf \"%.2f\n\", $load1 / $num_cores}"`:这个awk命令用于计算负载
    占用的百分比,其中`%.2f`表示输出为小数点后两位。

9. `echo`:这是一个用于打印输出的命令,用于显示计算得到的负载值。

	需要注意的是,该脚本只是一个简单的示例,对负载的计算并不完整。在实际应用中,可能需要
针对具体需求进行更详细的计算和分析。同时,此脚本依赖于`/proc/cpuinfo``uptime`等系统
文件和命令,因此在特定的系统环境中可能会有差异。

四、top命令详解

一个主控SOC的命令结果
------------------ 主控SOC的命令结果
在这里插入图片描述
------------------ PC运行Ubuntu 20.04的命令结果

  top 命令是 Linux 系统中一个常用的性能监控工具,它提供了实时查看系统资源使用情况的功能。下面是 top 命令的详细说明:

  1. 启动 top 命令:
   在终端中输入 `top` 命令后,系统会显示实时的系统资源使用情况。默认情况下,它会按照 CPU
使用率对进程进行排序。
  1. 查看系统概述(Summary):
   `top` 命令的顶部显示了系统的概述信息,包括运行时间、负载平均值、总体 CPU 使用率、内存
使用情况等。这些信息可以帮助你快速了解系统的整体状态。
  1. 查看进程列表:
   `top` 命令默认以进程列表的形式显示当前运行的进程。每个进程都有一个独立的行,包括进程ID
(PID)、用户、CPU 使用率、内存使用情况、进程状态等信息。按下键盘上的 `Shift + M` 可以
按照内存使用率进行排序。
  1. 切换排序方式:
`top` 命令中,你可以按下不同的键来切换排序方式,以便更好地了解进程的性能。
   - `P`:按 CPU 使用率进行排序。
   - `M`:按内存使用率进行排序。
   - `N`:按 PID 进程 ID 进行排序。
   - `T`:按运行时间进行排序。
  1. 控制进程显示:
   `top` 命令提供了一些控制选项,以便筛选和显示特定的进程。
   - `u` + 用户名:仅显示指定用户运行的进程。
   - `s`:更改进程刷新的时间间隔。
   - `k` + PID:向进程发送信号以终止或关闭进程。
   - `H`:显示线程而不是进程。
  1. 查看全局信息:
`top` 命令运行时,你可以按下不同的键来查看特定资源的全局信息。
   - `1`:显示每个 CPU 核心的使用情况。
   - `l`:切换显示进程或线程所使用 CPU 的模式。
   - `t`:查看任务和 CPU 相关的细节。
   - `m`:查看内存总结。
   - `f`:添加或删除要显示的字段。

  top 命令提供了更多的选项和功能,可以根据你的需求进一步探索。输入 man top 命令可以查看其详细的手册页,其中包含了所有支持的选项和用法。

#########!!!水平有限,欢迎各位在评论区指导交流!!!########

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

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

相关文章

ArrayList和LinkedList

ArrayList的注意事项 1、在ArrayList中可以放任意元素,包括空值,任何元素,且可重复添加。 2、ArrayList底层是由数组来实现数据存储的 3、ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高),看源码 在多线程的…

【Linux系列P7】进度条小程序的深度解剖(细节满满)

​​​​​ ​ 前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读&am…

SpringBoot项目中MVC使用--【SB系列之010】

SpringBoot系列文章目录 SpringBoot 的项目编译即报错处理–SB系列之001 —第一部的其它章节可以通过001链接 SpringBoot项目中WEB页面放哪里–【SB系列之008】 SpringBoot项目中WEB与Controller的联系–【SB系列之009】 ———————————————— 文章目录 SpringBoo…

线程池学习(五)线程工厂、线程池工厂

Executors 定义的Executor, ExecutorService, ScheduledExecutorService, ThreadFactory和Callable类的工厂和实用程序方法,我们称为线程池工厂。ThreadFactory 为定制化创建新线程的对象,我们称为线程工厂 前面几期的学习中,我已经初步会使用线程池了&…

用于公司文件防泄密用的保密软件(企业数据防泄密软件)

防止公司文件泄露是指采取各种措施和方法,以防止公司的敏感和机密文件被未经授权的人员获取、泄露或滥用的行为。 这些文件可能包含公司的商业机密、客户数据、财务信息、研发成果等重要资料,如果泄露给竞争对手、黑客或其他恶意人员,可能会对…

未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。

offiice64位的按装名字短的,office32位的安装名字长的 安装32位的AccessDatabaseEngine.exe,如果使用64位office点击安装32位access时提示无法安装,此时需要: 1.WINR打开运行,输入CMD,进入安装包文件夹 …

AHD模拟高清方案汇总及国产替代方案

由于模拟高清方案对比LVDS数字高清方案在降本、远距离传输的优势明显,及实现方案相对简单,模拟相机一直在车载和安防监控产品上有着较重要的市场地位。伴随着ZM贸易战和境外疫情影响愈来愈趋于严重化,原有外来品牌公司模拟高清方案在产品交期…

LeetCode 75 第五题(345)反转字符串中的元音字母

题目: 示例: 分析: 给一个字符串,将里面的元音字母反转,并且保持非元音字母不变(包括顺序). 字符串反转类型的题,我们都可以使用双指针来解决:定义首尾指针,分别向中间靠拢,直到首尾指针都指向了元音字母,然后交换首尾指针所指的字母,如此不会影响到非元音字母,同时也将元音字…

【4】Vite+Vue3左右容器中相同属性的元素内容自动对齐

在当今前端开发的领域里,快速、高效的项目构建工具以及使用最新技术栈是非常关键的。ViteVue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。 作为下一代前端构建工具,Vite 在开发中的启动速度和热重载方面具有突…

【运维小知识】(四)——linux常用命令

运维专栏:运维小知识 目录 1.🍁🍁用mv命令修改文件名 2.🍃🍃创建及删除文件夹即文件夹下所有文件 3.🍂🍂移动文件夹并重命名 4.🌿🌿复制文件 5.🍄&#x…

Redis相关配置(3)

⭐ 作者简介:码上言 ⭐ 代表教程:Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容:个人博客系统 ⭐我的文档网站:http://xyhwh-nav.cn/ 文章目录 Redis相关配置1、units2、Include3、loadmodule 加载模块4、NET…

MySQL-多表设计-一对多

多表的设计-概述 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种: 一…

【PostgreSQL内核学习(二)—— 查询分析】

查询分析 查询处理查询分析查询处理与查询分析的关系查询分析执行流程Lex和YaccLex:Yacc:词法分析工具Lex语法分析工具Yacc使用Lex和Yacc的案例 词法和语法分析以SELECT语句为例讲解 PostgreSQL中查询语句如何被解析并生成分析树。 语义分析 声明&#x…

【Vue面试题系列】四

VNode有哪些属性? Vue内部定义的Vnode对象包含了以下属性: __v_isVNode: true,内部属性,有该属性表示为Vnode __v_skip: true,内部属性,表示跳过响应式转换,reactive转换时会根据此属性进行判断…

黑马B站视频JAVA部分的知识范围、学习步骤详解

文章目录 学习资源选择最后选择 JAVA的知识范围JDBCswing与JAVAFX JAVA的学习步骤1.右侧的部分:2 JAVA的高级但是必须要学的3 有一些要学(部分)4力扣 总结作业配套资源 学习资源选择 我从画面(一定要看清代码)声音(清…

金融中的数学:概率分布(上)

概率分布是描述随机变量可能取值的概率的函数。它可以用来描述离散变量和连续变量的概率分布。对于离散变量的概率分布,我们称其为离散概率分布。对于连续变量的概率分布,我们称其为连续概率分布。本文主要介绍离散型概率分布。 1.离散型均匀…

华为ospf路由协议在局域网中的高级应用案例

关键配置: 1、出口为ospf区域0,下联汇聚依次区域1、2…,非骨干全部为完全nssa区域 2、核心(abr)上对非骨干区域进行路由汇总,用于解决出口两台路由的条目数量 3、ospf静默接口配置在汇聚下联接接入交换机的…

ngAfterViewInit( ) to early /// ngFor和异步网络请求导致无法选中目标元素的问题

今天遇到的最无语的问题: angular 8版本以上,我在ngafterViewInit()中选取元素选取不到,加上setTimeOut()之后才可以选中 网上的解释: Angular的ngAfterViewInit生命周期钩子是在组…

uniapp | 查看ios打包后的Info.plist文件

最近在用 uni 开发 ios 的时候给项目添加了自定义的 Info.plist 文件,但是打包后发现并没有生效,才有了查看打包后的 Info.plist 文件想法。 HBuilderX3.6.5起,支持直接在应用项目中配置 iOS 平台的 Info.plist 和 资源文件(Bundl…

使用 uiautomator2+pytest+allure 进行 Android 的 UI 自动化测试

目录 前言: 介绍 pytest uiautomator2 allure 环境搭建 pytest uiautomator2 allure pytest 插件 实例 初始化 driver fixture 机制 数据共享 测试类 参数化 指定顺序 运行指定级别 重试 hook 函数 断言 运行 运行某个文件夹下的用例 运行某…