throttled is a Linux daemon that prevents unwanted CPU throttling on some
Intel-based systems. It periodically restores package power limits (PL1/PL2)
and the temperature target in MSR and MCHBAR registers when firmware or the
embedded controller resets them.
It also supports separate AC and battery profiles, undervolting, IccMax, cTDP, HWP hints, and live throttling diagnostics.
Caution
throttled runs as root and writes directly to CPU and chipset registers.
Incorrect power, temperature, voltage, or current values can make a system
unstable or damage hardware. Review the configuration for your CPU and
cooling system before enabling the service.
Use throttled when an Intel laptop or small-form-factor system runs below its
expected frequency because firmware repeatedly applies overly conservative
power or temperature limits. Confirm the problem first with
s-tui, turbostat, or:
sudo throttled --monitorThe project started as a workaround for the Lenovo T480, T480s, and X1 Carbon Gen 6, but users have reported success on many Lenovo, Dell, HP, Microsoft, and ASUS systems. Support depends on the CPU, firmware, and kernel rather than the laptop brand. See the community-reported hardware list.
- Restores configurable PL1, PL2, time-window, and temperature limits.
- Uses independent AC and battery profiles and reacts to power-source changes.
- Re-applies settings after suspend and hibernation through system D-Bus.
- Supports configurable CPU, cache, GPU, System Agent, and Analog I/O undervolting where firmware permits it.
- Supports IccMax overrides and experimental cTDP, HWP, and BD PROCHOT controls.
- Reloads
/etc/throttled.confautomatically when the file changes. - Reports thermal, power, current, and cross-domain throttling causes in real time.
- Runs with systemd, OpenRC, or runit.
The latest release provides native packages and Python distributions. Native packages include the daemon, default configuration, and service definition.
| System | Package |
|---|---|
Debian-family system with python3-dbus-fast |
DEB |
| Fedora-family system | RPM |
| Alpine edge/testing | APK |
| Python 3.10+ | wheel |
| Packagers | source archive |
Verify downloads with the
SHA256SUMS
file published with the release.
DEB:
sudo apt install ./throttled_0.12.2_all.debOn a running systemd host, the DEB enables and starts the service.
Fedora:
sudo dnf install ./throttled-0.12.2-1.noarch.rpm
sudo systemctl enable --now throttled.serviceAlpine:
doas apk add --allow-untrusted ./throttled_0.12.2-1_noarch.apk
doas rc-update add throttled default
doas rc-service throttled startThe upstream APK is not repository-signed, which is why local installation
requires --allow-untrusted.
The wheel installs the throttled command only. It does not install the
privileged service, OS dependencies, or /etc/throttled.conf; end users should
prefer a native package or the source installer.
- Arch Linux:
sudo pacman -S throttled - Alpine edge/testing:
doas apk add throttled - Fedora: Copr package
- Gentoo:
sudo emerge -av sys-power/throttled
Distribution packages are maintained independently and can lag behind the latest upstream release.
Install Python 3.10 or newer, the Python virtual-environment tooling, git,
kmod, pciutils, and UPower using your distribution package manager. Then:
git clone https://github.com/erpalma/throttled.git
cd throttled
sudo ./install.shThe installer creates an isolated environment in /opt/throttled, preserves
an existing /etc/throttled.conf, detects systemd, OpenRC, or runit, and
enables the service. Use --init systemd|openrc|runit to override detection,
or --no-start to install without enabling or starting it.
The configuration file is /etc/throttled.conf. It contains separate [AC]
and [BATTERY] profiles for power limits, update intervals, temperature
targets, and experimental controls:
[GENERAL]
Enabled: True
Autoreload: True
[AC]
Update_Rate_s: 5
PL1_Tdp_W: 44
PL1_Duration_s: 28
PL2_Tdp_W: 44
PL2_Duration_S: 0.002
Trip_Temp_C: 95
[BATTERY]
Update_Rate_s: 30
PL1_Tdp_W: 29
PL1_Duration_s: 28
PL2_Tdp_W: 44
PL2_Duration_S: 0.002
Trip_Temp_C: 85These are project defaults, not recommendations for every system. Check your
processor limits and cooling capacity before changing them. The service reloads
valid configuration changes automatically when Autoreload is enabled.
Voltage offsets can be configured independently in [UNDERVOLT.AC] and
[UNDERVOLT.BATTERY]. Only zero or negative millivolt values are accepted.
Start at zero and test small changes under load; values stable on one CPU can
crash another CPU of the same model.
Undervolting is disabled by firmware or microcode on many newer Intel systems.
throttled cannot bypass a locked voltage interface.
IccMax values in [ICCMAX.AC] and [ICCMAX.BATTERY] are absolute current
limits in amperes, not offsets. Inspect the system defaults with --monitor
before enabling them.
Check the service:
systemctl status throttled.service
journalctl -u throttled.service -bOn OpenRC, use rc-service throttled status; on runit, use
sv status throttled.
Monitor throttling causes and register values:
sudo throttled --monitor
sudo throttled --monitor 0.5
sudo throttled --debugThe monitor distinguishes thermal, power, current, and cross-domain limits.
--debug reads back written values and prints CPU feature and thermal status
information. Both commands run the control loop in the foreground, so stop the
service first to avoid running two instances and press Ctrl+C when finished.
Run throttled --help for all command-line options.
- Linux on a supported Intel CPU.
- Python 3.10 or newer.
- Access to
/dev/cpu/*/msrand/dev/mem. - A kernel with
CONFIG_X86_MSRandCONFIG_DEVMEM. dbus-fast, a running system D-Bus, UPower,modprobe, andsetpci.- Root privileges; containers, Flatpak, Snap, and AppImage sandboxes are not supported deployment targets.
Secure Boot commonly enables Kernel Lockdown, which can block the MSR and PCI
BAR access required by throttled. Check the service log and
/sys/kernel/security/lsm before changing security settings. Disabling Secure
Boot or Kernel Lockdown reduces system protection and should be an informed,
system-specific decision. Hardened kernels can deny /dev/mem access even
without Lockdown.
thermald can conflict by applying its own RAPL or temperature policy. Do not
disable it blindly: some platforms work better with thermald --adaptive.
Compare monitoring output with each setup and keep the policy that behaves
correctly on your hardware.
TLP only overlaps with throttled when the experimental HWP_Mode setting is
enabled. In that case, disable TLP's CPU_ENERGY_PERF_POLICY_ON_* settings by
assigning an empty string, as described in the
TLP conflict guide. Avoid running
multiple tools that continuously overwrite the same HWP/EPP policy.
Manufacturer utilities can persist quiet or power-saving profiles in firmware, so settings previously selected in another operating system may continue to limit performance after booting Linux.
If firmware does not repeatedly reset the limits, the kernel's intel_rapl
interface may be sufficient and avoids a resident daemon. See the
static RAPL alternative.
For a native package, use the distribution package manager and review changes
to /etc/throttled.conf after upgrading.
For a source installation:
cd throttled
git pull --ff-only
sudo ./install.shTo stop and disable the service:
sudo systemctl disable --now throttled.serviceOpenRC users can run sudo rc-service throttled stop followed by
sudo rc-update del throttled default. Runit users can run
sudo sv down throttled and remove the /var/service/throttled link. Remove
native packages with the corresponding package manager.
Build the Python wheel and source archive:
python3 -m pip install build
python3 -m buildBuild all native package formats with nFPM:
./scripts/build-packages.shUse --packager deb, --packager rpm, or --packager apk to select a
format. The lightweight DEB builder only requires dpkg-deb:
./scripts/build-deb.shSee the packaging guide for the runtime and filesystem contract, dependency mapping, service lifecycle, and downstream packaging notes.
Run the test suite with:
python3 -m unittest discover -s testsBug reports and pull requests are welcome in the issue tracker.
The project was created for a
firmware throttling problem
seen on the 2018 Lenovo ThinkPad generation. It was originally installed as
lenovo_fix and was renamed to throttled in 2021. Current installations use
/etc/throttled.conf, the throttled command, and throttled.service.
throttled is available under the
MIT License.