feat: remove power monitoring feature
This commit is contained in:
1 parent
593b8011c6
commit
e49a2f8f03
6 files changed
+3
-123
No files matched your search
+2
-75
@@ -1,4 +1,4 @@
|
||||
"""Linux 系统监控:功耗(RAPL/电池)、CPU、内存、温度、磁盘、网络、进程。"""
|
||||
"""Linux 系统监控:CPU、内存、温度、磁盘、网络、进程。"""
|
||||
import os
|
||||
import time
|
||||
from pathlib import Path
|
||||
@@ -6,79 +6,7 @@ from pathlib import Path
|
||||
import psutil
|
||||
|
||||
|
||||
# ---------- 功耗 ----------
|
||||
|
||||
def _read_energy_uj(path: Path) -> int | None:
|
||||
try:
|
||||
return int(path.read_text().strip())
|
||||
except (OSError, ValueError):
|
||||
return None
|
||||
|
||||
|
||||
def get_power() -> dict:
|
||||
"""返回功耗信息,单位瓦(W)。优先电池,其次 Intel RAPL。"""
|
||||
result = {"source": None, "total_watts": None, "domains": {}, "battery": None}
|
||||
|
||||
# 1. 电池功率(笔记本放电/充电)
|
||||
for p in Path("/sys/class/power_supply").glob("BAT*/power_now"):
|
||||
try:
|
||||
# power_now 单位微瓦
|
||||
watts = int(p.read_text().strip()) / 1_000_000
|
||||
result["battery"] = round(watts, 2)
|
||||
result["source"] = "battery"
|
||||
result["total_watts"] = round(watts, 2)
|
||||
except (OSError, ValueError):
|
||||
pass
|
||||
|
||||
# 2. Intel RAPL energy 差分
|
||||
rapl_dir = Path("/sys/class/powercap")
|
||||
domains_now = {}
|
||||
for i, d in enumerate(sorted(rapl_dir.glob("intel-rapl:*"))):
|
||||
name_file = d / "name"
|
||||
energy_file = d / "energy_uj"
|
||||
if not energy_file.exists():
|
||||
continue
|
||||
domain = name_file.read_text().strip() if name_file.exists() else f"rapl{i}"
|
||||
energy = _read_energy_uj(energy_file)
|
||||
if energy is not None:
|
||||
domains_now[domain] = (energy, time.monotonic())
|
||||
|
||||
if domains_now:
|
||||
# 用上一次读数差分计算瓦数
|
||||
prev = getattr(get_power, "_prev_rapl", None)
|
||||
get_power._prev_rapl = domains_now
|
||||
if prev:
|
||||
for domain, (energy, ts) in domains_now.items():
|
||||
if domain in prev:
|
||||
p_energy, p_ts = prev[domain]
|
||||
dt = ts - p_ts
|
||||
if dt > 0:
|
||||
delta = energy - p_energy
|
||||
if delta < 0: # 计数器回绕
|
||||
max_uj = 1 << 32
|
||||
delta += max_uj
|
||||
watts = delta / 1_000_000 / dt
|
||||
result["domains"][domain] = round(watts, 2)
|
||||
if result["domains"]:
|
||||
result["source"] = result["source"] or "rapl"
|
||||
if result["total_watts"] is None:
|
||||
# 累加所有域(通常 dom0 已包含子域,取最大 dom0)
|
||||
result["total_watts"] = max(result["domains"].values())
|
||||
|
||||
# 3. Windows/通用兜底:电池电量百分比(无功率数据)
|
||||
if result["total_watts"] is None:
|
||||
try:
|
||||
bat = psutil.sensors_battery()
|
||||
except (AttributeError, OSError):
|
||||
bat = None
|
||||
if bat is not None:
|
||||
result["battery_percent"] = round(bat.percent, 1)
|
||||
result["plugged"] = bat.power_plugged
|
||||
|
||||
return result
|
||||
|
||||
|
||||
# ---------- 其他指标 ----------
|
||||
# ---------- 指标 ----------
|
||||
|
||||
def get_cpu() -> dict:
|
||||
load1, load5, load15 = _safe_getloadavg()
|
||||
@@ -249,7 +177,6 @@ def get_uptime() -> float:
|
||||
def get_status(top_n: int | None = None) -> dict:
|
||||
"""系统总览。top_n 为 None 时不枚举进程(Windows 上较慢)。"""
|
||||
data = {
|
||||
"power": get_power(),
|
||||
"cpu": get_cpu(),
|
||||
"memory": get_memory(),
|
||||
"temps": get_temps(),
|
||||
|
||||
Reference in new issue
Block a user