SkylarkOS 动态调频使用指南

优质
小牛编辑
132浏览
2023-12-01

简介

DVFS全称Dynamic Voltage and Frequency Scaling,即动态电压频率调整。这项技术可以根据芯片运行的应用程序的计算需求,动态调整电压和频率,从而达到节能的目的。

DVFS技术是一项需要软硬件结合的技术,硬件方面比如Intel的SpeedStep技术以及由此衍生的EIST技术,ARM的IEM和AVS技术等。软件方面对于Linux而言主要就是CPUfreq。

CMOS电路中分为动态功耗和静态功耗,公式为 power=Σ(CV²αf + VI)。 C 代表负载电容的容值,V 是工作电压,α 是当前频率下的翻转率,f为工作频率,I代表静态电流。公式中加号前面部分代表动态功耗,后半部分代表静态功耗。要想降低动态功耗的话,需要从C/α/V/f几个参数入手,而对于软件而言,通常可以调节的只有V和f。

Linux对频率的管理策略

目前Linux上通用的策略有五种

策略名策略说明
performaceCPU固定工作在其支持的最高运行频率上
powersaveCPU固定工作在其支持的最低运行频率上
ondemandondemand策略是一个动态策略,它允许CPU在系统负载较高时使用最大时钟频率,并且在系统闲置时使用最小时钟频率。虽然这允许系统相对于系统负载相应地调整功耗,但是这是以牺牲频率切换之间的延迟为代价的。因此,如果系统经常在空闲和繁重的工作负载之间切换,延迟可以抵消任何性能与按需调速器提供的节能优势。
userspace用户空间管理器允许用户空间程序(或任何以root身份运行的进程)设置频率。这个调控器通常与cpuspeed守护进程一起使用。在所有的策略中,用户空间是最具可定制性的;并且取决于它如何配置,它可以为系统提供性能和消耗之间的最佳平衡。
conservative与ondemand策略一样,conservative策略也根据使用情况调整时钟频率(ondemand策略)。然而,ondemand策略以更激进的方式(即从最大值到最小值和后退)来执行此操作,但conservative策略会逐渐在频率之间切换。

内核配置

make menuconfig

CPU Power Management  --->
    CPU Frequency scaling  --->
      [*] CPU Frequency scaling
         CPU frequency translation statistics
      [ ]     CPU frequency translation statistics details       
              Default CPUFreq governor (performance)  --->       
      -*-   'performance' governor                               
      < >   'powersave' governor                                 
      < >   'userspace' governor for userspace frequency scaling 
      < >   'ondemand' cpufreq policy governor                   
      < >   'conservative' cpufreq governor                      
            *** CPU frequency scaling drivers ***                
      < >   Generic DT based cpufreq driver                      
      [*]   LEO CPUFreq support                                  
      < >   CPU frequency scaling driver for Freescale QorIQ SoCs  
可以根据需要选择要开启的策略。 ## 应用层接口 与Linux动态频率调整相关的接口在以下目录
/sys/devices/system/cpu/cpufreq/policy0/
里面的文件如下:
root@OpenWrt:/sys/devices/system/cpu/cpufreq/policy0# ls -lah
drwxr-xr-x    3 root     root           0 Feb  5 06:08 .
drwxr-xr-x    3 root     root           0 Feb  5 06:08 ..
-r--r--r--    1 root     root        4.0K Feb  5 07:04 affected_cpus
-r--------    1 root     root        4.0K Feb  5 07:04 cpuinfo_cur_freq
-r--r--r--    1 root     root        4.0K Feb  5 07:04 cpuinfo_max_freq
-r--r--r--    1 root     root        4.0K Feb  5 07:04 cpuinfo_min_freq
-r--r--r--    1 root     root        4.0K Feb  5 07:04 cpuinfo_transition_latency
-r--r--r--    1 root     root        4.0K Feb  5 07:04 related_cpus
-r--r--r--    1 root     root        4.0K Feb  5 07:04 scaling_available_frequencies
-r--r--r--    1 root     root        4.0K Feb  5 07:04 scaling_available_governors
-r--r--r--    1 root     root        4.0K Feb  5 07:04 scaling_cur_freq
-r--r--r--    1 root     root        4.0K Feb  5 07:04 scaling_driver
-rw-r--r--    1 root     root        4.0K Feb  5 07:04 scaling_governor
-rw-r--r--    1 root     root        4.0K Feb  5 06:08 scaling_max_freq
-rw-r--r--    1 root     root        4.0K Feb  5 07:04 scaling_min_freq
-rw-r--r--    1 root     root        4.0K Feb  5 07:04 scaling_setspeed
drwxr-xr-x    2 root     root           0 Feb  5 07:04 stats

每个文件的作用在"内核文档":https://www.kernel.org/doc/Documentation/cpu-freq/user-guide.txt 中有描述:

文件作用
affected_cpus受影响的cpu核,对于单核cpu来说值为0,多核cpu值为受影响的核
cpuinfo_cur_freq从硬件获得的当前CPU频率,以KHz为单位。这是CPU实际运行的频率。
cpuinfo_max_freq此文件显示处理器可以运行的最低工作频率(以kHz为单位)
cpuinfo_min_freq此文件显示处理器可以运行的最高工作频率(以kHz为单位)
cpuinfo_transition_latencyCPU在两频率之间切换延时
related_cpus相关连的CPU核
scaling_available_frequencies可用的频率
scaling_available_governorsCPU在两频率之间切换延时
cpuinfo_transition_latency可用的策略
scaling_cur_freqCPU当前频率,由策略和cpufreq内核决定,以KHz为单位,这是内核认为CPU运行的频率
scaling_driver这个文件显示了什么cpufreq驱动程序用于设置该CPU的频
scaling_governor当前运行的策略,可用通过echo修改
scaling_max_freq显示当前的“策略限制”(以千赫兹为单位)。 通过在这些文件中写入新值,可以更改这些限制。 注意:设置策略时,需要先设置scaling_max_freq,然后设置scaling_min_freq。
scaling_setspeed读取该文件可已获取当前的编程值,修改该文件来改变由策略表示的一组CPU的当前频率。目前仅支持用户空间管理员。

使用方法

. 调整策略

  • 调整策略前可以先查看内核当前支持哪些策略:

    cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors 
    
  • 往scaling_governor文件写入内核支持的策略

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

. 调整频率

  • 当处于performance模式时,可用通过修改scaling_max_freq文件来调整频率
  • 调整频率前可以先查看内核当前支持哪些频率:

    cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies 
    
  • 往scaling_max_freq文件写入内核支持的频率

    echo 864000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq