2 分钟阅读 次阅读

1 CPU

三个 policy 的对应关系

cpufreq policy 对应 CPU 编号 核心类型 最高主频
policy0 CPU0–CPU3 4× Cortex-A55(小核) 1.8 GHz
policy4 CPU4–CPU5 2× Cortex-A76(大核) 2.4 GHz
policy6 CPU6–CPU7 2× Cortex-A76(大核) 2.4 GHz

查看 CPU 的策略组

cat /sys/devices/system/cpu/cpufreq/policy*/related_cpus

输出

0 1 2 3
4 5
6 7

查看当前调频策略

cat /sys/devices/system/cpu/cpufreq/policy*/scaling_governor

查看可用的调频策略

cat /sys/devices/system/cpu/cpufreq/policy*/scaling_available_governors
  • conservative:根据 CPU 负载动态调频,按一定的比例平滑的升高或降低频率。
  • ondemand:根据 CPU 负载动态调频,调频幅度比较大,可直接调到最高频或最低频。
  • interactive:根据 CPU 负载动态调频,相比 ondemand,响应时间更快,可配置参数更多,更灵活。
  • userspace:提供相应接口供用户态应用程序调整频率。
  • powersave:功耗优先,始终将频率设置在最低值。
  • performance:性能优先,始终将频率设置为最高值。
  • schedutil:EAS 使用 governor。EAS(Energy Aware Scheduling)是新一代的任务调度策略, 结合 CPUFreq和 CPUIdle 的策略, 在为某个任务选择运行 CPU 时, 同时考虑了性能和功耗, 保证了系统能耗最低,并且不会对性能造成影响。 Schedutil 调度策略就是专门给 EAS 使用的 CPU 调频策略

查看可用的频率

cat /sys/devices/system/cpu/cpufreq/policy*/scaling_available_frequencies

自定义策略

  • 设置为性能策略:
    echo performance > /sys/devices/system/cpu/cpufreq/policy*/scaling_governor
    

自定义频率

  • 以policy0为例 ```bash

    将策略调整为 userspace

    echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor

查看 CPU 可用频率

cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies

设置频率(设置为600MHz)

echo 600000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed


## 2 GPU
### 查看当前的GPU的调度策略
```bash
cat /sys/class/devfreq/fb000000.gpu/governor

查看支持的GPU的调度策略

cat /sys/class/devfreq/fb000000.gpu/available_governors
  • simple ondemand:根据负载动态调频。
  • userspace:提供相应接口供用户态应用程序调整频率。
  • powersave:功耗优先,始终将频率设置在最低值。
  • performance:性能优先,始终将频率设置为最高值。
  • dmc_ondemand:虽然 GPU 的可用策略里显示了 dmc_ondemand,但实际上它无法使用。强行写入会导致内核crash除了CPU,其他所有支持动态调频的外设(如 GPU、NPU、DMC/内存控制器、甚至某些存储接口)都归 devfreq(Device Frequency)子系统管。当内核或者驱动向系统注册一个 devfreq 策略(Governor)时,这个策略会被添加到一个全局的策略池中。当通过 cat …/available_governors 查看可用策略时,devfreq 框架并没有做严格的设备分类过滤,而是直接把全局策略池里的所有策略全部打印了出来。

GPU调度策略设置

echo performance > /sys/class/devfreq/fb000000.gpu/governor

GPU定频策略设置

# 将策略调整为 ``userspace``
echo userspace > /sys/class/devfreq/fb000000.gpu/governor

# 查看 CPU 可用频率
cat /sys/class/devfreq/fb000000.gpu/available_frequencies

# 设置频率(设置为400MHz)
echo 400000000 > /sys/class/devfreq/fb000000.gpu/userspace/set_freq

3 DMC

列出DDR当前的调度模式

cat /sys/class/devfreq/dmc/governor

列出DDR支持的调度模式

cat /sys/class/devfreq/dmc/available_governors
  • simple ondemand:根据负载动态调频。
  • userspace:提供相应接口供用户态应用程序调整频率。
  • powersave:功耗优先,始终将频率设置在最低值。
  • performance:性能优先,始终将频率设置为最高值。
  • dmc_ondemand:simple ondemand 的基础上,增加场景变频的支持,DDR 变频专用。

