9:51 am
Thursday, 3 November 2022 (HKT)
Time in Hong Kong


获取

在线CPU

1
2
cat /sys/devices/system/cpu/online
0-7

PPM使能

性能管理模块

1
2
3
4
5
cat /proc/ppm/enabled
ppm is enabled

echo 0 > /proc/ppm/enabled
ppm is disabled

CPU频率(proc)

1
2
cat /proc/cpufreq/MT_CPU_DVFS_L/cpufreq_freq
cat /proc/cpufreq/MT_CPU_DVFS_LL/cpufreq_freq
1
2
3
4
5
cat /proc/cpufreq/MT_CPU_DVFS_L/cpufreq_freq
1326000 KHz

cat /proc/cpufreq/MT_CPU_DVFS_LL/cpufreq_freq
793000 KHz

proc节点优先级可能(通常,平台差异)低于thermal

CPU频率(sys)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ls /sys/devices/system/cpu
cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpufreq cpuidle cputopo eas hotplug isolated kernel_max modalias offline online possible power present rq-stats sched sched_isolated uevent

cd /sys/devices/system/cpu

cat cpu[0-7]/cpufreq/cpuinfo_cur_freq
1508000
1508000
1508000
1508000
1846000
1846000
1846000
1846000

CPU档位OPPidx(频点)

1
2
cat /proc/cpufreq/MT_CPU_DVFS_L/cpufreq_oppidx
cat /proc/cpufreq/MT_CPU_DVFS_LL/cpufreq_oppidx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
cat /proc/cpufreq/MT_CPU_DVFS_L/cpufreq_oppidx

[MT_CPU_DVFS_L/4]
cpufreq_oppidx = 15
0 (1989000, 103125)
1 (1924000, 101875)
2 (1846000, 99375)
3 (1781000, 98125)
4 (1716000, 96250)
5 (1677000, 94375)
6 (1625000, 92500)
7 (1586000, 91250)
8 (1508000, 88750)
9 (1417000, 86250)
10 (1326000, 83750)
11 (1248000, 81250)
12 (1131000, 78750)
13 (1014000, 76250)
14 (910000, 73750)
15 (793000, 71250)

cat MT_CPU_DVFS_LL/cpufreq_oppidx

[MT_CPU_DVFS_LL/0]
cpufreq_oppidx = 13
0 (1989000, 93750)
1 (1924000, 92500)
2 (1846000, 90000)
3 (1781000, 88750)
4 (1716000, 87500)
5 (1677000, 85625)
6 (1625000, 83750)
7 (1586000, 82500)
8 (1508000, 80000)
9 (1417000, 77500)
10 (1326000, 75000)
11 (1248000, 71875)
12 (1131000, 69375)
13 (1014000, 66250)
14 (910000, 63125)
15 (793000, 60000)
  • 输出解析:
1
2
3
[CPU名称_核心簇/CPUID]
cpufreq_oppidx = 目前使用的opp档位
档位 (频率, 供电电压uV)

簇分为LL、L、B。CPUID一般是每个簇中的第一个CPU的ID。

如4+4的CPU中,会有两个簇分别是MT_CPU_DVFS_LL(CPU0-3)和MT_CPU_DVDS_L(CPU4-7),其id分别使用每个簇的第一个CPU即0和4。

OPP即CPU能够“挂得上的档”,包含一个频率和对应的供电电压(uV)

由上可见该CPU的大小核的最高频率相同(不代表实际性能相同),但是供电差异较大

CPU和高速缓存电压

1
2
3
cat /proc/cpufreq/MT_CPU_DVFS_L/cpufreq_volt
Vproc: 812500 uV
Vsram: 912500 uV

CPU算力

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat /sys/devices/system/cpu/cpu4/cpu_capacity /sys/devices/system/cpu/cpu0/cpu_capacity

1024
604

cd /sys/devices/system/cpu

find cpu*/cpu_capacity | xargs cat
604
604
604
604
1024
1024
1024
1024

支持的调频策略

1
2
3
cat cpu[04]/cpufreq/scaling_available_governors
ondemand userspace powersave performance schedutil
ondemand userspace powersave performance schedutil

正在使用的调频策略

1
2
3
cat cpu[04]/cpufreq/scaling_governor
schedutil
schedutil

调频驱动

1
2
3
cat cpu[04]/cpufreq/scaling_driver
mt-cpufreq
mt-cpufreq

当前启用的核心

1
2
3
cat /proc/ppm/policy/ut_fix_core_num
cluster 0 fix core num = -1
cluster 1 fix core num = 1
  • 输出解析:
1
2
 0 指定使用核心个数 = -1
1 指定使用核心个数 = 1

-1表示不做任何指定,默认启用所有核心

当前固定的频率

1
2
3
cat /proc/ppm/policy/ut_fix_freq_idx
cluster 0 fix freq idx = -1
cluster 1 fix freq idx = -1
  • 输出解析:
1
2
 0 指定频点索引 = -1
1 指定频点索引 = 0

-1表示不做任何指定,系统会由调频管理程序自动根据当前工作负载选择合适的档位

