CPU Freq使用参考


1. 概述

正如 Windows 系统下用户可以根据使用场景自行更换 Windows 系统的电源管理策略,Linux 系统同样也有提供电源管理策略供用户设置和修改。本文主要阐述如何在用户空间使用 CPU Frequency Framework 调整 CPU 频率,不涉及驱动的编写及代码分析。

2. 使用CPU Freq

2.1. 用户层接口

Linux 系统 CPU Frequency Framework 用户层接口操作的文件主要在:

1. cd sys/devices/system/cpu/

该文件夹下会根据系统 CPU 数量生成对应的文件夹,如当前我使用的系统包含两颗 CPU,该目录下的文件结构为:

1.  /sys/devices/system/cpu # ls  
2.  cpu0        cpufreq     kernel_max  online      present  
3.  cpu1        isolated    offline     possible    uevent

在 SMP SoC 系统,不同 CPU 的 Frequency 的设置是同步的,所以操作 CPU0 文件夹下的文件 CPU1 文件夹下的文件会相应被更改,本文以操作 CPU0 文件夹文件为例进行讲解:

1. cd cpu0/cpufreq/

该文件夹下的文件结构为:

1.  /sys/devices/system/cpu/cpufreq/policy0 # ls  
2.  affected_cpus                  scaling_cur_freq  
3.  cpuinfo_cur_freq               scaling_driver  
4.  cpuinfo_max_freq               scaling_governor  
5.  cpuinfo_min_freq               scaling_max_freq  
6.  cpuinfo_transition_latency     scaling_min_freq  
7.  related_cpus                   scaling_setspeed  
8.  scaling_available_frequencies  stats  
9.  scaling_available_governors

各个文件的操作权限及含义如下表:

文件名 权限 文件含义
affected_cpus RO 需要软件协调频率的 CPU 列表
cpuinfo_cur_freq RO CPU 当前频率与scaling_cur_freq 相同
cpuinfo_max_freq RO CPU 支持的最高频率
cpuinfo_min_freq RO CPU 支持的最低频率
cpuinfo_transition_latency RO CPU 转换频率所需要的时间(单位:ns)
related_cpus RO 需要软件或硬件协调频率的 CPU 列表
scaling_available_frequencies RO 获取支持的频率
scaling_available_governors RO 获取支持的电源管理策略
scaling_cur_freq RO CPU 当前频率与cpuinfo_cur_freq相同
scaling_driver RO 获取驱动名称
scaling_governor RW 获取或设置电源管理策略
scaling_max_freq RW 获取或设置允许调节的最大频率(单位:kHz)
scaling_min_freq RW 获取或设置允许调节的最小频率(单位:kHz)
scaling_setspeed RW 获取或设置当前频率(单位:kHz)

注:设置 scaling_max_freq 和 scaling_min_freq 时,如果设置的scaling_max_freq 小于 scaling_min_freq 会造成设置失败,建议优先设置 scaling_max_freq 。

电源管理策略 策略内容
userspace 由用户空间程序通过scaling_setspeed文件修改频率
powersave 功耗优先策略,直接将频率设置为允许的最小值
ondemand 根据CPU的当前使用率,动态的调节CPU频率
performance 性能优先策略,直接将频率设置为允许的最大值

2.2. 应用举例

将 CPU 频率设置为 1GHz:

1.  cd sys/devices/system/cpu/cpu0/cpufreq/  
2.  echo userspace > scaling_governor  
3.  echo 1200000 > scaling_max_freq  
4.  echo 400000 > scaling_min_freq  
5.  echo 1000000 > scaling_setspeed  
6.  cat scaling_cur_freq

在设置后建议再次 cat 确认设置是否生效。