DDR调度策略设置

echo performance > /sys/class/devfreq/dmc/governor

DDR定频策略设置

# 将策略调整为 ``userspace``
echo userspace > /sys/class/devfreq/dmc/governor

# 查看 CPU 可用频率
cat /sys/class/devfreq/dmc/available_frequencies

# 设置频率(设置为1560MHz)
echo 1560000000 > /sys/class/devfreq/dmc/userspace/set_freq

4 NPU

查看NPU当前的调度模式

cat /sys/class/devfreq/fdab0000.npu/governor

查看NPU支持的调度模式

cat /sys/class/devfreq/fdab0000.npu/available_governors

查看NPU当前频率

cat /sys/class/devfreq/fdab0000.npu/cur_freq

NPU调度策略设置

echo performance | tee /sys/class/devfreq/fdab0000.npu/governor

NPU定频策略设置

#手动切换 userspace模式
echo userspace > /sys/class/devfreq/fdab0000.npu/governor

#设置频率1GHz
echo 1000000000 > /sys/class/devfreq/fdab0000.npu/userspace/set_freq

查看频率是否成功设置
cat /sys/class/devfreq/fdab0000.npu/cur_freq

5 一键查看策略频率脚本

vim check_freq.sh
  • 填入下面的代码 ```bash #!/bin/bash

颜色定义,让输出更好看

BLUE=’\033[1;34m’ NC=’\033[0m’ # 恢复默认颜色

echo -e “${BLUE}=================== CPU 状态 ===================${NC}” if ls /sys/devices/system/cpu/cpufreq/policy* 1> /dev/null 2>&1; then echo -e “[可用策略]: \t $(cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors 2>/dev/null)” echo -e “[当前策略]: \t $(cat /sys/devices/system/cpu/cpufreq/policy/scaling_governor 2>/dev/null | tr ‘\n’ ‘ ‘)” echo -e “[当前频率(kHz)]: $(cat /sys/devices/system/cpu/cpufreq/policy/scaling_cur_freq 2>/dev/null | tr ‘\n’ ‘ ‘)” else echo “未找到 CPU 调频节点” fi

echo -e “\n${BLUE}=================== GPU 状态 ===================${NC}” if [ -d /sys/class/devfreq/fb000000.gpu ]; then echo -e “[可用策略]: \t $(cat /sys/class/devfreq/fb000000.gpu/available_governors 2>/dev/null)” echo -e “[当前策略]: \t $(cat /sys/class/devfreq/fb000000.gpu/governor 2>/dev/null)” echo -e “[当前频率(Hz)]: \t $(cat /sys/class/devfreq/fb000000.gpu/cur_freq 2>/dev/null)” else echo “未找到 GPU 调频节点” fi

echo -e “\n${BLUE}=================== NPU 状态 ===================${NC}” if [ -d /sys/class/devfreq/fdab0000.npu ]; then echo -e “[可用策略]: \t $(cat /sys/class/devfreq/fdab0000.npu/available_governors 2>/dev/null)” echo -e “[当前策略]: \t $(cat /sys/class/devfreq/fdab0000.npu/governor 2>/dev/null)” echo -e “[当前频率(Hz)]: \t $(cat /sys/class/devfreq/fdab0000.npu/cur_freq 2>/dev/null)” else echo “未找到 NPU 调频节点” fi

echo -e “\n${BLUE}=================== DMC 状态 ===================${NC}” if [ -d /sys/class/devfreq/dmc ]; then echo -e “[可用策略]: \t $(cat /sys/class/devfreq/dmc/available_governors 2>/dev/null)” echo -e “[当前策略]: \t $(cat /sys/class/devfreq/dmc/governor 2>/dev/null)” echo -e “[当前频率(Hz)]: \t $(cat /sys/class/devfreq/dmc/cur_freq 2>/dev/null)” else echo “未找到 DMC 调频节点” fi echo -e “\n” ```

留下评论