feat: CPU页系统性能三档切换 v1.3.13(省电/平衡/高性能,写宿主cpufreq即时生效,宿主文件持久记忆,旁注说明)

This commit is contained in:
3970260761 committed 2026-11-08 00:32:32 +08:00
1 parent e7ee434306
commit 133959ef74
3 files changed
+114 -6

No files matched your search

+100 -1
View File
@@ -16,7 +16,7 @@ PORT = int(os.environ.get("PORT", "7031"))
# ---------- CardAuth hub (免费形态: 安装统计/在线/公告/版本推送,失败开放) ----------
HUB_URL = os.environ.get("HUB_URL", "https://auth.88531.cn/api").rstrip("/")
HUB_PROJECT_ID = os.environ.get("HUB_PROJECT_ID", "12")
HUB_VERSION = os.environ.get("SITE_VERSION", "1.3.12")
HUB_VERSION = os.environ.get("SITE_VERSION", "1.3.13")
HUB = {"ok": False, "install_id": None, "latest": "", "update_available": False,
"update_required": False, "download_url": "", "changelog": "",
"announcements": [], "popup": [], "ts": 0}
@@ -463,6 +463,105 @@ def get_percpu():
except Exception:
return []
# ---------- CPU 性能模式: 省电/平衡/高性能(写宿主 cpufreq,失败开放) ----------
PERF_FILE = os.environ.get("PERF_FILE", "/run/secrets/perf_mode.json")
PERF_FILE_FALLBACKS = [PERF_FILE, "/app/perf_mode.json"]
PERF_MODES = {
"powersave": {"governor": "powersave", "epp": "power",
"name": "省电模式"},
"balanced": {"governor": "powersave", "epp": "balance_performance",
"name": "平衡模式"},
"performance": {"governor": "performance", "epp": "performance",
"name": "高性能模式"},
}
def _saved_perf_mode():
for p in PERF_FILE_FALLBACKS:
try:
with open(p) as f:
m = (json.load(f) or {}).get("mode", "")
if m in PERF_MODES:
return m
except Exception:
continue
return ""
def _read_perf():
gov, epp = "", ""
try:
with open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor") as f:
gov = f.read().strip()
except Exception:
pass
try:
with open("/sys/devices/system/cpu/cpufreq/policy0/energy_performance_preference") as f:
epp = f.read().strip().split()[0]
except Exception:
pass
mode = ""
for k, v in PERF_MODES.items():
if v["governor"] == gov and (not epp or v["epp"] == epp):
mode = k
break
return {"governor": gov, "epp": epp, "mode": mode,
"saved": _saved_perf_mode()}
def _apply_perf(mode):
if mode not in PERF_MODES:
return {"ok": False, "error": "未知模式"}
want = PERF_MODES[mode]
ok_g = fail_g = ok_e = fail_e = 0
for p in sorted(glob.glob("/sys/devices/system/cpu/cpu[0-9]*/cpufreq/scaling_governor")):
try:
with open(p, "w") as f:
f.write(want["governor"])
ok_g += 1
except Exception:
fail_g += 1
for p in sorted(glob.glob("/sys/devices/system/cpu/cpufreq/policy*/energy_performance_preference")):
try:
with open(p, "w") as f:
f.write(want["epp"])
ok_e += 1
except Exception:
fail_e += 1
if ok_g == 0 and fail_g > 0:
return {"ok": False, "error": "调频接口不可写( governor 写入失败 )"}
try:
with open(PERF_FILE, "w") as f:
json.dump({"mode": mode}, f)
except Exception:
try:
with open("/app/perf_mode.json", "w") as f:
json.dump({"mode": mode}, f)
except Exception:
pass
st = _read_perf()
st.update({"ok": True, "mode": mode, "gov_ok": ok_g, "gov_fail": fail_g,
"epp_ok": ok_e, "epp_fail": fail_e,
"msg": "已切换为%s,立即生效,不重启电脑" % want["name"]})
return st
@app.route("/api/cpu/perf")
def api_cpu_perf():
return jsonify(_read_perf())
@app.route("/api/cpu/perf", methods=["POST"])
def api_cpu_perf_set():
try:
mode = (request.get_json(force=True, silent=True) or {}).get("mode", "")
except Exception:
mode = ""
r = _apply_perf(mode)
return jsonify(r), (200 if r.get("ok") else 400)
try:
_sv = _saved_perf_mode()
if _sv:
_apply_perf(_sv)
except Exception:
pass
@app.route("/api/mem")
def api_mem():
vm = psutil.virtual_memory()