fix(diarization): учтён системный power profile
Зачем: - часть Intel-стендов не публикует ACPI platform_profile - balanced-режим на таком стенде доступен через power-profiles-daemon Что: - добавлен fallback на powerprofilesctl get - поведение закреплено тестом Проверка: - uv run pytest -q tests/test_benchmark_experiment.py - uv run ruff check для изменённых файлов
This commit is contained in:
1 parent
bd0d7e6736
commit
0ea4d56c9d
2 files changed
+32
-1
No files matched your search
@@ -931,6 +931,24 @@ def _runtime_supply() -> str | None:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _runtime_profile() -> str | None:
|
||||||
|
profile = _read_optional_text(Path("/sys/firmware/acpi/platform_profile"))
|
||||||
|
if profile is not None:
|
||||||
|
return profile
|
||||||
|
try:
|
||||||
|
completed = subprocess.run(
|
||||||
|
["powerprofilesctl", "get"],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
check=False,
|
||||||
|
timeout=5,
|
||||||
|
)
|
||||||
|
except (OSError, subprocess.TimeoutExpired):
|
||||||
|
return None
|
||||||
|
value = completed.stdout.strip()
|
||||||
|
return value or None if completed.returncode == 0 else None
|
||||||
|
|
||||||
|
|
||||||
def _runtime_governor() -> str | None:
|
def _runtime_governor() -> str | None:
|
||||||
values = {
|
values = {
|
||||||
value
|
value
|
||||||
@@ -1006,7 +1024,7 @@ def runtime_guard_snapshot() -> dict[str, Any]:
|
|||||||
swap = psutil.swap_memory()
|
swap = psutil.swap_memory()
|
||||||
return {
|
return {
|
||||||
"supply": _runtime_supply(),
|
"supply": _runtime_supply(),
|
||||||
"profile": _read_optional_text(Path("/sys/firmware/acpi/platform_profile")),
|
"profile": _runtime_profile(),
|
||||||
"governor": _runtime_governor(),
|
"governor": _runtime_governor(),
|
||||||
"turbo": _runtime_turbo(),
|
"turbo": _runtime_turbo(),
|
||||||
"power_limits": _runtime_power_limits(),
|
"power_limits": _runtime_power_limits(),
|
||||||
|
|||||||
@@ -593,6 +593,19 @@ def test_schedule_preserves_raw_repeats_and_resumes_only_success(tmp_path):
|
|||||||
assert all(item["guard"]["attempts"][0]["valid"] for item in second["cells"])
|
assert all(item["guard"]["attempts"][0]["valid"] for item in second["cells"])
|
||||||
|
|
||||||
|
|
||||||
|
def test_runtime_profile_falls_back_to_powerprofilesctl(monkeypatch):
|
||||||
|
monkeypatch.setattr(experiment, "_read_optional_text", lambda _path: None)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
experiment.subprocess,
|
||||||
|
"run",
|
||||||
|
lambda *args, **kwargs: experiment.subprocess.CompletedProcess(
|
||||||
|
args[0], 0, stdout="balanced\n", stderr=""
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert experiment._runtime_profile() == "balanced"
|
||||||
|
|
||||||
|
|
||||||
def test_runtime_guard_retries_once_and_persists_transition_evidence(tmp_path):
|
def test_runtime_guard_retries_once_and_persists_transition_evidence(tmp_path):
|
||||||
manifest = _manifest(tmp_path)
|
manifest = _manifest(tmp_path)
|
||||||
manifest["cells"][1]["enabled"] = False
|
manifest["cells"][1]["enabled"] = False
|
||||||
|
|||||||
Reference in new issue
Block a user