Linux 系统设置cpu频率

source_code: https://github.com/emagii/cpufrequtils

cpufreq-set - A small tool which allows to modify cpufreq settings.(修改内存频率的工具)

cpufreq-set allows you to modify cpufreq settings without having to type e.g. "/sys/devices/system/cpu/cpu0/cpufreq/scaling_set_speed" all the time.(不需要直接操作sysfs相关节点即可调整cpufreq).

OPTIONS

-c --cpu

number of CPU where cpufreq settings shall be modified.(cpu核心号)

复制代码
   -d --min <FREQ>
          new minimum CPU frequency the governor may select.(调控器可以选择新的最低 CPU 频率。)

   -u --max <FREQ>
          new maximum CPU frequency the governor may select.

   -g --governor <GOV>
          new cpufreq governor.(设定调控器类型。)

   -f --freq <FREQ>
          specific frequency to be set. Requires userspace governor to be available and loaded.(要设置的特定频率。要求用户空间调控器可用并已加载。)

   -r --related
          modify all hardware-related CPUs at the same time(同时修改所有与硬件相关的 CPU。)

   -h --help
          Prints out the help screen.

REMARKS(备注/特别说明)

Omitting the -c or --cpu argument is equivalent to setting it to zero.(省略 -c 或 --cpu 参数等同于将其设置为零。)

复制代码
   The -f FREQ, --freq FREQ parameter cannot be combined with any other parameter except the -c CPU, --cpu CPU parameter.(-f 只能用在存在-c参数的场景。)

   FREQuencies  can be passed in Hz, kHz (default), MHz, GHz, or THz by postfixing the value with the wanted unit name, without any space (frequency in
   kHz =^ Hz * 0.001 =^ MHz * 1000 =^ GHz * 1000000).
   (FREQuencies 可以以 Hz、kHz(默认)、MHz、GHz 或 THz 为单位传递,方法是在值后加上所需的单位名称,没有任何空格(频率 kHz =^ Hz * 0.001 =^ MHz * 1000 =^ GHz * 1000000)。)

FILES(依赖文件)

/sys/devices/system/cpu/cpu*/cpufreq/

/proc/cpufreq (deprecated - 废弃)

/proc/sys/cpu/ (deprecated - 废弃)

c 复制代码
// cpufreq-info -g
|- cpufreq_get_available_governors
	|- sysfs_get_available_governors(cpu)
		|- sysfs_read_file(cpu, "scaling_available_governors", linebuf, sizeof(linebuf))

由上述源码来看,cpuutils的本质是修改cpu sysfs导出的相关节点来调整cpu的频率。

可是cpu支持哪些governors是在哪里做限定的,scaling_available_governors看到仅支持performance模式。

因为sysfs是内核导出的节点,那就找一找内核源码??看了下v6.6的内核源码,发现仅支持两种模式。

c 复制代码
// drivers/cpufreq/cpufreq.c
static unsigned int cpufreq_parse_policy(char *str_governor)
{
        if (!strncasecmp(str_governor, "performance", CPUFREQ_NAME_LEN))
                return CPUFREQ_POLICY_PERFORMANCE;

        if (!strncasecmp(str_governor, "powersave", CPUFREQ_NAME_LEN))
                return CPUFREQ_POLICY_POWERSAVE;

        return CPUFREQ_POLICY_UNKNOWN;
}

除了performancepowersave两种模式,可是为什么其他文章说支持以下所有模式??

命令:sudo cpufreq-set -g 《模式》

powersave,是无论如何都只会保持最低频率的所谓"省电"模式;

userspace,是自定义频率时的模式,这个是当你设定特定频率时自动转变的;

ondemand,默认模式。一有cpu计算量的任务,就会立即达到最大频率运行,等执行完 毕就立即回到最低频率;

conservative,翻译成保守(中庸)模 式,会自动在频率上下限调整,ondemand的区别在于它会按需分配频率,而不是一味追求最高频率;

performance,顾名思义只注重效率,无论如何一直保持以最大频率运行。

c 复制代码
// cpufreq-set -g
|- cpufreq_modify_policy_governor()
	|- verify_gov(new_gov, governor) // 对输入的governor字段做合法性判断
	|- sysfs_write_one_value
		|- sysfs_write_file // 将值写入到cpu WRITE_SCALING_GOVERNOR节点。
c 复制代码
/* write access */

enum {
        WRITE_SCALING_MIN_FREQ,
        WRITE_SCALING_MAX_FREQ,
        WRITE_SCALING_GOVERNOR,
        WRITE_SCALING_SET_SPEED,
        MAX_WRITE_FILES
};

static const char *write_files[MAX_VALUE_FILES] = {
        [WRITE_SCALING_MIN_FREQ] = "scaling_min_freq",
        [WRITE_SCALING_MAX_FREQ] = "scaling_max_freq",
        [WRITE_SCALING_GOVERNOR] = "scaling_governor",
        [WRITE_SCALING_SET_SPEED] = "scaling_setspeed",
};

从代码来看,cpufreq-set仅仅是将输入的governor简单校验之后写入对应节点,真正的governor合法性判断由内核来做。

bash 复制代码
// cpufreq_conservative.c
// cpufreq_ondemand.c
// cpufreq_powersave.c
// cpufreq_userspace.c
// cpufreq_performance.c

这写代码都被编译成了单独的模块,当向scaling_governor节点写governor名时,对应的驱动会被加载,同时scaling_available_frequencies也会添加对应的governer

bash 复制代码
$ lsmod | grep cpu
cpufreq_ondemand       28672  0
cpufreq_conservative    20480  1
cpufreq_powersave      16384  0
acpi_cpufreq           45056  0
相关推荐
wdxylb6 小时前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
飞雪20077 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪7 小时前
关于Linux内核中头文件问题相关总结
linux
木易双人青7 小时前
01-Docker-简介、安装与使用
运维·docker·容器
专注API从业者8 小时前
Python + 淘宝 API 开发:自动化采集商品数据的完整流程
大数据·运维·前端·数据挖掘·自动化
Lovyk9 小时前
Linux 正则表达式
linux·运维
Fireworkitte10 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil90011 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char11 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
中科米堆12 小时前
中科米堆CASAIM自动化三维测量设备测量汽车壳体直径尺寸
运维·自动化·汽车·视觉检测