cpu负载判断

前言


关于cpu的负载到底是什么?怎样判断cpu的负载到底是高还是低呢?实际上网上有很多不错的文章,但是个人还是喜欢用自己的语言简洁的描述一下,下面介绍的就是对于cpu负载的判断方法。



什么是cpu的负载?



我们都知道cpu是服务器的核心处理器。它就像是一条单向的道路,而系统运行的程序或者说进程就像是奔跑在该道路上的交通工具。

想象一下,负载就代表着在某一时间段上正在奔跑和准备使用cpu公路的汽车的数量。

当那些汽车的数量有很多的时候就代表着cpu公路的压力大,负载高,结果就是会造成堵车,大量汽车挤满了公路,得等前面的车跑完了,后面的车才能上,并且移动速度缓慢,这就是系统卡顿。再严重就是公路被压坏了,谁都走不了,这就是死机。而正常情况,应该是那些车辆的数量不高于cpu公路可承担的值,这就是正常的运行。




如何判断当前系统cpu的负载的高低?



在这里插入图片描述

【1】首先,要查看系统的平均负载(load average)。它是某段时间内占用cpu时间的进程和等待cpu时间的进程数,这里等待cpu时间的进程是指等待被唤醒的进程,不包括处于wait状态进程,而后面三个值分别代表系统在1分钟、5分钟和15分钟的负载情况。



【2】由于我们要查看的当前系统cpu的负载的高低,那么就要考虑cpu的数量及性能问题。这时要遵循两个原则:“有多少核心即为有多少负荷"和"核心的核心”。

“有多少核心即为有多少负荷”:在多核处理中,你的系统均值不应该高于处理器核心的总数量。

“核心的核心”: 不论核心分布在哪几颗cpu中,只需要计算核心的总数量即可。例如:两颗四核的cpu: 2*4=8 ,代表八个cpu内核。
cpu个数 x 核心数 = 总核心数

查看CPU的总核心数
grep -c 'model name' /proc/cpuinfo  

更多命令,链接如下:
https://blog.csdn.net/GX_1_11_real/article/details/81026999


【3】理论上每个核心的负荷不超过1.0,就代表系统在正常运行的范畴内。

即   平均负载 除以 总核心数 <= 1.0 

但是,实际上当这个值处于在 0.70 左右,为了避免负载持续飙升,怕cpu扛不住,就要开始对问题原因进行调查了;当系统负载时间处于1.00或者以上的时候,那么就应该马上解决这个问题。

即   平均负载 除以 总核心数 <= 0.7 

我们通常应该观察15分钟系统负载,然后再进行判断。因为如果1分钟的系统负荷大于1.0,而其他两个时间段都小于1.0,那么代表这只是暂时的;而观察15分钟内的系统负载仍大于1.0,则代表这个问题是持续的,需要进行解决。



备注:

sar查看cpu操作,请看下列链接:
https://blog.csdn.net/GX_1_11_real/article/details/81318197

<think>好的,用户想知道如何计算或监控单片机CPU负载情况。我需要结合提供的引用内容来组织回答。首先,引用3提到了基于定时器中断的负载率测试,使用空闲时间和总时间的比例来计算。然后引用2给出了CPU使用率的公式,即1减去空闲时间比例。接下来,我需要解释具体的实现步骤,比如初始化定时器、统计空闲时间、计算负载率。还要提到注意事项,比如is_cpu_idle函数的实现、中断频率的影响。可能需要引用提到的源码结构,说明关键部分。最后,生成相关问题,比如优化方法、应用场景等。确保使用正确的LaTeX格式,比如公式用$$包围,行内变量用$。需要结构清晰,分步骤说明,同时引用相关的引用标记。</think>以下是关于单片机CPU负载计算与监控的技术实现方法,分步骤说明如下: ### 一、核心计算公式 CPU负载率可通过统计空闲时间与总时间的比例得出: $$ \text{负载率} = \left(1 - \frac{\text{空闲态运行时间}}{\text{总运行时间}}\right) \times 100\% $$ [^2] ### 二、技术实现步骤 1. **定时器初始化** 配置硬件定时器产生周期性中断(如1ms周期),用于时间片分割。示例代码: ```c void Timer_Init() { TMOD |= 0x01; // 16位定时器模式 TH0 = 0xFC; // 1ms中断周期 TL0 = 0x18; TR0 = 1; // 启动定时器 ET0 = 1; // 允许中断 EA = 1; // 全局中断使能 } ``` 2. **空闲状态检测** 在定时器中断服务程序中统计空闲时间: ```c volatile uint32_t idle_count = 0, total_count = 0; void Timer0_ISR() interrupt 1 { total_count++; // 总时间计数 if(is_cpu_idle()) idle_count++; // 空闲检测 TH0 = 0xFC; // 重装定时值 TL0 = 0x18; } ``` 3. **负载率计算** 按固定周期(如1秒)输出计算结果: ```c float Get_CPU_Load() { float load = 100.0f * (1 - (float)idle_count/total_count); idle_count = total_count = 0; // 重置计数器 return load; } ``` ### 三、关键实现细节 1. **空闲状态判断** `is_cpu_idle()`函数需根据具体系统实现,常见方法包括: - 检测空闲任务标志位 - 监控任务调度队列状态 - 轮询外设操作状态[^3] 2. **中断周期选择** 建议选择1-10ms周期,精度与系统开销需平衡。高频中断(如<0.1ms)可能导致额外负载误差[^3] 3. **误差修正方法** 可采用滑动窗口滤波: $$ \text{Load}_{avg} = \alpha \cdot \text{Load}_{current} + (1-\alpha) \cdot \text{Load}_{prev} $$ 其中$\alpha$为平滑系数(推荐0.2-0.5) ### 四、典型应用场景 1. 实时系统性能调优 2. 低功耗模式切换阈值检测 3. 任务调度策略验证 4. 系统异常状态预警
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漠效

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值