Table of Contents
- Introduction
- Why tune power management?
- Scope & audience
- Prerequisites & Safety
- Back-up & recovery
- Test environment
- Tools you need
- Fundamentals
- Linux power-management stack
- Key kernel subsystems (cpuidle, cpufreq, runtime PM, PCIe ASPM, USB autosuspend)
- Kernel Parameters (sysctl & /proc /sys)
- Global sysctl knobs
- /proc/sys/vm, /proc/sys/kernel
- /sys/devices/system/cpu
- Example “power-save” profile
- GRUB – Boot-time Kernel Command Line
- Anatomy of GRUB_CMDLINE_LINUX
- Common power-saving options
- CPU-frequency & idle tweaks
- PCIe ASPM, USB, SATA, Wi-Fi, Bluetooth
- Example GRUB configurations
- Updating GRUB & regenerating initramfs
- Modprobe – Module-specific Parameters
- Overview of modprobe.d
- Power-related modules (e.g., i915, radeon, amdgpu, thinkpad_acpi, snd_hda_intel, btusb)
- Syntax & precedence
- Sample files
- Putting It All Together – A “Full-Power-Save” Profile
- Step-by-step procedure
- Verification with powertop, turbostat, systemd-analyze
- Testing, Benchmarking & Roll-back
- Stress testing
- Measuring battery life
- Reverting changes
- Troubleshooting
- Common symptoms
- Log-based diagnostics
- Kernel panics & boot loops
- Advanced Topics
- Dynamic runtime power management (DPM)
- Using systemd power-saving services
- Interaction with user-space tools (TLP, laptop-mode-tools, power-profiles-daemon)
- FAQ
- References & Further Reading
- Appendix
- Full example configuration files
- Glossary of terms
1. Introduction
1.1 Why Tune Power Management?
- Battery life: Laptops, convertibles, and ARM‑based notebooks can gain 10‑30 % extra runtime with aggressive tuning.
- Thermal envelope: Lower power ⇒ cooler chassis ⇒ less fan noise and higher component longevity.
- Energy cost & carbon footprint: For servers, even a few watts saved per node add up in large farms.
- Performance vs. efficiency trade‑off: Advanced knobs let you define the exact point on the curve you need.
1.2 Scope & Audience
This manual assumes:
- A modern Linux distribution (kernel ≥ 6.0) using systemd and GRUB2.
- Familiarity with the command line,
sudo, and basic system administration. - A willingness to edit bootloader and kernel module configuration files.
It does not cover:
- User‑space power‑management utilities (TLP, power-profiles-daemon) – those are mentioned only for completeness.
- Firmware‑level (BIOS/UEFI) power‑policy configuration (though some BIOS knobs are referenced).
2. Prerequisites & Safety
2.1 Back‑up & Recovery
| Action | Command / Tool |
|---|---|
Backup /etc/default/grub |
sudo cp /etc/default/grub /etc/default/grub.bak |
Backup all modprobe.d files |
sudo cp -r /etc/modprobe.d /etc/modprobe.d.bak |
Snapshot of /etc/sysctl.conf |
sudo cp /etc/sysctl.conf /etc/sysctl.conf.bak |
| Create a bootable rescue USB (e.g., SystemRescueCD) | – |
Tip: Keep a copy of the original kernel command line (cat /proc/cmdline) in a text file.
2.2 Test Environment
- Virtual machine (VM) – Great for syntax checking of GRUB & modprobe files, but power‑management hardware features are not exposed.
- Live USB – Boot a known‑good live system, then chroot into your installed system to apply changes safely.
- Dual‑boot fallback – Keep an older kernel entry in GRUB that boots without your custom options.
2.3 Tools You Need
sudo apt install -y git curl jq # Debian/Ubuntu
sudo dnf install -y git curl jq # Fedora
sudo pacman -S git curl jq # Arch
powertop– interactive power diagnostics.turbostat– per‑CPU frequency/power stats (requireslinux-tools).systemd-analyze blame– identify services that may waste power.journalctl -b– review boot logs after changes.
3. Fundamentals
3.1 Linux Power‑Management Stack
| Layer | Description | Typical knobs |
|---|---|---|
| CPU idle (cpuidle) | Low‑power states when a core is idle. | idle=nomwait, idle=disable, idle=1 |
| CPU frequency scaling (cpufreq) | Adjusts core frequency based on load. | governors (powersave, schedutil), max_perf_pct |
| Runtime Power Management (runtime PM) | Per‑device suspend/resume while the system is running. | /sys/bus/*/devices/*/power/control |
| PCIe ASPM (Active State Power Management) | Link‑level power saving for PCIe devices. | pcie_aspm=force |
| USB autosuspend | Suspends idle USB devices. | usbcore.autosuspend=1 |
| SATA link power management | Puts SATA ports in low‑power mode. | libata.force=1.5G or sata_alpm=1 |
| Wi‑Fi / Bluetooth power policies | Firmware‑controlled power saving. | btusb.enable_autosuspend=1 |
Note: Most of these knobs are exposed via kernel command‑line parameters (GRUB) or via sysfs after boot. The manual covers both approaches.
3.2 Interaction with User‑Space
- systemd provides
systemd-suspend,systemd-hibernate, and thepower-profiles-daemonthat expose “performance”, “balanced”, and “power‑save” profiles. - powertop can “tune” many of the same parameters automatically; however, manual control via GRUB / modprobe is more deterministic and survives reboots without a daemon.
4. Kernel Parameters (sysctl & /proc /sys)
4.1 Global sysctl knobs
| Parameter | Path | Recommended value | Effect |
|---|---|---|---|
kernel.nmi_watchdog |
/proc/sys/kernel/nmi_watchdog |
0 |
Disables NMI watchdog (saves a few mW). |
kernel.sched_rt_runtime_us |
/proc/sys/kernel/sched_rt_runtime_us |
-1 |
Removes runtime limit for real‑time tasks (avoid throttling). |
vm.swappiness |
/proc/sys/vm/swappiness |
10 (or 1 on laptops) |
Reduces swap usage, keeping more RAM for cache, which is cheaper than flash swap. |
vm.laptop_mode |
/proc/sys/vm/laptop_mode |
5 (or 0 if you disable laptop mode) |
Increases dirty‑page write‑back delay, allowing the disk to spin down longer. |
Add the above to /etc/sysctl.d/99-power.conf (create if missing):
# /etc/sysctl.d/99-power.conf
kernel.nmi_watchdog = 0
kernel.sched_rt_runtime_us = -1
vm.swappiness = 10
vm.laptop_mode = 5
Apply immediately:
sudo sysctl --system
4.2 /proc/sys/vm & /proc/sys/kernel
| Parameter | Example value | Reason |
|---|---|---|
proc.max_threads |
20000 (default is 32768) |
Reducing max threads may lower kernel overhead on low‑end CPUs. |
kernel.perf_event_paranoid |
2 |
Disallow unprivileged access to performance counters (tiny security gain). |
4.3 /sys/devices/system/cpu
4.3.1 CPU Frequency Scaling
# Set the default governor to "schedutil" (modern, combines load tracking & power)
sudo cpupower frequency-set -g schedutil
# Force a max performance percentage (e.g., limit to 80% of turbo)
echo 80 | sudo tee /sys/devices/system/cpu/cpufreq/policy0/max_perf_pct
You can make the setting persistent with a systemd service (/etc/systemd/system/cpufreq.service).
4.3.2 CPU Idle Governor
# Use "menu" idle governor (good balance) or "nop" to disable deep C‑states
echo menu | sudo tee /sys/devices/system/cpu/cpuidle/current_driver
4.4 Example “power‑save” profile (sysfs)
Create /etc/rc.local (or a systemd unit) that runs at boot:
#!/bin/sh
# /etc/rc.local – executed after multi‑user.target
# Reduce CPU C‑states to avoid latency spikes (optional)
for c in /sys/devices/system/cpu/cpu*/cpuidle/state*; do
echo 0 > "$c/disable"
done
# Set all CPUs to powersave governor
for cpu in /sys/devices/system/cpu/cpu[0-9]*; do
echo powersave > "$cpu/cpufreq/scaling_governor"
done
exit 0
Make it executable:
sudo chmod +x /etc/rc.local
sudo systemctl enable rc-local.service # on Debian/Ubuntu
5. GRUB – Boot‑time Kernel Command Line
5.1 Anatomy of GRUB_CMDLINE_LINUX
The line is a space‑separated list of key=value pairs passed to the kernel at boot. Example:
GRUB_CMDLINE_LINUX="quiet splash intel_iommu=on pci=noaer"
Only the value part may be quoted if it contains spaces.
5.2 Common Power‑Saving Options
| Option | Syntax | Typical value | What it does |
|---|---|---|---|
intel_idle.max_cstate |
intel_idle.max_cstate=N |
1 or 2 |
Limit deepest C‑state (avoid latency). |
processor.max_cstate |
processor.max_cstate=N |
1 |
Same for generic ACPI. |
pcie_aspm |
pcie_aspm=force |
force |
Enables ASPM even if BIOS disabled it. |
usbcore.autosuspend |
usbcore.autosuspend=1 |
-1 (disable) or 2 (seconds) |
Auto‑suspend idle USB devices. |
acpi_osi |
acpi_osi=!Windows 2015 |
!Windows 2015 |
Hides newer OS signatures to coax firmware into low‑power mode. |
acpi_rev_override |
acpi_rev_override=1 |
1 |
Enables newer ACPI revision parsing (useful on older BIOS). |
modprobe.blacklist |
Not a kernel param – see §6. | ||
sata_alpm |
sata_alpm=1 |
1 (enable) |
Enables aggressive SATA link power management. |
i915.enable_psr |
i915.enable_psr=1 |
1 (or 0 to disable) |
Panel Self‑Refresh for Intel GPUs (big savings on laptops). |
i915.enable_fbc |
i915.enable_fbc=1 |
1 |
Frame Buffer Compression – reduces memory bandwidth. |
i915.enable_guc |
i915.enable_guc=2 |
2 (full) |
GuC submission – improves power on newer Intel GPUs. |
amdgpu.runpm |
amdgpu.runpm=1 |
1 |
Runtime PM for AMD GPUs. |
nouveau.powersave |
nouveau.powersave=1 |
1 |
Enable power‑save mode for NVIDIA cards (if using Nouveau). |
nvme_core.default_ps_max_latency_us |
nvme_core.default_ps_max_latency_us=0 |
0 |
Aggressive NVMe power state transitions. |
intel_pstate |
intel_pstate=passive |
passive |
Let cpufreq driver manage Intel P‑state (more flexibility). |
idle=nomwait |
idle=nomwait |
– | Avoids MWAIT deep idle states on some CPUs (useful if they cause hangs). |
mitigations=off |
mitigations=off |
– | Disables Spectre/Meltdown mitigations (large performance boost, but security trade‑off). |
quiet / splash |
Standard | – | Reduce console output (minor power impact). |
Caution: Some options (pcie_aspm=force,idle=nomwait,mitigations=off) can cause instability on specific hardware. Test thoroughly.
5.3 CPU‑frequency & Idle Tweaks
5.3.1 Disabling Intel SpeedStep (if you want a fixed low frequency)
GRUB_CMDLINE_LINUX="intel_pstate=disable"
5.3.2 Limiting Turbo Boost
GRUB_CMDLINE_LINUX="intel_pstate=no_hwp turbo_pct=70"
turbo_pct caps turbo to a percentage of the nominal maximum.
5.3.3 Using the “passive” mode (recommended for granular governor control)
GRUB_CMDLINE_LINUX="intel_pstate=passive"
After reboot, the cpufreq governors become visible (e.g., schedutil, powersave).
5.4 PCIe, USB, SATA, Wi‑Fi, Bluetooth
GRUB_CMDLINE_LINUX="pcie_aspm=force usbcore.autosuspend=2 sata_alpm=1 iwlwifi.power_save=1 iwlwifi.bt_coex_active=0 btusb.enable_autosuspend=1"
iwlwifi.power_save=1– Enables power‑save for Intel wireless.iwlwifi.bt_coex_active=0– Disables Bluetooth coexistence (may improve Wi‑Fi power).
5.5 Example GRUB Configurations
5.5.1 “Balanced” (default)
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="intel_pstate=passive"
5.5.2 “Maximum Battery Life”
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="intel_pstate=passive processor.max_cstate=1 pcie_aspm=force usbcore.autosuspend=2 \
iwlwifi.power_save=1 iwlwifi.bt_coex_active=0 btusb.enable_autosuspend=1 \
i915.enable_psr=1 i915.enable_fbc=1 i915.enable_guc=2 amdgpu.runpm=1 \
nvme_core.default_ps_max_latency_us=0"
5.5.3 “Performance (Desktop) – No Power Saving”
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="intel_pstate=disable turbo_pct=100"
5.6 Editing and Updating GRUB
On Debian‑based distros:
sudo nano /etc/default/grub
# edit the lines as above
sudo update-grub
On Fedora/CentOS (grub2-mkconfig):
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
After editing, reboot to apply.
5.7 Verifying the Parameters
After boot, run:
cat /proc/cmdline
You should see the exact string you set.
5.8 Override a GRUB parameters
The configuration file structure:
The /etc/default/grub.d/ directory contains shell script fragments that are sourced by grub-mkconfig. The configuration files are read in alphabetical order, and the final settings are combined before generating the grub.cfg file.
This process works by using a shell variable expansion and concatenation. For example, to add a new kernel parameter, you do not replace the GRUB_CMDLINE_LINUX_DEFAULT variable; you append your new parameter to it using ${GRUB_CMDLINE_LINUX_DEFAULT}.
How to override a GRUB parameter:
This procedure can be used to add or modify parameters like: pci=noaer
Create a new file in the /etc/default/grub.d/ directory. Use a descriptive name that ends in .cfg and starts with a number to control its execution order. A number like 50 or 90 is generally safe to ensure it is processed after any system defaults.
sudo nano /etc/default/grub.d/90-custom-params.cfgAdd the override logic to the new file. Use shell variable expansion to prepend or append your new parameters. To append a parameter: Append your new parameter to the existing value of GRUB_CMDLINE_LINUX_DEFAULT. This is the most common use case.
# 90-custom-params.cfg
GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT} pci=noaer"
To prepend a parameter: Some parameters need to be at the beginning of the list.
# 90-custom-params.cfg
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 ${GRUB_CMDLINE_LINUX_DEFAULT}"
6. modprobe – Kernel Module Parameters & Blacklisting
6.1 Why modprobe matters for power
Many drivers expose module parameters that can be set at load time (e.g., i915.enable_psr=1). These are supplied via a modprobe configuration file in /etc/modprobe.d/.
6.2 Syntax
File format: options <module> <key>=<value>.
Example /etc/modprobe.d/99-power.conf:
# /etc/modprobe.d/99-power.conf
options i915 enable_psr=1 enable_fbc=1 enable_guc=2
options amdgpu runpm=1
options nouveau powersave=1
options iwlwifi power_save=1 bt_coex_active=0
options snd_hda_intel power_save=1
options xhci_hcd autosuspend=1
6.3 Blacklisting Unwanted Modules
If a driver is known to prevent deep sleep (e.g., mei_me on some Intel platforms), blacklist it:
blacklist mei_me
blacklist mei
Add these lines to the same 99-power.conf file.
6.4 Persistent NVMe Power Settings
Create /etc/modprobe.d/nvme.conf:
options nvme_core default_ps_max_latency_us=0
6.5 GPU‑Specific Module Options
| Driver | Module | Option | Recommended value | Note |
|---|---|---|---|---|
| Intel i915 | i915 |
enable_psr |
1 |
Panel Self‑Refresh. |
| Intel i915 | i915 |
enable_fbc |
1 |
Frame Buffer Compression. |
| AMDGPU | amdgpu |
runpm |
1 |
Runtime PM. |
| Nouveau (NVIDIA) | nouveau |
powersave |
1 |
Power‑save mode. |
| Intel Wi‑Fi | iwlwifi |
power_save |
1 |
Enable Wi‑Fi power saving. |
| Realtek Wi‑Fi (rtl8723be) | rtl8723be |
fwlps=1 |
1 |
Firmware low‑power state. |
6.6 Reloading Module Options without Reboot
If you change a modprobe file, you can reload the module:
sudo modprobe -r i915
sudo modprobe i915
Warning: Unloading the graphics driver on an active X session will kill the display. Use a virtual console (Ctrl+Alt+F3) or reboot.7. Verifying Power‑Saving Behaviour
7.1 Using powertop
sudo powertop --html=powertop-report.html
Open the HTML file in a browser; look for:
- CPU C‑states (C1, C2, …) – higher percentages indicate deeper sleep.
- GPU Power – Panel Self‑Refresh (PSR) should be active.
- PCIe ASPM – shows if ASPM is enabled.
7.2 Checking C‑state Limits
cat /sys/devices/system/cpu/cpu0/cpuidle/state*/name
cat /sys/devices/system/cpu/cpu0/cpuidle/state*/disable
A 0 means the state is enabled.
7.3 Monitoring Battery Drain
Use upower or acpi:
upower -i $(upower -e | grep BAT)
Observe time to empty before and after changes.
7.4 Stress‑Testing for Stability
Run a short CPU stress test:
sudo apt install stress
stress --cpu 4 --timeout 120
Watch for freezes, excessive throttling, or kernel messages (dmesg | grep -i error).
Below is a fleshed‑out version of the sections you flagged as missing.
I kept the same numbering and titles you provided and expanded each bullet into a short‑to‑medium‑length paragraph (or a few paragraphs where appropriate). Feel free to trim, reorder, or add examples that match the rest of your document.
8. Testing, Benchmarking & Roll‑back
8.1 Stress testing
Before shipping a kernel or a power‑management configuration, you need to verify that the system remains stable under load. Typical stress‑testing tools include stress‑ng, sysbench, and Phoronix Test Suite. Run a mix of CPU, memory, I/O and GPU workloads while the power‑saving features (CPUFreq, runtime PM, autosuspend, etc.) are active. Monitor the kernel logs (dmesg -w), temperature sensors (sensors), and the power consumption (powertop or an external power meter). If you see frequent throttling, unexpected wake‑ups, or kernel oopses, isolate the offending component by toggling individual features.
8.2 Measuring battery life
Real‑world battery life is the ultimate metric for a laptop or embedded device. Use a repeatable workload (e.g., video playback, web browsing, compile‑heavy loops) and record the discharge curve with upower, acpi, or a dedicated power‑meter. The powertop --html report gives a nice visual of which devices are consuming the most power and how many wake‑ups they generate. For more scientific results, script the test so that the same sequence of actions (open a browser, start a video, run stress-ng --cpu 4) is performed on each build, then compute the average runtime until the battery reaches the shutdown threshold.
8.3 Reverting changes
Never assume a new kernel or config will work on every machine. Keep a rollback plan:
| Step | Action |
|---|---|
| 1 | Keep the previous kernel image and initramfs in /boot (e.g., vmlinuz-5.15.0‑old). |
| 2 | Add a GRUB menu entry for the old kernel (most distributions do this automatically). |
| 3 | Store the original sysctl.conf, modprobe.d/, and systemd service overrides in a version‑controlled directory (Git or a simple tarball). |
| 4 | Test the new kernel once, and if a regression appears, reboot and select the old entry. |
| 5 | If the new kernel is the only one left in the bootloader, use grub-reboot or efibootmgr to force a one‑time boot into the previous version. |
Document the exact git commit or package version you rolled back from, so you can reproduce the environment later.
9. Troubleshooting
9.1 Common symptoms
| Symptom | Typical cause | First‑look check |
|---|---|---|
| Rapid battery drain | Aggressive wake‑ups, missing autosuspend, high CPU frequency | powertop --summary → look for “Wake‑ups per second” |
| Cold‑boot hangs / long boot time | Stuck device initialization, kernel waiting on timeouts | systemd-analyze blame and journalctl -b -p err |
| Random freezes or lock‑ups | CPU throttling, over‑voltage, driver bugs | sensors for thermal throttling, dmesg for “CPU frequency scaling driver” errors |
| Wi‑Fi or Bluetooth disconnects after suspend | Power state not restored correctly | `dmesg |
9.2 Log‑based diagnostics
- Kernel ring buffer –
dmesg -T(timestamps) orjournalctl -kgive the most immediate clues. Look for lines containingPM:,CPUFreq:,autosuspend, or any “failed to set power state” messages. - Systemd journal –
journalctl -b -p 3filters for warnings and errors from the current boot. You can also query a specific service, e.g.,journalctl -u systemd-suspend.service. - Device‑specific logs – many drivers expose debugfs entries:
/sys/kernel/debug/pm_runtime– shows per‑device runtime‑PM usage counters./sys/kernel/debug/pm_trace– enables tracing of suspend/resume events (echo 1 > trace).
Collecting these logs before and after a reproducible step (e.g., plugging in a USB‑C dock) makes it far easier to spot the exact moment something goes wrong.
9.3 Kernel panics & boot loops
When a kernel panic occurs during early boot, you may only see a cryptic Kernel panic - not syncing: Fatal exception. Common culprits in the power‑management area are:
- Broken ACPI tables – try booting with
acpi=offoracpi=noirqto see if the panic disappears. If it does, the problem is likely a buggy BIOS; file a bug report to the vendor. - Mismatched CPUFreq governor – a governor that expects a missing cpufreq driver can cause a
BUG: unable to handle kernel paging request. Verify that the appropriate driver (intel_pstate,acpi-cpufreq, oramd_pstate) is loaded. - Incorrect device tree / platform data – on ARM boards, a missing
compatiblestring can cause the runtime‑PM core to dereference a null pointer.
Recovery steps:
- Boot into an older kernel (GRUB → “Advanced options”).
- Add
init=/bin/shto the kernel command line to drop into a minimal shell before most services start. - Mount the root filesystem read‑write (
mount -o remount,rw /). - Undo the last change (e.g., restore the original
cpufreqdriver, revert amodprobe.dblacklist, or delete a brokensystemdoverride). - Reboot and verify the system boots cleanly.
10. Advanced Topics
10.1 Dynamic runtime power management (DPM)
Modern kernels (≥ 5.4) expose Dynamic DPM for GPUs, NVMe, and other high‑performance devices. DPM works by exposing a set of performance states (P‑states) that the runtime‑PM core can switch between based on utilization. To enable it:
# For AMD GPU
echo "1" > /sys/class/drm/card0/device/power_dpm_state # "performance" or "battery"
echo "auto" > /sys/class/drm/card0/device/power_dpm_force_performance_level
The kernel automatically selects the lowest power state that satisfies the current workload. You can fine‑tune thresholds via /sys/module/amdgpu/parameters/dpm_forced_performance_level. Similar interfaces exist for Intel i915 (/sys/class/drm/card0/power_profile) and for NVMe (/sys/block/nvme0n1/power/control).
10.2 Using systemd power‑saving services
systemd ships a collection of power‑saving units that can be enabled or disabled per‑profile:
| Service | Purpose | Typical enable command |
|---|---|---|
systemd-suspend.service |
Handles suspend entry | systemctl enable systemd-suspend.service |
systemd-hibernate.service |
Handles hibernate | systemctl enable systemd-hibernate.service |
systemd-sleep.conf |
Global sleep settings (e.g., SuspendMode=freeze) |
Edit /etc/systemd/sleep.conf |
systemd-rfkill.service |
Turns off RF devices on suspend | systemctl enable systemd-rfkill.service |
systemd-power-profiles.service |
Provides D‑Bus API for powerprofilesctl |
systemctl enable systemd-power-profiles.service |
You can also create custom targets (power-saving.target) that pull in a set of services (e.g., disabling Bluetooth, lowering screen brightness, switching to a low‑power CPU governor) and then systemctl isolate power-saving.target before a long‑run battery test.
10.3 Interaction with user‑space tools
| Tool | What it controls | Typical integration point |
|---|---|---|
| TLP | Aggressive laptop power management (CPUFreq, SATA, Wi‑Fi, USB autosuspend) | Runs as a systemd service; respects kernel runtime‑PM settings. Use tlp-stat -s to verify active profile. |
| laptop‑mode‑tools | Writes /proc/sys/vm/laptop_mode and reduces disk writeback during battery |
Can be combined with TLP; disable overlapping settings (e.g., TLP_DISABLE_WIFI=1 if you use laptop‑mode’s Wi‑Fi power‑saving). |
power‑profiles‑daemon (powerprofilesctl) |
Exposes “performance”, “balanced”, and “power‑saver” profiles via DBus and UI front‑ends (GNOME, KDE) | Calls into the kernel via cpufreq-set and adjusts systemd services. Works nicely with the systemd-power-profiles.service mentioned above. |
When you enable more than one of these tools, be mindful of conflict zones (CPU governor, USB autosuspend, PCIe ASPM). The safest approach is to pick a primary manager (e.g., TLP) and disable the overlapping modules in the others (/etc/laptop-mode/conf.d/disable.conf, powerprofilesctl profile overrides, etc.).
11 . FAQ
| # | Question | Short answer |
|---|---|---|
| 1 | Why does my laptop still drain quickly even though powertop shows low wake‑ups? |
Battery drain can be caused by high static power (e.g., GPU at full clock, Wi‑Fi always on). Check tlp-stat -b or powertop --html for “Device Power Consumption” and look at the GPU P‑state and Wi‑Fi power‑saving mode. |
| 2 | Can I completely disable all CPU frequency scaling? | Yes, set the governor to performance and disable intel_pstate or acpi-cpufreq via kernel boot parameters (intel_pstate=disable). Note that this will increase power draw. |
| 3 | My USB‑C dock wakes the laptop even though autosuspend is on. | Many docks present a charging controller that signals activity. Add the device’s vendor/product ID to /etc/udev/rules.d/99-usb-autosuspend.rules with ATTR{autosuspend}="-1" to keep it always on, or explicitly blacklist it in TLP (USB_BLACKLIST="1234:abcd"). |
| 4 | How do I know if the BIOS/UEFI firmware is the culprit? | Look for ACPI errors in dmesg (e.g., “_SB_.PCI0._OSC failed”). Update the firmware, then test with acpi_osi= kernel parameters to hide the OS name from the BIOS. |
| 5 | Is it safe to run the system with acpi=off to avoid power‑management bugs? |
No. Disabling ACPI removes the ability to suspend, manage battery, and control many devices. Use it only for debugging a very early‑boot crash, then revert. |
12. References & Further Reading
| # | Reference | Link / Citation |
|---|---|---|
| 1 | Linux Kernel Documentation – Power Management | https://www.kernel.org/doc/html/latest/power/index.html |
| 2 | Intel® Power Management Guide (covers intel_pstate, ACPI, DPTF) |
https://www.intel.com/content/www/us/en/architecture-and-technology/intel-power-management-technology.html |
| 3 | ACPI Specification Rev 6.5 (official spec for _S0, _S3, etc.) |
https://uefi.org/specifications |
| 4 | TLP – Advanced Power Management for Linux (man page, config examples) | https://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html |
| 5 | systemd Power Profiles Daemon | https://www.freedesktop.org/wiki/Software/systemd/power-profiles/ |
| 6 | Phoronix Test Suite – Power Benchmarking | https://www.phoronix-test-suite.com/ |
| 7 | “Understanding Linux Power Management” – Red Hat Blog (Oct 2023) | https://developers.redhat.com/articles/2023/10/02/understanding-linux-power-management |
| 8 | “Dynamic Runtime Power Management for GPUs” – Linux Plumbers Conference 2024 slides | https://www.linuxplumbersconf.org/event/2024 |
| 9 | Arch Wiki – Laptop Mode Tools | https://wiki.archlinux.org/title/Laptop_mode |
| 10 | Ubuntu Community Help Wiki – Power Management | https://help.ubuntu.com/community/PowerManagement |
13 Appendix
A. Full example configuration files
/etc/tlp.conf (excerpt)
# TLP 1.6 configuration
# -------------------------------------------------------------------
# CPU scaling governor (on battery)
CPU_SCALING_GOVERNOR_ON_BAT=power-saver
# Minimum/maximum frequencies (kHz)
CPU_MIN_FREQ_ON_BAT=800000
CPU_MAX_FREQ_ON_BAT=1800000
# USB autosuspend
USB_AUTOSUSPEND=1
USB_BLACKLIST_BTUSB=1 # disable autosuspend for Bluetooth dongle
# Wi‑Fi power saving
WIFI_PWR_ON_BAT=5 # 5 = enable power save
# PCI Express Active State Power Management
PCI_EXPRESS_ASPM_ON_BAT=ondemand
# Runtime PM for SATA
SATA_LINKPWR_ON_BAT=min_power
/etc/systemd/sleep.conf.d/10-custom.conf
[Sleep]
SuspendMode=freeze
HibernateMode=shutdown
/etc/udev/rules.d/99-usb-autosuspend.rules
# Keep external docking stations always powered (vendor:product)
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="abcd", ATTR{autosuspend}="-1"
B. Glossary of terms
| Term | Definition |
|---|---|
| Autosuspend | Runtime‑PM feature where a device is automatically placed into a low‑power state after a configurable idle period. |
| P‑state | Processor performance state; a combination of frequency and voltage. Lower numbers = higher performance. |
| C‑state | CPU idle state; deeper C‑states consume less power but have higher exit latency. |
| ACPI | Advanced Configuration and Power Interface – firmware‑level spec that the kernel uses to enumerate power states and device dependencies. |
| DPM | Dynamic Power Management – the kernel’s ability to change device power states on‑the‑fly based on utilization. |
systemd target |
A collection of units (services, sockets, etc.) that can be started together; analogous to a runlevel. |
powertop “wake‑ups” |
Number of times a device interrupts the CPU from an idle state per second. |
intel_pstate |
Intel’s native CPU frequency scaling driver; replaces the generic acpi-cpufreq on many Intel CPUs. |
tlp-stat |
TLP utility that prints the current power‑management status, useful for debugging. |
powerprofilesctl |
CLI front‑end for systemd-power-profiles-daemon that switches between “performance”, “balanced”, and “power‑saver”. |