怎么用脚本获取处理器功率

wen 实用脚本 1

本文目录导读:

怎么用脚本获取处理器功率

  1. 方案一:Linux 系统(推荐,最直接)
  2. 方案二:macOS 系统
  3. 方案三:Windows 系统(通过 WMI 或 第三方工具)
  4. 方案四:Python 跨平台方案(推荐 pyraplpsutil
  5. 方案五:针对 AMD CPU 的专用脚本
  6. 总结建议

要获取处理器功率(CPU功耗),根据操作系统和需求的不同,有以下几种脚本实现方案,需要注意的是,获取精确的瞬时功耗通常需要硬件支持(如Intel RAPL、AMD SMU)或外部传感器,脚本一般读取的是驱动或系统层暴露的数值。

以下是不同场景下的解决方案:

Linux 系统(推荐,最直接)

Linux 内核通过 RAPL(Running Average Power Limit) 接口提供了对 CPU 功耗的实时监控,大多数现代 Intel/AMD CPU 都支持。

脚本 1:使用 turbostat(最准确,需要 root) turbostatlinux-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 (开源)

  1. 下载 LibreHardwareMonitor
  2. 启动其 Web 服务器或使用命令行。
  3. 使用 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 跨平台方案(推荐 pyraplpsutil

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 脚本(使用 zenmonitorsmu):

#!/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
游戏/笔记本调优,实时可视化 使用 HWMonitorRivaTunerMangoHud (推荐,非纯脚本)

重要安全提醒

  • 读取 /sys/class/powercap 或使用 turbostat 在最新 Linux 内核上需要 root 权限(安全考虑)。
  • 在 Windows 上读取硬件传感器通常需要安装内核驱动(如 WinRing0),有潜在安全风险,建议仅使用经过验证的工具(如 LibreHardwareMonitor)。

抱歉,评论功能暂时关闭!