feat: CPU页系统性能三档切换 v1.3.13(省电/平衡/高性能,写宿主cpufreq即时生效,宿主文件持久记忆,旁注说明)
This commit is contained in:
1 parent
e7ee434306
commit
133959ef74
3 files changed
+114
-6
No files matched your search
@@ -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()
|
||||
|
||||
Reference in new issue
Block a user