直接读取/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq,是在 Linux 中查看 CPU 实时主频最轻量的方法之一,具备每核独立、单位清晰(kHz)、毫秒级响应等特点,可跳过缓存直接读取硬件状态。输出如2400000即表示2.4GHz;通常需要sudo权限,如果路径不存在,多半说明cpufreq驱动未加载,或者该核心处于offline状态。

直接读 /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq 最轻量实时
这是 Linux 查看 CPU 当前频率时几乎不依赖额外工具的方案,支持按核心独立读取,单位明确为 kHz,并且具备毫秒级刷新能力。路径中的 cpu* 会匹配全部逻辑核心,例如 cpu0 到 cpu15,每个文件中的数值就是对应核心当前的实际频率。
很多用户在查询 Linux CPU 主频动态时,常见的误区是只查看 cpu0。如果仅执行 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq,在多核负载分布不均时,很容易得到不完整甚至误导性的结论。更可靠的做法是一次性读取所有核心:cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq,或者配合 watch -n 0.5 进行高频刷新,更直观地观察 CPU 频率波动和动态变化。
- 输出为纯数字,例如
2400000代表 2.4 GHz,800000代表 0.8 GHz - 如果某个核心提示
No such file or directory,先检查该核心是否处于 offline 状态:cat /sys/devices/system/cpu/online;也可能被isolcpus参数隔离 - 若路径不存在(
/sys/devices/system/cpu/cpu0/cpufreq/),通常表示 cpufreq 驱动没有加载,可通过dmesg | grep -i "cpu.*freq"检查intel_cpufreq或acpi-cpufreq是否已启用
cpupower frequency-info --freq 是最准的“此刻”单值
如果你想在 Linux 中查看某一时刻 CPU 当前主频,cpupower frequency-info --freq 是精度很高的方式。它绕过内核缓存,直接通过 sysfs 接口获取硬件寄存器反馈,相比 /proc/cpuinfo 中的 cpu MHz 字段更实时。尤其在频率快速切换的场景下,例如突发负载结束后立即降频,后者往往会有几百毫秒的延迟。
不过需要注意,这个命令只返回一个频率值,并不代表所有 CPU 核心的实时频率;默认显示的是调度主核或采样核心的结果,并非全部核心中的最大值或最小值。
- 必须使用
sudo,否则通常会报Permission denied - 输出格式类似
current frequency: 3.60 GHz (asserted by call to hardware),括号中带有asserted才表示这是来自真实硬件的反馈 - 如果出现
No such file or directory,一般不是命令写错,而是底层驱动尚未就绪,本质上与前面 sysfs 路径缺失属于同一问题
用 turbostat 看睿频是否真超基频
在判断 Linux CPU 睿频是否真正生效时,turbostat 是非常关键的工具。它可以明确告诉你某个核心当前频率是否已经超过 CPU 规格中的基础频率(base frequency),也就是常说的 Turbo Boost 或睿频状态。它显示的是原始 GHz 数值以及 Turbo 标志列,而不是推测值或平均值。
例如:如果 CPU 基础频率是 2.8 GHz,cpuinfo_max_freq 显示为 4700000(4.7 GHz),而在 turbostat 中某个核心的 Core MHz 显示为 4900,同时 Turbo 列为 ✓,这才说明该核心实时频率确实已经超过基频,睿频处于实际触发状态。
- 必须以
sudo运行,否则无法读取 MSR 寄存器,关键字段可能为空 - 该工具对 Intel CPU 的适配最完整;在 AMD 平台上部分字段可能没有定义,在虚拟机环境中通常也不可用,因为 KVM/Xen 往往会屏蔽 MSR
- 默认输出不带时间戳,建议搭配
--interval 1控制刷新频率,并使用stdbuf -oL避免管道缓冲带来的显示延迟
别把 lscpu 的 CPU MHz 当实时值用
很多人在 Linux 下查看 CPU 主频时会使用 lscpu | grep "CPU MHz",但这里显示的其实是内核估算出的平均频率,并不是某个核心此刻的实时主频。比如系统空闲时,即使这里仍显示 2.4 GHz,也很常见;而真实情况可能是所有核心早已降到了 800 MHz。因此,这个字段更适合做基线参考,用来观察 performance 和 powersave 模式下整体频率变化趋势,而不适合判断单核心的瞬时频率。
更有参考价值的静态边界信息是:CPU max MHz(硬件支持的最高睿频上限)和 CPU min MHz(节能状态下可降到的最低频率)。但也要注意,在多插槽服务器或多物理 CPU 场景下,不同 socket 的 max MHz 可能并不一致,而 lscpu 往往只展示第一个 socket 的值。
- 如果
CPU max MHz显示为unknown,通常说明内核版本较旧,或者相关驱动尚未加载,这时可以通过cpupower frequency-info查看hardware limits段补充确认 model name中的频率信息(如@ 3.70GHz)只是标称基础频率,不包含睿频能力,不能直接与scaling_cur_freq对比来判断是否已经进入睿频状态
scaling_cur_freq 路径是否可访问、turbostat 能否成功读取 MSR、以及 BIOS 中是否开启 Turbo Boost,这三项任何一项缺失,都会导致“查看 Linux CPU 动态主频”失去准确性。遇到这种情况,通常不是命令本身有问题,而是底层支持链路没有打通。