数字不为-1时忽略调度程序,指定要求该簇(簇中的全部核心)工作到指定档位(但是可能被优先级更高的调度程序、设置、温度/功耗策略影响)

设置

1
/proc/ppm/policy

开关CPU核心个数

开、关掉一些CPU核心。

1
2
3
4
5
echo 2 1 > /proc/ppm/policy/ut_fix_core_num

cat /proc/ppm/policy/ut_fix_core_num
cluster 0 fix core num = 2
cluster 1 fix core num = 1
  • 效果,小核簇(簇0)之CPU2、3下线,大核簇(簇1)之CPU5、6、7下线:
1
2
3
4
5
6
7
8
cat /sys/devices/system/cpu/online
0-1,4

Mem: 1555028K used, 2402960K free, 0K shrd, 4040146952K buff, 1432K cached
CPU0: 76.1% usr 23.8% sys 0.0% nic 0.0% idle 0.0% io 0.0% irq 0.0% sirq
CPU1: 88.5% usr 11.4% sys 0.0% nic 0.0% idle 0.0% io 0.0% irq 0.0% sirq
CPU2: 98.8% usr 1.1% sys 0.0% nic 0.0% idle 0.0% io 0.0% irq 0.0% sirq
Load average: 28.04 26.40 24.93 7/1432 12912

echo送入的数字个数取决于处理器具有多少个簇(Cluster),一般大+小核处理器为2,超大+大+小核处理器为3。

  • 设置为-1恢复默认
1
echo -1 -1 > /proc/ppm/policy/ut_fix_core_num
  • 命令解析:
1
echo 簇0允许使用的核心数 簇1允许使用的核心数 > /proc/ppm/policy/ut_fix_core_num

定频

定频,固定CPU频率(频点),固定到具体档位。频率的档位,即频点,为OPP index,故固定频率实际上是强制将CPU挂至对应的各个index。

1
2
3
4
5
echo 0 -1 > /proc/ppm/policy/ut_fix_freq_idx

cat /proc/ppm/policy/ut_fix_freq_idx
cluster 0 fix freq idx = 0
cluster 1 fix freq idx = -1
  • 命令解析:
1
echo 簇0档位 簇1档位 > /proc/ppm/policy/ut_fix_freq_idx
  • 效果,命令要求将簇0(小核簇)内的所有CPU运行在最高频率:
1
2
3
4
5
6
7
8
9
ls /sys/devices/system/cpu/cpu[0-7]/cpufreq/cpuinfo_cur_freq | xargs cat
1989000
1989000
1989000
1989000
1248000
1248000
1248000
1248000

可见,簇0的所以CPU(CPU0-4)全部工作在最高频率

绑核

将指定的进程绑定到一个或一些CPU上。

1
2
3
taskset -ap MASK PID

taskset -p MASK PID

相关源码

1
kernel-4.14/drivers/misc/mediatek/base/power/ppm_v3/src
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
enum mt_cpu_dvfs_id {
MT_CPU_DVFS_LL,
MT_CPU_DVFS_L,
MT_CPU_DVFS_B,
MT_CPU_DVFS_CCI,
NR_MT_CPU_DVFS,
};

enum mt_dvfs_debug_id {
DEBUG_FREQ_CLUSTER0,
DEBUG_FREQ_CLUSTER1,
DEBUG_FREQ_CLUSTER2,
DEBUG_FREQ_ALL,
DEBUG_FREQ_DISABLED = 100,
};
  • cpufreq_freq proc节点
1
2
cpufreq_freq_proc_show()
cpufreq_freq_proc_write()
  • cpufreq_oppidx proc节点
1
2
3
4
mtk_cpufreq_interface.c

cpufreq_oppidx_proc_show()
cpufreq_oppidx_proc_write()
  • 定频、核数开关
1
2
3
4
5
6
7
8
9
mtk_ppm_policy_ut.c

# 核数
ppm_ut_fix_core_num_proc_show()
ppm_ut_fix_core_num_proc_write()

# 定频:读取设置、更新设置
ppm_ut_fix_freq_idx_proc_show()
ppm_ut_fix_freq_idx_proc_write()

术语

术语 说明
DVFS Dynamic Voltage and Frequency Scaling 通过调整CPU频率、电压来匹配工作负载,取得节能目的的技术
freq Frequency 频率
OPP Operating Performance Points 频点、频率档位
PPM Power Policy Manager
oppidx OPP的Index 各档位的频率对应为一个index, 0对应最高频率
LL 小核
L 大核
B 超大核
Jade BIG.LITTLE架构的CPU(大小端模式)
Everest 小核-大核-超大核架构的CPU
Olympus 小核-大核架构的CPU
Cluster CPU簇;CPU的几个核心在同一簇中管理,一个CPU可能有多个簇,一般将效能核、性能核、超大核分别分入一个簇中

调频策略

策略名称 说明
performance 运行于最大频率
powersave 运行于最小频率
userspace 运行于用户指定的频率
ondemand 按需快速动态调整CPU频率, 一有cpu计算量的任务,就会立即达到最大频率运行; 空闲时间占比增加则降低频率
conservative 按需快速动态调整CPU频率,比 ondemand 的调整更保守,不会迅速达到最大频率
schedutil 由调度程序管理