最可靠方法是直接读取/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq,单位kHz,内核原生接口,无缓存无延迟;需先确认路径存在且驱动已加载,否则应检查dmesg或切换调频模式。

直接读 /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq 最可靠
这是内核暴露的原生接口,单位是 kHz,不依赖任何用户态工具,也不受 governor 策略缓存干扰。只要 CPU 驱动加载成功(如 intel_cpufreq 或 acpi-cpufreq),这个路径就实时反映硬件当前频率。
实操建议:
- 先确认路径存在:
ls /sys/devices/system/cpu/cpu0/cpufreq/,若报错或目录为空,说明没加载调频驱动(查dmesg | grep -i "cpu.*freq") - 快速查看所有核当前频率:
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq 2>/dev/null - 每秒刷新监控:
watch -n 1 'cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq 2>/dev/null | awk '{printf "%.1f GHz\n", $1/1000000}' - 注意:某些虚拟机、ARM 板或启用了
isolcpus的系统可能没有该路径,需 fallback 到其他方法
cpupower frequency-info --freq 要加 sudo 才能看真实值
它底层也是读同一个 sysfs 文件,但封装了校验和格式化。不加 sudo 会报 Permission denied ——不是权限设置问题,而是内核对部分 cpufreq 接口做了 CAP_SYS_ADMIN 限制。
常见陷阱:
- 运行
cpupower frequency-info不带--freq参数,只显示 policy 概览,根本看不到当前频率 - 看到输出里有
current frequency: 2.40 GHz (asserted by call to hardware)才算真正读到硬件反馈;括号里没写asserted的,可能是缓存值或估算值 - 若提示
No such file or directory,不是命令错了,是当前 CPU 驱动未启用(比如 Intel 平台启用了intel_pstate=active,而你却在用传统 cpufreq 工具链)
/proc/cpuinfo 的 cpu MHz 字段能用,但有延迟和采样偏差
它每 100ms 左右从硬件采样一次,数值是内核对当前周期的估算均值,不是严格“此刻”值。空载时可能卡在 base 频率不动,高负载下也可能滞后于实际升频动作。
适用场景:
- 快速粗略判断:运行
grep "cpu MHz" /proc/cpuinfo | head -n 4看前几核大致水平 - 对比不同核心是否负载不均(比如某核长期 800MHz,其他核冲到 4.0GHz)
- 注意:在
intel_pstate模式下,cpu MHz可能完全不更新,或固定为标称值,此时不可信
别信 lscpu 里的 CPU MHz
那个字段是启动时的静态估算,不是实时值。哪怕你刚跑完一个满负载程序,lscpu 输出的 CPU MHz 仍可能显示 2.4GHz,而实际各核已降到 800MHz —— 它根本不轮询硬件。
真正有用的字段只有:
-
CPU max MHz:标称睿频上限(但受温度/功耗限制,未必真能达到) -
CPU min MHz:理论最低频率(实际能否压到这么低,取决于 governor 和 BIOS 设置) - 这些是规格参数,不是运行时状态。拿它们当实时频率用,等于拿汽车说明书上的“最高时速”当 GPS 实时车速
/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq 里,但这个值是否有效,取决于你用的是哪种调频驱动、有没有被 BIOS 锁频、当前温度是否触发降频——这些细节比命令本身更关键。


















