Detect fan-mode drift; document health checks, VRAM accounting and tests
The reconciler only compared the power limit, so a profile whose fan setting never applied stayed wrong indefinitely. The headless X server that owns the GPU can be starting when this unit does; in-process retries cover a short delay, but if X arrives later nothing noticed that the fan mode had never been set. profile_drift() now compares fan mode too, gated on fan control having worked at least once so the check does not fire forever on a machine without it. README documents the self-check endpoint, the ollama/comfy/desktop/unmanaged bucketing and why unreclaimable VRAM is reported separately, the SSE trimming, and a tests section listing the measured constants the suite pins. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -308,9 +308,11 @@ def apply_profile(name: str, overrides: Optional[Dict[str, Any]] = None) -> Dict
|
||||
logger.warning(f"Profile '{name}' could not set fans: "
|
||||
f"{result['fan'].get('detail')}")
|
||||
|
||||
global _APPLIED_ONCE
|
||||
global _APPLIED_ONCE, _FAN_AVAILABLE
|
||||
if result["verified"]["power_limit_ok"]:
|
||||
_APPLIED_ONCE = True
|
||||
if result["verified"]["fan_ok"]:
|
||||
_FAN_AVAILABLE = True
|
||||
ACTIVE_PROFILE = name
|
||||
_LAST_RESULT = result
|
||||
logger.info(f"Overclock profile applied: {name} -> {json.dumps(result, default=str)}")
|
||||
@@ -475,6 +477,9 @@ def restore_safe(reason: str = "shutdown") -> Dict[str, Any]:
|
||||
|
||||
|
||||
_APPLIED_ONCE = False
|
||||
# Set once fan control has worked at least once, so drift checks do not fire forever on
|
||||
# a machine that simply has no fan control available.
|
||||
_FAN_AVAILABLE = False
|
||||
|
||||
|
||||
def profile_drift() -> Dict[str, Any]:
|
||||
@@ -490,17 +495,38 @@ def profile_drift() -> Dict[str, Any]:
|
||||
state = get_gpu_state()
|
||||
intended = int(cfg.get("power_limit_w", 0) or 0)
|
||||
actual = state.get("power_limit_w")
|
||||
drifted = bool(intended and actual is not None
|
||||
and abs(float(actual) - intended) >= 1.0)
|
||||
power_drift = bool(intended and actual is not None
|
||||
and abs(float(actual) - intended) >= 1.0)
|
||||
|
||||
# Fan mode is checked too. The headless X server that owns the GPU can still be
|
||||
# starting when this unit does, and the fan assignment then fails; the in-process
|
||||
# retries cover a short delay, but if X arrives later nothing else would ever notice
|
||||
# that the profile's fan setting was never applied.
|
||||
fan_intended = cfg.get("fan_mode", "auto")
|
||||
fan_actual = None
|
||||
fan_drift = False
|
||||
if _FAN_AVAILABLE:
|
||||
fan_actual = get_fan_status().get("mode")
|
||||
fan_drift = bool(fan_actual and fan_actual != fan_intended)
|
||||
|
||||
drifted = power_drift or fan_drift or not _APPLIED_ONCE
|
||||
reasons = []
|
||||
if not _APPLIED_ONCE:
|
||||
reasons.append("no profile has been successfully applied since startup")
|
||||
if power_drift:
|
||||
reasons.append(f"card reports {actual}W, profile asks {intended}W")
|
||||
if fan_drift:
|
||||
reasons.append(f"fans are {fan_actual}, profile asks {fan_intended}")
|
||||
return {
|
||||
"profile": ACTIVE_PROFILE,
|
||||
"applied_since_start": _APPLIED_ONCE,
|
||||
"power_limit_intended_w": intended,
|
||||
"power_limit_actual_w": actual,
|
||||
"drifted": drifted or not _APPLIED_ONCE,
|
||||
"reason": ("no profile has been successfully applied since startup"
|
||||
if not _APPLIED_ONCE else
|
||||
f"card reports {actual}W, profile asks {intended}W" if drifted else None),
|
||||
"fan_mode_intended": fan_intended,
|
||||
"fan_mode_actual": fan_actual,
|
||||
"fan_available": _FAN_AVAILABLE,
|
||||
"drifted": drifted,
|
||||
"reason": "; ".join(reasons) or None,
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user