本文目录导读:

- 方案一:Linux 系统(推荐,最直接)
- 方案二:macOS 系统
- 方案三:Windows 系统(通过 WMI 或 第三方工具)
- 方案四:Python 跨平台方案(推荐
pyrapl或psutil) - 方案五:针对 AMD CPU 的专用脚本
- 总结建议
要获取处理器功率(CPU功耗),根据操作系统和需求的不同,有以下几种脚本实现方案,需要注意的是,获取精确的瞬时功耗通常需要硬件支持(如Intel RAPL、AMD SMU)或外部传感器,脚本一般读取的是驱动或系统层暴露的数值。
以下是不同场景下的解决方案:
Linux 系统(推荐,最直接)
Linux 内核通过 RAPL(Running Average Power Limit) 接口提供了对 CPU 功耗的实时监控,大多数现代 Intel/AMD CPU 都支持。
脚本 1:使用 turbostat(最准确,需要 root)
turbostat 是 linux-tools-common 包中的工具,可输出平均功耗。
#!/bin/bash # 需要安装:sudo apt install linux-tools-common linux-tools-$(uname -r) # 每秒获取一次整个封装(Package)的功耗 (瓦特) sudo turbostat --interval 1 --show PkgWatt,CorWatt,GFXWatt --quiet
脚本 2:纯 Bash 读取 sysfs(无需额外安装)
读取 /sys/class/powercap/intel-rapl 下的能量计数器,需要计算两次读取的差值并转换为瓦特。
#!/bin/bash
# 获取微焦耳 (microjoules) 并计算差值
RAPL_DIR="/sys/class/powercap/intel-rapl/intel-rapl:0"
ENERGY_FILE="$RAPL_DIR/energy_uj"
# 读取第一次值
energy_before=$(cat "$ENERGY_FILE")
sleep 1
# 读取第二次值
energy_after=$(cat "$ENERGY_FILE")
# 计算差值 (微焦耳) 除以时间 (秒) 得到微瓦,再转成瓦特
power_microwatts=$(( (energy_after - energy_before) ))
power_watts=$(echo "scale=2; $power_microwatts / 1000000" | bc)
echo "当前封装功耗: ${power_watts} W"
注意:
intel-rapl:0代表 CPU 封装(Package),1可能代表 Core,2代表 Uncore,根据你的 CPU 型号略有不同。- 需要
bc支持浮点数运算(sudo apt install bc)。
macOS 系统
macOS 的 ARM 芯片 (M1/M2/M3) 没有暴露标准功耗接口,对于 Intel Mac,可使用 powermetrics。
脚本:使用 powermetrics(需要 root)
#!/bin/bash
# 提取 CPU 功耗数据 (Intel Mac)
sudo powermetrics --samplers cpu_power -n 1 -i 1000 | grep "Average CPU Power" | awk '{print $4, $5}'
- 缺点:对于 Apple Silicon (M系列芯片),
powermetrics不直接提供 CPU 单独功耗,只能看到整个系统的总功耗(gpu_power+cpu_power合并显示),通常建议改用第三方工具如asitop(基于 Python,使用 M芯片 的 SMC 接口)。
Windows 系统(通过 WMI 或 第三方工具)
Windows 原生 WMI 不能直接输出 CPU 功耗(只提供温度、电压等),常用的方法是调用外部工具的输出。
脚本 1:调用 LibreHardwareMonitor (开源)
- 下载 LibreHardwareMonitor。
- 启动其 Web 服务器或使用命令行。
- 使用 PowerShell 解析其 JSON 输出:
# 假设 LibreHardwareMonitor 正在本地运行 HTTP 服务
$json = (Invoke-WebRequest -Uri "http://localhost:8085/data.json" -UseBasicParsing).Content | ConvertFrom-Json
$cpuPackage = $json.Children | Where-Object { $_.Text -like "*CPU Package*" }
$powerWatts = $cpuPackage.Sensors | Where-Object { $_.Type -eq "Power" } | Select-Object -First 1
Write-Output "CPU Package Power: $($powerWatts.Value) W"
脚本 2:使用 wmic + WinRing0(不推荐,很多杀毒软件会报毒)
许多旧脚本会使用 wmic path Win32_PowerSupply,但这只能获取总电源输入,不是 CPU 功耗。
Python 跨平台方案(推荐 pyrapl 或 psutil)
psutil 在 5.7.0+ 版本开始支持 Linux 的 RAPL 功耗读取,非常适合跨平台脚本(需要 Linux + root)。
#!/usr/bin/env python3
import psutil
import time
# 需要 root 权限运行
def get_cpu_power():
# 返回所有支持 RAPL 域 (如 package, core, dram) 的功耗 (瓦特)
sensors = psutil.sensors_power()
if not sensors:
print("未找到功耗传感器 (可能需要root权限或Linux)")
return
for domain, power_data in sensors.items():
for entry in power_data:
print(f"{domain} - {entry.label}: {entry.current} W")
if __name__ == "__main__":
get_cpu_power()
- 注意:
psutil在 Windows/macOS 上不返回 CPU 功耗,只返回温度或风扇数据,macOS 上需要额外安装py-smch等库。
针对 AMD CPU 的专用脚本
AMD CPU 通常也支持 RAPL,或通过 zenpower (Linux 内核模块) 读取,更高精度的功耗可能需要读取 SMU (System Management Unit) 寄存器。
Linux 脚本(使用 zenmonitor 或 smu):
#!/bin/bash
# 需要安装 zenmonitor (Python 版本)
sudo zenmonitor -i 1000 | grep "SVI2 TFN Core Power" | awk '{print $NF}'
总结建议
| 你的需求 | 最佳方案 |
|---|---|
| Linux 桌面/服务器,简单监控 | turbostat 脚本(方案一脚本1) |
| Linux 服务器,无法安装新包 | 读取 sysfs 的 Bash 脚本(方案一脚本2) |
| macOS Intel | powermetrics 脚本(方案二) |
| macOS Apple Silicon | 安装 asitop 或使用 SMC 工具 (方案二补充) |
| Windows | 安装 LibreHardwareMonitor + PowerShell (方案三脚本1) |
| 跨平台脚本嵌入应用 | Python psutil (方案四,仅限Linux) 或调用外部 exe |
| 游戏/笔记本调优,实时可视化 | 使用 HWMonitor、RivaTuner 或 MangoHud (推荐,非纯脚本) |
重要安全提醒:
- 读取
/sys/class/powercap或使用turbostat在最新 Linux 内核上需要 root 权限(安全考虑)。 - 在 Windows 上读取硬件传感器通常需要安装内核驱动(如 WinRing0),有潜在安全风险,建议仅使用经过验证的工具(如 LibreHardwareMonitor)。