How to optimize laptop battery life with TLP on Linux
When using Linux on mobile devices such as Laptops, it is very important to tune the right kernel parameters in order to optimize battery life. Tlp is a highly customizable, free and open source command line utility released under the GPLv2 license (the source code is hosted on github) created with this exact goal. In this tutorial we see how to install Tlp on some of the most used Linux distributions, and how to configure it.
In this tutorial you will learn:
- How to install Tlp
- How to configure Tlp
- How to check power saving status using tlp-stat
Introduction to Tlp
Software requirements and conventions used
|Category||Requirements, Conventions or Software Version Used|
|Software||tlp, tlp-rdw (for radio device wizard)|
|Other||Root privileges to perform administrative tasks|
|Conventions||# – requires given linux-commands to be executed|
with root privileges either directly as a root user or
by use of
$ – requires given linux-commands to be executed
as a regular non-privileged user
Tlp is available in the repositories of the most used Linux distributions, therefore all we need to do to install it, is to use our favorite package manager. The base package we need to install is called
tlp; additionally, if we intend to use the radio device wizard to enable or disable radio interfaces when certain events occur, we need to install the
Fedora is the community distribution of the Red Hat family, and uses the
dnf package manager to install or remove software packages. To install Tlp, all we need to do is to launch the following command:
$ sudo dnf install tlp tlp-rdw
Debian is one of the most widespread and stable Linux distributions, and represents the base for many derivatives such as Ubuntu and Linux Mint. The “modern” way to install software on this distribution is to use the
apt wrapper, which provides a friendly user interface over
apt-get and other commands:
$ sudo apt install tlp tlp-rdw
Tlp is available also in the Archlinux “community” repository. To install the software on Arch, we use the
pacman package manager:
$ sudo pacman -Sy tlp tlp-rdw
Once Tlp is installed on our system, we need to start the related service, and enable it at boot (on Fedora and Debian the service should be automatically started as part of the installation). Nowadays almost all distributions use Systemd as init manager, therefore to perform such tasks we can use the
$ sudo systemctl enable --now tlp.service
To configure Tlp and adjust it to better suite our needs, we have basically two options:
- Edit the
- Drop configuration files in the
What approach should we adopt? That depends. If we open the main Tlp configuration file,
/etc/tlp.conf, we can see how all its content is commented. For each option available a brief description is provided, including its default value and often the suggested one. To change the value of an option we need to remove the comment from the appropriate line and assign the desired value to the corresponding variable. This approach is easier to adopt if we are modifying settings manually.
As an alternative, we can create one or more settings files containing the options we want to use and their values, and drop them inside the
/etc/tlp.d directory. Each one of those files should have the “.conf” extension in its name. This approach can be more convenient, for example, if we are deploying tlp as part of an automated installation performed with Ansible or Kickstart.
As we already said, the parameters set by Tlp are very well described inside the main configuration file, In the course of this tutorial, however, we will further investigate some of them, and see what Kernel subsystems they operate on. Let’s go.
One of the first options we meet inside the main Tlp configuration file are
MAX_LOST_WORK_SECS. A value can be assigned to them depending if running on power adapter (ON_AC) or on battery (ON_BAT). Those options, under the hood, make use of one feature of the Linux kernel which is called “laptop mode“. When laptop mode is active, what changes is basically how Linux handles “dirty data“: the data in memory that needs to be written to disk.
The value we assign to
DISK_IDLE_SECS_ON_BAT are written to the
/sys/proc/vm/laptop_mode file. A value greater than
0 enables laptop mode, and represents the number of seconds after the disk goes idle, before attempting to perform a data sync. The default value used by tlp, when power adapter is plugged in, is
0; on battery power,
2 is used instead.
The other option which modifies the behavior of laptop mode is
MAX_LOST_WORK_SECS. The value for this option in the Tlp settings file is expressed in seconds; under the hood, the value is converted in centiseconds (multiplied by 100) and written to the following system files:
Each one of those files has a different role. The kernel periodically uses “flusher threads” to write “old” data to disk: the value written in the
/proc/sys/vm/dirty_writeback_centisecs file, expresses the interval between these flushes should run. What data has to be considered “old”? This is established by the value written to the
/proc/sys/vm/dirty_expire_centisecs file: data which has been in memory for an interval of time longer than it, will be considered “old”.
/proc/sys/fs/xfs/xfssyncd_centisecs files, as it can be inferred by their names, influence the behavior of the xfs filesystem. The value inside the former represents the interval of time after which the dirty metadata buffers list is scanned, and the value inside the latter, establish the interval of time after which metadata is written to disk.
Setting the scaling Governor
Tlp can be used to set a Cpu scaling governor depending on the power source of a machine. A scaling governor sets and change the frequency of a CPU depending on certain factors. How the frequency is changed depends on the governor in use. The available cpu governors can be retrieved by querying the
/sys/devices/system/cpu/<cpun>/cpufreq/scaling_available_governors file, where <cpun> must be substituted by the cpu number, for example:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
The above command should return something like:
conservative ondemand userspace powersave performance schedutil
To set the scaling governor with Tlp, we must use the name of the governor as the value of the
CPU_SCALING_GOVERNOR_ON_BAT options. Under the hood, Tlp will write the desired choice into the
Tlp allows also the user to easily fine tune also the maximum and minium frequencies for the selected scaling governor via the
CPU_SCALING_MAX_FREQ_ON_BAT options. The provided values will be written in the
Using the Intel HDA powersave
Another useful strategy to lower power consumption when running on battery, is to enable power saving for Intel HDA (High Definition Audio) devices. Tlp allows us to enable this strategy via the
SOUND_POWER_SAVE_ON_BATvariables. A value of
0 disables the feature, while a bigger value enables it, and represents the number of seconds of inactivity after which the device should be put in power saving mode. Tlp writes the passed value to the
/sys/module/snd_ac97_codec/parameters/power_save files. This feature is enabled by default on both battery and ac.
The audio controller is also disabled when in power saving mode. This is controlled via the
SOUND_POWER_SAVE_CONTROLLER option, which can be set to
'Y‘ or ‘
N‘, to respectively enable and disable the feature. The system file which controls this parameter is
Setting battery thresholds
On certain machines, for examples on Thinkpads, the system firmware allows to set battery charging thresholds. This feature is really useful to preserve battery life. Modern lithium batteries potentially lost capacity when completely discharged or continuously kept at their maximum power level. By setting charging thresholds we can adjust charging behavior to our needs.
If the machine is seldom used on battery, for example, we can set the lower and upper thresholds to
50 respectively, in order to avoid complete battery cycles and overheating. If we often use the machine on battery, instead, we can set lower threshold to
85 and maximum to
95, for example (values are suggested on the lenovo page). The system will start charging the battery only if the charge percentage is below the minimum threshold, and will stop when the upper threshold is reached. Tlp controls this feature via the
STOP_CHARGE_THRESH_BAT0 variables. If our system has more than one battery we can add a dedicated setting by adding the same settings for BAT1, etc. The passed values are written to the
Disabling radio interfaces on specific events
By using Tlp, we have the chance to enable or disable specific radio interfaces when certain events occur; for example, we can disconnect the wifi card(s) when the system is connected to the LAN via ethernet. Tlp controls this via the following options:
The names of the variables are pretty self-explanatory. They accept a comma-delimited, space separated list of device types as their value. For example, to disable all wifi devices when the system is connected to LAN with a cable, we would write:
Tlp allows us also to disable devices on other events, like power adapter or dock connection or disconnection.
Checking power saving status using tlp-stat
To check the current power-saving status, we can use an utility which comes with tlp:
tlp-status. This utility let us view various information such as the value of tlp settings, kernel configurations and battery data. When invoked without any option, tlp-stat prints all available information:
$ sudo tlp-stat
Here is an excerpt of the returned data (output truncated):
--- TLP 1.4.0 -------------------------------------------- +++ Configured Settings: defaults.conf L0004: TLP_ENABLE="1" defaults.conf L0005: TLP_WARN_LEVEL="3" defaults.conf L0006: TLP_PERSISTENT_DEFAULT="0" defaults.conf L0007: DISK_IDLE_SECS_ON_AC="0" defaults.conf L0008: DISK_IDLE_SECS_ON_BAT="2" defaults.conf L0009: MAX_LOST_WORK_SECS_ON_AC="15" [...] +++ System Info System = ASUSTeK Computer Inc. 1.0 K52F BIOS = K52F.218 OS Release = Fedora Linux 35 (Thirty Five) Kernel = 5.15.18-200.fc35.x86_64 #1 SMP Sat Jan 29 13:54:17 UTC 2022 x86_64 [...] +++ TLP Status State = enabled RDW state = not installed Last run = 09:22:18 AM, 23834 sec(s) ago Mode = AC Power source = AC [...]
Returned information can be filtered by using the appropriate options. To show only battery data, for example we would run:
$ sudo tlp-stat --battery
In the same way, to make so that only information about USB devices are displayed, we can use the
--usb option. For the complete set of options which can be used, please take a look at the manpage of the utility.
In this tutorial we saw how to install and configure Tlp on some of the most used Linux distributions, and how we can configure it to optimize battery life on Linux. We saw what is the main configuration file, some of the directives contained in it, and how the passed settings are written under to system files, under the hood. Tlp can be used to perform a vast range of other power saving tweaks: the best way to know them is to take a look at the configuration file and see how they are implemented.