apricot-health/scripts/apricot-cstate-tune
Natalie dafbabee41 feat(@packages/apricot-health): add power-fault monitoring and mitigation tools
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-04-17 23:18:47 -07:00

52 lines
1.8 KiB
Bash
Executable file

#!/usr/bin/env bash
# Disable deep CPU C-states so Vcore stays at a higher baseline and the VRM
# doesn't have to slam from C6/C7 idle back to full current on every workload
# transient. Reduces transient-demand magnitude; does NOT fix root-cause PSU
# or VRM degradation, but often reduces crash frequency on aging boards.
#
# Leaves C0 + C1 enabled (basic halt). Disables C2+ (package C-states).
#
# Reversible: run with `--restore` to re-enable everything.
set -o pipefail
log() { printf '[%s] apricot-cstate-tune: %s\n' "$(date --iso-8601=s)" "$*"; }
mode="${1:-apply}"
case "$mode" in
apply)
n_cpus=$(ls -d /sys/devices/system/cpu/cpu[0-9]* 2>/dev/null | wc -l)
disabled=0
for s in /sys/devices/system/cpu/cpu*/cpuidle/state*/disable; do
[ -w "$s" ] || continue
idx="${s%/disable}"; idx="${idx##*state}"
# Keep states 0 (POLL/C0) and 1 (C1/halt); disable 2+.
if (( idx >= 2 )); then
echo 1 > "$s" 2>/dev/null && disabled=$(( disabled + 1 ))
fi
done
log "disabled $disabled idle-state entries across $n_cpus CPUs (kept C0+C1)"
;;
restore)
enabled=0
for s in /sys/devices/system/cpu/cpu*/cpuidle/state*/disable; do
[ -w "$s" ] || continue
echo 0 > "$s" 2>/dev/null && enabled=$(( enabled + 1 ))
done
log "re-enabled $enabled idle-state entries"
;;
status)
printf 'cpu0 idle states:\n'
for d in /sys/devices/system/cpu/cpu0/cpuidle/state*; do
[ -d "$d" ] || continue
name=$(cat "$d/name" 2>/dev/null)
dis=$(cat "$d/disable" 2>/dev/null)
printf ' %s disable=%s name=%s\n' "$(basename "$d")" "$dis" "$name"
done
;;
*)
echo "usage: $0 {apply|restore|status}" >&2
exit 2
;;
esac