背景
Read the fucking source code!
--By 鲁迅A picture is worth a thousand words.
--By 高尔基
说明:
- Kernel版本:4.14
- ARM64处理器,Contex-A53,双核
- 使用工具:Source Insight 3.5, Visio
1. 概述
CPU负载(cpu load
)指的是某个时间点进程对系统产生的压力。来张图来类比下(参考Understanding Linux CPU Load)
- CPU的运行能力,就如大桥的通行能力,分别有满负荷,非满负荷,超负荷等状态,这几种状态对应不同的cpu load值;
- 单CPU满负荷运行时cpu_load为1,当多个CPU或多核时,相当于大桥有多个车道,满负荷运行时cpu_load值为CPU数或多核数;
- CPU负载的计算(以单CPU为例),假设一分钟内执行10个任务代表满负荷,当一分钟给出30个任务时,CPU只能处理10个,剩余20个不能处理,cpu_load=3;
在实际系统中查看:
cat /proc/cpuinfo
:查看CPU信息;cat /proc/loadavg
:查看cpu最近1/5/15分钟的平均负载:
计算CPU负载,可以让调度器更好的进行负载均衡处理,以便提高系统的运行效率。此外,内核中的其他子系统也可以参考这些CPU负载值来进行相应的调整,比如DVFS
等。
目前内核中,有以下几种方式来跟踪CPU负载:
- 全局CPU平均负载;
- 运行队列CPU负载;
PELT(per entity load tracking)
;
这也是本文需要探讨的内容,开始吧。
2. 全局CPU平均负载
2.1 基础概念
先来明确两个与CPU负载计算相关的概念:
active task(活动任务)
:只有知道活动任务数量,才能计算CPU负载,而活动任务包括了TASK_RUNNING
和TASK_UNINTERRUPTIBLE
两类任务。包含TASK_UNINTERRUPTIBLE
任务的原因是,这类任务经常是在等待I/O请求,将其包含在内也合理;NO_HZ
:我们都知道Linux内核每隔固定时间发出timer interrupt
,而HZ
是用来定义1秒中的