Linux内核《CPU负载计算》

前言

  在实际的产品开发中,我们往往需要关注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 命令可以查看其详细的手册页,其中包含了所有支持的选项和用法。

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

猜你喜欢

转载自blog.csdn.net/weixin_45842280/article/details/131798176