Power Management
Quick Reference
# Battery status
cat /sys/class/power_supply/BAT0/capacity
upower -i /org/freedesktop/UPower/devices/battery_BAT0
# Power profile (power-profiles-daemon)
powerprofilesctl list
powerprofilesctl set power-saver
# TLP status
sudo tlp-stat -s
# Suspend
systemctl suspend
# Hibernate
systemctl hibernate
Power Management Options
Choose Your Approach
| Tool | Best For | Notes |
|---|---|---|
power-profiles-daemon |
GNOME/KDE desktops |
Simple, GUI integration |
TLP |
Maximum battery life |
Extensive tuning options |
auto-cpufreq |
Automatic optimization |
AI-based frequency scaling |
Manual tuning |
Specific needs |
Direct sysfs/sysctl control |
|
Don’t run multiple power managers simultaneously. Choose one approach. |
power-profiles-daemon
Installation
# Install
sudo pacman -S power-profiles-daemon
# Enable
sudo systemctl enable --now power-profiles-daemon
TLP (Advanced Power Management)
Installation
# Install TLP
sudo pacman -S tlp tlp-rdw
# For ThinkPads
sudo pacman -S tp_smapi acpi_call
# Enable
sudo systemctl enable tlp.service
sudo systemctl enable NetworkManager-dispatcher.service
# Disable conflicting services
sudo systemctl mask systemd-rfkill.service
sudo systemctl mask systemd-rfkill.socket
Basic Configuration
# /etc/tlp.conf
# --- AC/Battery Operation ---
TLP_ENABLE=1
TLP_DEFAULT_MODE=AC
TLP_PERSISTENT_DEFAULT=0
# --- CPU ---
CPU_SCALING_GOVERNOR_ON_AC=performance
CPU_SCALING_GOVERNOR_ON_BAT=powersave
CPU_ENERGY_PERF_POLICY_ON_AC=performance
CPU_ENERGY_PERF_POLICY_ON_BAT=balance_power
CPU_BOOST_ON_AC=1
CPU_BOOST_ON_BAT=0
# --- Platform ---
PLATFORM_PROFILE_ON_AC=performance
PLATFORM_PROFILE_ON_BAT=low-power
# --- Disk ---
DISK_DEVICES="nvme0n1 sda"
DISK_APM_LEVEL_ON_AC="254 254"
DISK_APM_LEVEL_ON_BAT="128 128"
# --- WiFi ---
WIFI_PWR_ON_AC=off
WIFI_PWR_ON_BAT=on
# --- USB ---
USB_AUTOSUSPEND=1
USB_EXCLUDE_BTUSB=1 # Don't suspend Bluetooth
# --- Battery ---
START_CHARGE_THRESH_BAT0=75
STOP_CHARGE_THRESH_BAT0=80
auto-cpufreq
CPU Frequency Scaling
Manual Control
# Install tools
sudo pacman -S cpupower
# Check current state
cpupower frequency-info
# List governors
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
# performance powersave schedutil
# Set governor
sudo cpupower frequency-set -g powersave
# Set frequency limits
sudo cpupower frequency-set -u 2.0GHz # Max frequency
sudo cpupower frequency-set -d 800MHz # Min frequency
Persistent Configuration
# /etc/default/cpupower
governor='powersave'
min_freq="800MHz"
max_freq="2.0GHz"
# Enable service
sudo systemctl enable cpupower
Intel P-State
# Check driver
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
# intel_pstate or acpi-cpufreq
# Intel P-state options
cat /sys/devices/system/cpu/intel_pstate/no_turbo
echo 1 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo # Disable turbo
# Energy Performance Preference
cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference
echo "power" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference
Suspend and Hibernate
Suspend (Sleep/S3)
# Suspend immediately
systemctl suspend
# Check suspend type
cat /sys/power/mem_sleep
# [s2idle] deep
# Prefer deep sleep (S3)
echo deep | sudo tee /sys/power/mem_sleep
# Permanent (kernel parameter)
# Add to boot options: mem_sleep_default=deep
Hibernate (Suspend to Disk)
# Requirements:
# 1. Swap partition/file >= RAM size
# 2. Resume kernel parameter
# Find swap UUID
findmnt -no UUID -T /swapfile # Or use swap partition UUID
# Add to kernel parameters
# /boot/loader/entries/arch.conf
options ... resume=UUID=YOUR-SWAP-UUID
# For swap file, also need offset
sudo filefrag -v /swapfile | head -4
# Add: resume_offset=OFFSET_VALUE
# Regenerate initramfs with resume hook
# /etc/mkinitcpio.conf
HOOKS=(... block resume filesystems ...)
sudo mkinitcpio -P
# Test hibernate
systemctl hibernate
Hybrid Sleep
# Suspend + write to swap (resume even after power loss)
systemctl hybrid-sleep
# Configure
# /etc/systemd/sleep.conf
[Sleep]
AllowSuspend=yes
AllowHibernation=yes
AllowSuspendThenHibernate=yes
AllowHybridSleep=yes
SuspendMode=suspend
SuspendState=mem
HibernateMode=platform shutdown
HibernateState=disk
HybridSleepMode=suspend platform shutdown
HybridSleepState=disk
Battery Management
Check Battery Status
# Using upower
upower -e # List devices
upower -i /org/freedesktop/UPower/devices/battery_BAT0
# Direct sysfs
cat /sys/class/power_supply/BAT0/status
cat /sys/class/power_supply/BAT0/capacity
cat /sys/class/power_supply/BAT0/energy_full
cat /sys/class/power_supply/BAT0/energy_now
cat /sys/class/power_supply/BAT0/power_now
# Battery health
cat /sys/class/power_supply/BAT0/energy_full_design
cat /sys/class/power_supply/BAT0/energy_full
# Compare to calculate wear
Battery Charge Thresholds
Limit charge to extend battery lifespan:
# ThinkPad (with tp_smapi or acpi_call)
# TLP configuration
START_CHARGE_THRESH_BAT0=75
STOP_CHARGE_THRESH_BAT0=80
# Apply
sudo tlp setcharge 75 80 BAT0
# Check
sudo tlp-stat -b
# ASUS laptops
# Install asus-wmi-tools or use /sys
echo 60 | sudo tee /sys/class/power_supply/BAT0/charge_control_end_threshold
Screen and Backlight
Brightness Control
# Install brightnessctl
sudo pacman -S brightnessctl
# Get current brightness
brightnessctl get
brightnessctl info
# Set brightness
brightnessctl set 50%
brightnessctl set +10%
brightnessctl set 10%-
# Maximum brightness
brightnessctl set 100%
# Minimum visible
brightnessctl set 1
Automatic Brightness (Light Sensor)
# Install clight
yay -S clight
# Configuration
# ~/.config/clight.conf
# Enable and start
systemctl --user enable --now clight
Display Power Management
# DPMS settings (X11)
xset dpms 300 600 900 # Standby, suspend, off (seconds)
xset s 300 # Screensaver timeout
# Wayland (compositor-specific)
# Hyprland example in config
exec-once = swayidle -w \
timeout 300 'swaylock -f' \
timeout 600 'hyprctl dispatch dpms off' \
resume 'hyprctl dispatch dpms on' \
before-sleep 'swaylock -f'
Monitoring Power Usage
PowerTOP
# Install
sudo pacman -S powertop
# Interactive mode
sudo powertop
# Generate HTML report
sudo powertop --html=report.html
# Auto-tune (apply all optimizations)
sudo powertop --auto-tune
# Calibrate (run on battery)
sudo powertop --calibrate
Troubleshooting
Suspend Not Working
# Check for issues
journalctl -b | grep -i suspend
dmesg | grep -i suspend
# Common fixes:
# 1. NVIDIA: Add nvidia modules to initramfs
MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
# 2. USB waking system
# Find wake sources
cat /proc/acpi/wakeup
# Disable problematic device
echo XHC | sudo tee /proc/acpi/wakeup
High Power Usage
# Find power-hungry processes
powertop
# Check CPU frequency
watch -n 1 'cat /proc/cpuinfo | grep MHz'
# Check for stuck processes
top
htop
# Check wake events
cat /sys/kernel/debug/wakeup_sources
Battery Draining Fast
# Check current draw
cat /sys/class/power_supply/BAT0/current_now
# Identify power consumers
sudo powertop
# Check TLP status
sudo tlp-stat -s
# Common culprits:
# - Discrete GPU not suspended
# - WiFi power save off
# - USB devices
# - High CPU frequency
NVIDIA Power Issues
# Check GPU power state
cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_status
# suspended = good, active = drawing power
# Enable runtime PM for NVIDIA
# /etc/udev/rules.d/80-nvidia-pm.rules
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto"
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on"
# Reload
sudo udevadm control --reload
sudo udevadm trigger
Quick Reference
# Battery status
cat /sys/class/power_supply/BAT0/capacity
upower -i /org/freedesktop/UPower/devices/battery_BAT0
# Power profile
powerprofilesctl list/get/set
# TLP
sudo tlp-stat -s # Status
sudo tlp start # Apply settings
sudo tlp ac / tlp bat # Force mode
# CPU
cpupower frequency-info # Current state
cpupower frequency-set -g GOVERNOR
# Suspend/Hibernate
systemctl suspend
systemctl hibernate
systemctl hybrid-sleep
# Brightness
brightnessctl set 50%
brightnessctl set +10%
# Monitoring
sudo powertop # Interactive
sudo powertop --auto-tune # Apply optimizations
# Logs
journalctl -u tlp -b
journalctl | grep -i suspend