# TuneD documentation: Optimizing system throughput, latency, and power consumption

version 2.10.0, 2019-01-04

This documentation explains how to use the TuneD application to monitor and optimize the throughput, latency, and power consumption of your system in different scenarios.

## Getting started with TuneD

As a system administrator, you can use the TuneD application to optimize the performance profile of your system for a variety of use cases.

### The purpose of TuneD

TuneD is a service that monitors your system and optimizes the performance under certain workloads. The core of TuneD are profiles, which tune your system for different use cases.

TuneD is distributed with a number of predefined profiles for use cases such as:

- High throughput

- Low latency

- Saving power

It is possible to modify the rules defined for each profile and customize how to tune a particular device. When you switch to another profile or deactivate TuneD, all changes made to the system settings by the previous profile revert back to their original state.

You can also configure TuneD to react to changes in device usage and adjusts settings to improve performance of active devices and reduce power consumption of inactive devices.

### TuneD profiles

A detailed analysis of a system can be very time-consuming. TuneD provides a number of predefined profiles for typical use cases. You can also create, modify, and delete profiles.

The profiles provided with TuneD are divided into the following categories:

- Power-saving profiles

- Performance-boosting profiles

The performance-boosting profiles include profiles that focus on the following aspects:

- Low latency for storage and network

- High throughput for storage and network

- Virtual machine performance

- Virtualization host performance

#### Syntax of profile configuration

The `tuned.conf` file can contain one `[main]` section and other sections for configuring plug-in instances. However, all sections are optional.

Lines starting with the hash sign (`#`) are comments.

Additional resources

- `tuned.conf(5)` man page.

### The default TuneD profile

During the installation, the best profile for your system is selected automatically. Currently, the default profile is selected according to the following customizable rules:

Environment | Default profile | Goal
--- | --- | ---
Compute nodes | `throughput-performance` | The best throughput performance
Virtual machines | `virtual-guest` | The best performance. If you are not interested in the best performance, you can change it to the `balanced` or `powersave` profile.
Other cases | `balanced` | Balanced performance and power consumption

Additional resources

- `tuned.conf(5)` man page.

### Merged TuneD profiles

As an experimental feature, it is possible to select more profiles at once. TuneD will try to merge them during the load.

If there are conflicts, the settings from the last specified profile takes precedence.

Example 1. Low power consumption in a virtual guest

The following example optimizes the system to run in a virtual machine for the best performance and concurrently tunes it for low power consumption, while the low power consumption is the priority:

    # tuned-adm profile virtual-guest powersave

Warning

Merging is done automatically without checking whether the resulting combination of parameters makes sense. Consequently, the feature might tune some parameters the opposite way, which might be counterproductive: for example, setting the disk for high throughput by using the `throughput-performance` profile and concurrently setting the disk spindown to the low value by the `spindown-disk` profile.

Additional resources

- `tuned.conf(5)` man page.

### The location of TuneD profiles

TuneD stores profiles in the following directories:

`/usr/lib/tuned/profiles/`

  Distribution-specific profiles are stored in the `/usr/lib/tuned/profiles/` directory. Each profile has its own directory. The profile consists of the main configuration file called `tuned.conf`, and optionally other files, for example helper scripts.

`/etc/tuned/profiles/`

  If you need to customize a profile, copy the profile directory into the `/etc/tuned/profiles/` directory, which is used for custom profiles, and then adjust it. If there is a system profile and a custom profile of the same name, the custom profile located in `/etc/tuned/profiles` is used.

Example 2. User-defined profile directories

If you want to make TuneD load profiles from a directory other than `/usr/lib/tuned/profiles/` and `/etc/tuned/profiles/`, you can list it in `/etc/tuned/tuned-main.conf` as follows:

    profile_dirs=/usr/lib/tuned/profiles,/etc/tuned/profiles,/my/custom/profiles

In this example, profiles are loaded also from `/my/custom/profiles/`. If two directories contain profiles with the same names, the one that is listed later takes precedence.

Additional resources

- `tuned.conf(5)` man page.

### TuneD profiles distributed with RHEL

The following is a list of profiles that are installed with TuneD on Red Hat Enterprise Linux.

Note | There might be more product-specific or third-party TuneD profiles available. Such profiles are usually provided by separate RPM packages.

`balanced`

  The default power-saving profile. It is intended to be a compromise between performance and power consumption. It uses auto-scaling and auto-tuning whenever possible. The only drawback is the increased latency. In the current TuneD release, it enables the CPU, disk, audio, and video plugins, and activates the `conservative` CPU governor. The `radeon_powersave` option uses the `dpm-balanced` value if it is supported, otherwise it is set to `auto`.

  It changes the `energy_performance_preference` attribute to the `normal` energy setting. It also changes the `scaling_governor` policy attribute to either the `conservative` or `powersave` CPU governor.

`powersave`

  A profile for maximum power saving performance. It can throttle the performance in order to minimize the actual power consumption. In the current TuneD release it enables USB autosuspend, WiFi power saving, and Aggressive Link Power Management (ALPM) power savings for SATA host adapters. It also schedules multi-core power savings for systems with a low wakeup rate and activates the `ondemand` governor. It enables AC97 audio power saving or, depending on your system, HDA-Intel power savings with a 10 seconds timeout. If your system contains a supported Radeon graphics card with enabled KMS, the profile configures it to automatic power saving. On ASUS Eee PCs, a dynamic Super Hybrid Engine is enabled.

  It changes the `energy_performance_preference` attribute to the `powersave` or `power` energy setting. It also changes the `scaling_governor` policy attribute to either the `ondemand` or `powersave` CPU governor.

  Note

  In certain cases, the `balanced` profile is more efficient compared to the `powersave` profile.

  Consider there is a defined amount of work that needs to be done, for example a video file that needs to be transcoded. Your machine might consume less energy if the transcoding is done on the full power, because the task is finished quickly, the machine starts to idle, and it can automatically step-down to very efficient power save modes. On the other hand, if you transcode the file with a throttled machine, the machine consumes less power during the transcoding, but the process takes longer and the overall consumed energy can be higher.

  That is why the `balanced` profile can be generally a better option.

`throughput-performance`

  A server profile optimized for high throughput. It disables power savings mechanisms and enables `sysctl` settings that improve the throughput performance of the disk and network IO. CPU governor is set to `performance`.

  It changes the `energy_performance_preference` and `scaling_governor` attribute to the `performance` profile.

`accelerator-performance`

  The `accelerator-performance` profile contains the same tuning as the `throughput-performance` profile. Additionally, it locks the CPU to low C states so that the latency is less than 100us. This improves the performance of certain accelerators, such as GPUs.

`latency-performance`

  A server profile optimized for low latency. It disables power savings mechanisms and enables `sysctl` settings that improve latency. CPU governor is set to `performance` and the CPU is locked to the low C states (by PM QoS).

  It changes the `energy_performance_preference` and `scaling_governor` attribute to the `performance` profile.

`network-latency`

  A profile for low latency network tuning. It is based on the `latency-performance` profile. It additionally disables transparent huge pages and NUMA balancing, and tunes several other network-related `sysctl` parameters.

  It inherits the `latency-performance` profile which changes the `energy_performance_preference` and `scaling_governor` attribute to the `performance` profile.

`hpc-compute`

  A profile optimized for high-performance computing. It is based on the `latency-performance` profile.

`network-throughput`

  A profile for throughput network tuning. It is based on the `throughput-performance` profile. It additionally increases kernel network buffers.

  It inherits either the `latency-performance` or `throughput-performance` profile, and changes the `energy_performance_preference` and `scaling_governor` attribute to the `performance` profile.

`virtual-guest`

  A profile designed for virtual guests based on the `throughput-performance` profile that, among other tasks, decreases virtual memory swappiness and increases disk readahead values. It does not disable disk barriers.

  It inherits the `throughput-performance` profile and changes the `energy_performance_preference` and `scaling_governor` attribute to the `performance` profile.

`virtual-host`

  A profile designed for virtual hosts based on the `throughput-performance` profile that, among other tasks, decreases virtual memory swappiness, increases disk readahead values, and enables a more aggressive value of dirty pages writeback.

  It inherits the `throughput-performance` profile and changes the `energy_performance_preference` and `scaling_governor` attribute to the `performance` profile.

`oracle`

  A profile optimized for Oracle databases loads based on `throughput-performance` profile. It additionally disables transparent huge pages and modifies other performance-related kernel parameters. This profile is provided by the `tuned-profiles-oracle` package.

`desktop`

  A profile optimized for desktops, based on the `balanced` profile. It additionally enables scheduler autogroups for better response of interactive applications.

`cpu-partitioning`

  The `cpu-partitioning` profile partitions the system CPUs into isolated and housekeeping CPUs. To reduce jitter and interruptions on an isolated CPU, the profile clears the isolated CPU from user-space processes, movable kernel threads, interrupt handlers, and kernel timers.

  A housekeeping CPU can run all services, shell processes, and kernel threads.

  You can configure the `cpu-partitioning` profile in `/etc/tuned/cpu-partitioning-variables.conf` file. The configuration options are:

  `isolated_cores=cpu-list`

    Lists CPUs to isolate. The list of isolated CPUs is comma-separated or the user can specify the range. You can specify a range using a dash, such as `3-5`. This option is mandatory. Any CPU missing from this list is automatically considered a housekeeping CPU.

  `no_balance_cores=cpu-list`

    Lists CPUs which are not considered by the kernel during system wide process load-balancing. This option is optional. This is usually the same list as `isolated_cores`.

  For more information on `cpu-partitioning`, see the `tuned-profiles-cpu-partitioning(7)` man page.

`optimize-serial-console`

  A profile that tunes down I/O activity to the serial console by reducing the printk value. This should make the serial console more responsive. This profile is intended to be used as an overlay on other profiles. For example:

      # tuned-adm profile throughput-performance optimize-serial-console

`mssql`

  A profile provided for Microsoft SQL Server. It is based on the `thoguhput-performance` profile.

`postgresql`

  A profile optimized for PostgreSQL databases loads based on `throughput-performance` profile. It additionally disables transparent huge pages and modifies other performance-related kernel parameters. This profile is provided by the `tuned-profiles-postgresql` package.

`intel-sst`

  A profile optimized for systems with user-defined Intel Speed Select Technology configurations. This profile is intended to be used as an overlay on other profiles. For example:

      # tuned-adm profile cpu-partitioning intel-sst

### Real-time TuneD profiles distributed with RHEL

Real-time profiles are intended for systems running the real-time kernel. Without a special kernel build, they do not configure the system to be real-time. On RHEL, the profiles are available from additional repositories.

The following real-time profiles are available:

`realtime`

  Use on bare-metal real-time systems.

  Provided by the `tuned-profiles-realtime` package, which is available from the RT or NFV repositories.

`realtime-virtual-host`

  Use in a virtualization host configured for real-time.

  Provided by the `tuned-profiles-nfv-host` package, which is available from the NFV repository.

`realtime-virtual-guest`

  Use in a virtualization guest configured for real-time.

  Provided by the `tuned-profiles-nfv-guest` package, which is available from the NFV repository.

### Static and dynamic tuning in TuneD

This section explains the difference between the two categories of system tuning that TuneD applies: static and dynamic.

Static tuning

  Mainly consists of the application of predefined `sysctl` and `sysfs` settings and one-shot activation of several configuration tools such as `ethtool`.

Dynamic tuning

  Watches how various system components are used throughout the uptime of your system. TuneD adjusts system settings dynamically based on that monitoring information.

  For example, the hard drive is used heavily during startup and login, but is barely used later when the user might mainly work with applications such as web browsers or email clients. Similarly, the CPU and network devices are used differently at different times. TuneD monitors the activity of these components and reacts to the changes in their use.

  By default, dynamic tuning is disabled. To enable it, edit the `/etc/tuned/tuned-main.conf` file and change the `dynamic_tuning` option to `1`. TuneD then periodically analyzes system statistics and uses them to update your system tuning settings. To configure the time interval in seconds between these updates, use the `update_interval` option.

  Currently implemented dynamic tuning algorithms try to balance the performance and powersave, and are therefore disabled in the performance profiles. Dynamic tuning for individual plug-ins can be enabled or disabled in the TuneD profiles.

Example 3. Static and dynamic tuning on a workstation

On a typical office workstation, the Ethernet network interface is inactive most of the time. Only a few emails go in and out or some web pages might be loaded.

For those kinds of loads, the network interface does not have to run at full speed all the time, as it does by default. TuneD has a monitoring and tuning plug-in for network devices that can detect this low activity and then automatically lower the speed of that interface, typically resulting in a lower power usage.

If the activity on the interface increases for a longer period of time, for example because a DVD image is being downloaded or an email with a large attachment is opened, TuneD detects this and sets the interface speed to maximum to offer the best performance while the activity level is high.

This principle is used for other plug-ins for CPU and disks as well.

### TuneD no-daemon mode

You can run TuneD in `no-daemon` mode, which does not require any resident memory. In this mode, TuneD applies the settings and exits.

By default, `no-daemon` mode is disabled because a lot of TuneD functionality is missing in this mode, including:

- D-Bus support

- Hot-plug support

- Rollback support for settings

To enable `no-daemon` mode, include the following line in the `/etc/tuned/tuned-main.conf` file:

    daemon = 0

### Installing and enabling TuneD

This procedure installs and enables the TuneD application, installs TuneD profiles, and presets a default TuneD profile for your system.

Procedure

1. Install the `tuned` package:

       # yum install tuned

2. Enable and start the `tuned` service:

       # systemctl enable --now tuned

3. Optionally, install TuneD profiles for real-time systems:

       # yum install tuned-profiles-realtime tuned-profiles-nfv

4. Verify that a TuneD profile is active and applied:

       $ tuned-adm active

       Current active profile: balanced

       $ tuned-adm verify

       Verification succeeded, current system settings match the preset profile.
       See TuneD log file ('/var/log/tuned/tuned.log') for details.

### Listing available TuneD profiles

This procedure lists all TuneD profiles that are currently available on your system.

Procedure

- To list all available TuneD profiles on your system, use:

      $ tuned-adm list

      Available profiles:
      - balanced               - General non-specialized tuned profile
      - desktop                - Optimize for the desktop use-case
      - latency-performance    - Optimize for deterministic performance at the cost of increased power consumption
      - network-latency        - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
      - network-throughput     - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
      - powersave              - Optimize for low power consumption
      - throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
      - virtual-guest          - Optimize for running inside a virtual guest
      - virtual-host           - Optimize for running KVM guests
      Current active profile: balanced

- To display only the currently active profile, use:

      $ tuned-adm active

      Current active profile: balanced

Additional resources

- The `tuned-adm(8)` man page.

### Setting a TuneD profile

This procedure activates a selected TuneD profile on your system.

Prerequisites

- The `tuned` service is running. See Installing and Enabling Tuned for details.

Procedure

1. Optionally, you can let TuneD recommend the most suitable profile for your system:

       # tuned-adm recommend

       balanced

2. Activate a profile:

       # tuned-adm profile selected-profile

   Alternatively, you can activate a combination of multiple profiles:

       # tuned-adm profile profile1 profile2

   Example 4. A virtual machine optimized for low power consumption

   The following example optimizes the system to run in a virtual machine with the best performance and concurrently tunes it for low power consumption, while the low power consumption is the priority:

       # tuned-adm profile virtual-guest powersave

3. View the current active TuneD profile on your system:

       # tuned-adm active

       Current active profile: selected-profile

4. Reboot the system:

       # reboot

Verification steps

- Verify that the TuneD profile is active and applied:

      $ tuned-adm verify

      Verification succeeded, current system settings match the preset profile.
      See TuneD log file ('/var/log/tuned/tuned.log') for details.

Additional resources

- `tuned-adm(8)` man page

### Disabling TuneD

This procedure disables TuneD and resets all affected system settings to their original state before TuneD modified them.

Procedure

- To disable all tunings temporarily:

      # tuned-adm off

  The tunings are applied again after the `tuned` service restarts.

- Alternatively, to stop and disable the `tuned` service permanently:

      # systemctl disable --now tuned

Additional resources

- `tuned-adm(8)` man page

### Related information

- The `tuned(8)` man page

- The `tuned-adm(8)` man page

- The TuneD project website: https://tuned-project.org/

## Customizing TuneD profiles

You can create or modify TuneD profiles to optimize system performance for your intended use case.

Prerequisites

- Install and enable TuneD as described in Installing and Enabling Tuned for details.

### TuneD profiles

A detailed analysis of a system can be very time-consuming. TuneD provides a number of predefined profiles for typical use cases. You can also create, modify, and delete profiles.

The profiles provided with TuneD are divided into the following categories:

- Power-saving profiles

- Performance-boosting profiles

The performance-boosting profiles include profiles that focus on the following aspects:

- Low latency for storage and network

- High throughput for storage and network

- Virtual machine performance

- Virtualization host performance

#### Syntax of profile configuration

The `tuned.conf` file can contain one `[main]` section and other sections for configuring plug-in instances. However, all sections are optional.

Lines starting with the hash sign (`#`) are comments.

Additional resources

- `tuned.conf(5)` man page.

### The default TuneD profile

During the installation, the best profile for your system is selected automatically. Currently, the default profile is selected according to the following customizable rules:

Environment | Default profile | Goal
--- | --- | ---
Compute nodes | `throughput-performance` | The best throughput performance
Virtual machines | `virtual-guest` | The best performance. If you are not interested in the best performance, you can change it to the `balanced` or `powersave` profile.
Other cases | `balanced` | Balanced performance and power consumption

Additional resources

- `tuned.conf(5)` man page.

### Merged TuneD profiles

As an experimental feature, it is possible to select more profiles at once. TuneD will try to merge them during the load.

If there are conflicts, the settings from the last specified profile takes precedence.

Example 5. Low power consumption in a virtual guest

The following example optimizes the system to run in a virtual machine for the best performance and concurrently tunes it for low power consumption, while the low power consumption is the priority:

    # tuned-adm profile virtual-guest powersave

Warning

Merging is done automatically without checking whether the resulting combination of parameters makes sense. Consequently, the feature might tune some parameters the opposite way, which might be counterproductive: for example, setting the disk for high throughput by using the `throughput-performance` profile and concurrently setting the disk spindown to the low value by the `spindown-disk` profile.

Additional resources

- `tuned.conf(5)` man page.

### The location of TuneD profiles

TuneD stores profiles in the following directories:

`/usr/lib/tuned/profiles/`

  Distribution-specific profiles are stored in the `/usr/lib/tuned/profiles/` directory. Each profile has its own directory. The profile consists of the main configuration file called `tuned.conf`, and optionally other files, for example helper scripts.

`/etc/tuned/profiles/`

  If you need to customize a profile, copy the profile directory into the `/etc/tuned/profiles/` directory, which is used for custom profiles, and then adjust it. If there is a system profile and a custom profile of the same name, the custom profile located in `/etc/tuned/profiles` is used.

Example 6. User-defined profile directories

If you want to make TuneD load profiles from a directory other than `/usr/lib/tuned/profiles/` and `/etc/tuned/profiles/`, you can list it in `/etc/tuned/tuned-main.conf` as follows:

    profile_dirs=/usr/lib/tuned/profiles,/etc/tuned/profiles,/my/custom/profiles

In this example, profiles are loaded also from `/my/custom/profiles/`. If two directories contain profiles with the same names, the one that is listed later takes precedence.

Additional resources

- `tuned.conf(5)` man page.

### Inheritance between TuneD profiles

TuneD profiles can be based on other profiles and modify only certain aspects of their parent profile.

The `[main]` section of TuneD profiles recognizes the `include` option:

    [main]
    include=parent

All settings from the parent profile are loaded in this child profile. In the following sections, the child profile can override certain settings inherited from the parent profile or add new settings not present in the parent profile.

You can create your own child profile in the `/etc/tuned/profiles/` directory based on a pre-installed profile in `/usr/lib/tuned/profiles/` with only some parameters adjusted.

If the parent profile is updated, such as after a TuneD upgrade, the changes are reflected in the child profile.

Example 7. A power-saving profile based on balanced

The following is an example of a custom profile that extends the `balanced` profile and sets Aggressive Link Power Management (ALPM) for all devices to the maximum powersaving.

    [main]
    include=balanced

    [scsi_host]
    alpm=min_power

Additional resources

- `tuned.conf(5)` man page

### Static and dynamic tuning in TuneD

This section explains the difference between the two categories of system tuning that TuneD applies: static and dynamic.

Static tuning

  Mainly consists of the application of predefined `sysctl` and `sysfs` settings and one-shot activation of several configuration tools such as `ethtool`.

Dynamic tuning

  Watches how various system components are used throughout the uptime of your system. TuneD adjusts system settings dynamically based on that monitoring information.

  For example, the hard drive is used heavily during startup and login, but is barely used later when the user might mainly work with applications such as web browsers or email clients. Similarly, the CPU and network devices are used differently at different times. TuneD monitors the activity of these components and reacts to the changes in their use.

  By default, dynamic tuning is disabled. To enable it, edit the `/etc/tuned/tuned-main.conf` file and change the `dynamic_tuning` option to `1`. TuneD then periodically analyzes system statistics and uses them to update your system tuning settings. To configure the time interval in seconds between these updates, use the `update_interval` option.

  Currently implemented dynamic tuning algorithms try to balance the performance and powersave, and are therefore disabled in the performance profiles. Dynamic tuning for individual plug-ins can be enabled or disabled in the TuneD profiles.

Example 8. Static and dynamic tuning on a workstation

On a typical office workstation, the Ethernet network interface is inactive most of the time. Only a few emails go in and out or some web pages might be loaded.

For those kinds of loads, the network interface does not have to run at full speed all the time, as it does by default. TuneD has a monitoring and tuning plug-in for network devices that can detect this low activity and then automatically lower the speed of that interface, typically resulting in a lower power usage.

If the activity on the interface increases for a longer period of time, for example because a DVD image is being downloaded or an email with a large attachment is opened, TuneD detects this and sets the interface speed to maximum to offer the best performance while the activity level is high.

This principle is used for other plug-ins for CPU and disks as well.

### TuneD plug-ins

Plug-ins are modules in TuneD profiles that TuneD uses to monitor or optimize different devices on the system.

TuneD uses two types of plug-ins:

Monitoring plug-ins

  Monitoring plug-ins are used to get information from a running system. The output of the monitoring plug-ins can be used by tuning plug-ins for dynamic tuning.

  Monitoring plug-ins are automatically instantiated whenever their metrics are needed by any of the enabled tuning plug-ins. If two tuning plug-ins require the same data, only one instance of the monitoring plug-in is created and the data is shared.

Tuning plug-ins

  Each tuning plug-in tunes an individual subsystem and takes several parameters that are populated from the TuneD profiles. Each subsystem can have multiple devices, such as multiple CPUs or network cards, that are handled by individual instances of the tuning plug-ins. Specific settings for individual devices are also supported.

#### Syntax for plug-ins in TuneD profiles

Sections describing plug-in instances are formatted in the following way:

    [NAME]
    type=TYPE
    devices=DEVICES

NAME

  is the name of the plug-in instance as it is used in the logs. It can be an arbitrary string.

TYPE

  is the type of the tuning plug-in.

DEVICES

  is the list of devices that this plug-in instance handles.

  The `devices` line can contain a list, a wildcard (`*`), and negation (`!`). If there is no `devices` line, all devices present or later attached on the system of the TYPE are handled by the plug-in instance. This is same as using the `devices=*` option.

  Example 9. Matching block devices with a plug-in

  The following example matches all block devices starting with `sd`, such as `sda` or `sdb`, and does not disable barriers on them:

      [data_disk]
      type=disk
      devices=sd*
      disable_barriers=false

  The following example matches all block devices except `sda1` and `sda2`:

      [data_disk]
      type=disk
      devices=!sda1, !sda2
      disable_barriers=false

If no instance of a plug-in is specified, the plug-in is not enabled.

If the plug-in supports more options, they can be also specified in the plug-in section. If the option is not specified and it was not previously specified in the included plug-in, the default value is used.

#### Short plug-in syntax

If you do not need custom names for the plug-in instance and there is only one definition of the instance in your configuration file, TuneD supports the following short syntax:

    [TYPE]
    devices=DEVICES

In this case, it is possible to omit the `type` line. The instance is then referred to with a name, same as the type. The previous example could be then rewritten into:

Example 10. Matching block devices using the short syntax

    [disk]
    devices=sdb*
    disable_barriers=false

#### Conflicting plug-in definitions in a profile

If the same section is specified more than once using the `include` option, the settings are merged. If they cannot be merged due to a conflict, the last conflicting definition overrides the previous settings. If you do not know what was previously defined, you can use the `replace` Boolean option and set it to `true`. This causes all the previous definitions with the same name to be overwritten and the merge does not happen.

You can also disable the plug-in by specifying the `enabled=false` option. This has the same effect as if the instance was never defined. Disabling the plug-in is useful if you are redefining the previous definition from the `include` option and do not want the plug-in to be active in your custom profile.

NOTE

  TuneD includes the ability to run any shell command as part of enabling or disabling a tuning profile. This enables you to extend TuneD profiles with functionality that has not been integrated into TuneD yet.

  You can specify arbitrary shell commands using the `script` plug-in.

Additional resources

- `tuned.conf(5)` man page

### Available TuneD plug-ins

This section lists all monitoring and tuning plug-ins currently available in TuneD.

#### Monitoring plug-ins

Currently, the following monitoring plug-ins are implemented:

`disk`

  Gets disk load (number of IO operations) per device and measurement interval.

`net`

  Gets network load (number of transferred packets) per network card and measurement interval.

`load`

  Gets CPU load per CPU and measurement interval.

#### Tuning plug-ins

Currently, the following tuning plug-ins are implemented. Only some of these plug-ins implement dynamic tuning. Options supported by plug-ins are also listed:

`cpu`

  Sets the CPU governor to the value specified by the `governor` option and dynamically changes the Power Management Quality of Service (PM QoS) CPU Direct Memory Access (DMA) latency according to the CPU load.

  If the CPU load is lower than the value specified by the `load_threshold` option, the latency is set to the value specified by the `latency_high` option, otherwise it is set to the value specified by `latency_low`.

  You can also force the latency to a specific value and prevent it from dynamically changing further. To do so, set the `force_latency` option to the required latency value.

`eeepc_she`

  Dynamically sets the front-side bus (FSB) speed according to the CPU load.

  This feature can be found on some netbooks and is also known as the ASUS Super Hybrid Engine (SHE).

  If the CPU load is lower or equal to the value specified by the `load_threshold_powersave` option, the plug-in sets the FSB speed to the value specified by the `she_powersave` option. If the CPU load is higher or equal to the value specified by the `load_threshold_normal` option, it sets the FSB speed to the value specified by the `she_normal` option.

  Static tuning is not supported and the plug-in is transparently disabled if TuneD does not detect the hardware support for this feature.

`net`

  Configures the Wake-on-LAN functionality to the values specified by the `wake_on_lan` option. It uses the same syntax as the `ethtool` utility. It also dynamically changes the interface speed according to the interface utilization.

`sysctl`

  Sets various `sysctl` settings specified by the plug-in options.

  The syntax is `name=value`, where name is the same as the name provided by the `sysctl` utility.

  Use the `sysctl` plug-in if you need to change system settings that are not covered by other plug-ins available in TuneD. If the settings are covered by some specific plug-ins, prefer these plug-ins.

`usb`

  Sets autosuspend timeout of USB devices to the value specified by the `autosuspend` parameter.

  The value `0` means that autosuspend is disabled.

`vm`

  Enables or disables transparent huge pages depending on the Boolean value of the `transparent_hugepages` option.

  Valid values of the `transparent_hugepages` option are:

  - "always"

  - "never"

  - "madvise"

`audio`

  Sets the autosuspend timeout for audio codecs to the value specified by the `timeout` option.

  Currently, the `snd_hda_intel` and `snd_ac97_codec` codecs are supported. The value `0` means that the autosuspend is disabled. You can also enforce the controller reset by setting the Boolean option `reset_controller` to `true`.

`disk`

  Sets the disk elevator to the value specified by the `elevator` option.

  It also sets:

  - APM to the value specified by the `apm` option

  - Scheduler quantum to the value specified by the `scheduler_quantum` option

  - Disk spindown timeout to the value specified by the `spindown` option

  - Disk readahead to the value specified by the `readahead` parameter

  - The current disk readahead to a value multiplied by the constant specified by the `readahead_multiply` option

  In addition, this plug-in dynamically changes the advanced power management and spindown timeout setting for the drive according to the current drive utilization. The dynamic tuning can be controlled by the Boolean option `dynamic` and is enabled by default.

`scsi_host`

  Tunes options for SCSI hosts.

  It sets Aggressive Link Power Management (ALPM) to the value specified by the `alpm` option.

`mounts`

  Enables or disables barriers for mounts according to the Boolean value of the `disable_barriers` option.

`scheduler`

  Allows tuning of scheduling priorities, processes/threads/IRQs affinities, and CPU cores isolation.

  The scheduler plugin uses perf event loop to catch newly created processes. By default it listens to perf.RECORD_COMM and perf.RECORD_EXIT events. By setting `perf_process_fork` parameter to `true`, perf.RECORD_FORK events will be also listened to. In other words, child processes created by the fork() system call will be processed. Since child processes inherit CPU affinity from their parents, the `scheduler` plugin usually does not need to explicitly process these events. As processing perf events can pose a significant CPU overhead, the `perf_process_fork` parameter is set to `false` by default and child processes are not processed by the scheduler plugin.

  For perf events mmapped buffer is used. Under heavy load the buffer may overflow. In such cases the `scheduler` plugin may start missing events and not process some newly created processes. Increasing the buffer size may help. The buffer size can be set with the `perf_mmap_pages` parameter. Value of this parameter has to be power of 2. If it is not the power of 2, the nearest bigger power of 2 value is calculated from it and this calculated value is used. If the `perf_mmap_pages` parameter is omitted, the default kernel value is used, which should be 128 for the recent kernels (tested on kernel-5.9.8).

  The `default_irq_smp_affinity` parameter controls the values TuneD writes to `/proc/irq/default_smp_affinity`. The following values are supported:

  `calc`

    Content of `/proc/irq/default_smp_affinity` will be calculated from the `isolated_cores` parameter. Non-isolated cores are calculated as an inversion of the `isolated_cores`. Then the intersection of the non-isolated cores and the previous content of `/proc/irq/default_smp_affinity` is written to `/proc/irq/default_smp_affinity`. If the intersection is an empty set, then just the non-isolated cores are written to `/proc/irq/default_smp_affinity`. This behavior is the default if the parameter `default_irq_smp_affinity` is omitted.

  `ignore`

    TuneD will not touch `/proc/irq/default_smp_affinity`.

  cpulist such as `1,3-4`

    The cpulist is unpacked and written directly to `/proc/irq/default_smp_affinity`.

`script`

  Executes an external script or binary when the profile is loaded or unloaded. You can choose an arbitrary executable.

  Important | The `script` plug-in is provided mainly for compatibility with earlier releases. Prefer other TuneD plug-ins if they cover the required functionality.

  TuneD calls the executable with one of the following arguments:

  - `start` when loading the profile

  - `stop` when unloading the profile

  You need to correctly implement the `stop` action in your executable and revert all settings that you changed during the `start` action. Otherwise, the roll-back step after changing your TuneD profile will not work.

  Bash scripts can import the `/usr/lib/tuned/functions` Bash library and use the functions defined there. Use these functions only for functionality that is not natively provided by TuneD. If a function name starts with an underscore, such as `_wifi_set_power_level`, consider the function private and do not use it in your scripts, because it might change in the future.

  Specify the path to the executable using the `script` parameter in the plug-in configuration.

  Example 11. Running a Bash script from a profile

  To run a Bash script named `script.sh` that is located in the profile directory, use:

      [script]
      script=${i:PROFILE_DIR}/script.sh

`sysfs`

  Sets various `sysfs` settings specified by the plug-in options.

  The syntax is `name=value`, where name is the `sysfs` path to use.

  Use this plugin in case you need to change some settings that are not covered by other plug-ins. Prefer specific plug-ins if they cover the required settings.

`video`

  Sets various powersave levels on video cards. Currently, only the Radeon cards are supported.

  The powersave level can be specified by using the `radeon_powersave` option. Supported values are:

  - `default`

  - `auto`

  - `low`

  - `mid`

  - `high`

  - `dynpm`

  - `dpm-battery`

  - `dpm-balanced`

  - `dpm-perfomance`

  For details, see www.x.org. Note that this plug-in is experimental and the option might change in future releases.

`bootloader`

  Adds options to the kernel command line. This plug-in supports only the GRUB 2 boot loader.

  Customized non-standard location of the GRUB 2 configuration file can be specified by the `grub2_cfg_file` option.

  The kernel options are added to the current GRUB configuration and its templates. The system needs to be rebooted for the kernel options to take effect.

  Switching to another profile or manually stopping the `tuned` service removes the additional options. If you shut down or reboot the system, the kernel options persist in the `grub.cfg` file.

  The kernel options can be specified by the following syntax:

      cmdline=arg1 arg2 ... argN

  Example 12. Modifying the kernel command line

  For example, to add the `quiet` kernel option to a TuneD profile, include the following lines in the `tuned.conf` file:

      [bootloader]
      cmdline=quiet

  The following is an example of a custom profile that adds the `isolcpus=2` option to the kernel command line:

      [bootloader]
      cmdline=isolcpus=2

`acpi`

  Configures the ACPI driver.

  The only currently supported option is `platform_profile`, which sets the ACPI platform profile sysfs attribute, a generic power/performance preference API for other drivers. Multiple profiles can be specified, separated by `|`. The first available profile is selected.

  Example 13. Selecting a platform profile

      [acpi]
      platform_profile=low-power|quiet

  Using this option, TuneD will try to set the platform profile to `low-power`. If that fails (e.g, because the system does not support the profile), it will try to set it to `quiet`.

### Variables in TuneD profiles

Variables expand at run time when a TuneD profile is activated.

Using TuneD variables reduces the amount of necessary typing in TuneD profiles.

There are no predefined variables in TuneD profiles. You can define your own variables by creating the `[variables]` section in a profile and using the following syntax:

    [variables]

    variable_name=value

To expand the value of a variable in a profile, use the following syntax:

    ${variable_name}

Example 14. Isolating CPU cores using variables

In the following example, the `${isolated_cores}` variable expands to `1,2`; hence the kernel boots with the `isolcpus=1,2` option:

    [variables]
    isolated_cores=1,2

    [bootloader]
    cmdline=isolcpus=${isolated_cores}

The variables can be specified in a separate file. For example, you can add the following lines to `tuned.conf`:

    [variables]
    include=/etc/tuned/my-variables.conf

    [bootloader]
    cmdline=isolcpus=${isolated_cores}

If you add the `isolated_cores=1,2` option to the `/etc/tuned/my-variables.conf` file, the kernel boots with the `isolcpus=1,2` option.

Additional resources

- `tuned.conf(5)` man page

### Built-in functions in TuneD profiles

Built-in functions expand at run time when a TuneD profile is activated.

You can:

- Use various built-in functions together with TuneD variables

- Create custom functions in Python and add them to TuneD in the form of plug-ins

To call a function, use the following syntax:

    ${f:function_name:argument_1:argument_2}

To expand the directory path where the profile and the `tuned.conf` file are located, use the `PROFILE_DIR` function, which requires special syntax:

    ${i:PROFILE_DIR}

Example 15. Isolating CPU cores using variables and built-in functions

In the following example, the `${non_isolated_cores}` variable expands to `0,3-5`, and the `cpulist_invert` built-in function is called with the `0,3-5` argument:

    [variables]
    non_isolated_cores=0,3-5

    [bootloader]
    cmdline=isolcpus=${f:cpulist_invert:${non_isolated_cores}}

The `cpulist_invert` function inverts the list of CPUs. For a 6-CPU machine, the inversion is `1,2`, and the kernel boots with the `isolcpus=1,2` command-line option.

Additional resources

- `tuned.conf(5)` man page

### Built-in functions available in TuneD profiles

The following built-in functions are available in all TuneD profiles:

`PROFILE_DIR`

  Returns the directory path where the profile and the `tuned.conf` file are located.

`exec`

  Executes a process and returns its output.

`assertion`

  Compares two arguments. If they do not match, the function logs text from the first argument and aborts profile loading.

`assertion_non_equal`

  Compares two arguments. If they match, the function logs text from the first argument and aborts profile loading.

`kb2s`

  Converts kilobytes to disk sectors.

`s2kb`

  Converts disk sectors to kilobytes.

`strip`

  Creates a string from all passed arguments and deletes both leading and trailing white space.

`virt_check`

  Checks whether TuneD is running inside a virtual machine (VM) or on bare metal:

  - Inside a VM, the function returns the first argument.

  - On bare metal, the function returns the second argument, even in case of an error.

`cpulist_invert`

  Inverts a list of CPUs to make its complement. For example, on a system with 4 CPUs, numbered from 0 to 3, the inversion of the list `0,2,3` is `1`.

`cpulist2hex`

  Converts a CPU list to a hexadecimal CPU mask.

`cpulist2hex_invert`

  Converts a CPU list to a hexadecimal CPU mask and inverts it.

`hex2cpulist`

  Converts a hexadecimal CPU mask to a CPU list.

`cpulist_online`

  Checks whether the CPUs from the list are online. Returns the list containing only online CPUs.

`cpulist_present`

  Checks whether the CPUs from the list are present. Returns the list containing only present CPUs.

`cpulist_unpack`

  Unpacks a CPU list in the form of `1-3,4` to `1,2,3,4`.

`cpulist_pack`

  Packs a CPU list in the form of `1,2,3,5` to `1-3,5`.

`intel_recommended_pstate`

  Returns recommended intel_pstate CPUFreq driver mode based on processor generation.

### Creating new TuneD profiles

This procedure creates a new TuneD profile with custom performance rules.

Prerequisites

- The `tuned` service is running. See Installing and Enabling Tuned for details.

Procedure

1. In the `/etc/tuned/profiles/` directory, create a new directory named the same as the profile that you want to create:

       # mkdir /etc/tuned/profiles/my-profile

2. In the new directory, create a file named `tuned.conf`. Add a `[main]` section and plug-in definitions in it, according to your requirements.

   For example, see the configuration of the `balanced` profile:

       [main]
       summary=General non-specialized TuneD profile

       [cpu]
       governor=conservative
       energy_perf_bias=normal

       [audio]
       timeout=10

       [video]
       radeon_powersave=dpm-balanced, auto

       [scsi_host]
       alpm=medium_power

3. To activate the profile, use:

       # tuned-adm profile my-profile

4. Verify that the TuneD profile is active and the system settings are applied:

       $ tuned-adm active

       Current active profile: my-profile

       $ tuned-adm verify

       Verification succeeded, current system settings match the preset profile.
       See TuneD log file ('/var/log/tuned/tuned.log') for details.

Additional resources

- `tuned.conf(5)` man page

### Modifying existing TuneD profiles

This procedure creates a modified child profile based on an existing TuneD profile.

Prerequisites

- The `tuned` service is running. See Installing and Enabling Tuned for details.

Procedure

1. In the `/etc/tuned/profiles/` directory, create a new directory named the same as the profile that you want to create:

       # mkdir /etc/tuned/profiles/modified-profile

2. In the new directory, create a file named `tuned.conf`, and set the `[main]` section as follows:

       [main]
       include=parent-profile

   Replace parent-profile with the name of the profile you are modifying.

3. Include your profile modifications.

   Example 16. Lowering swappiness in the throughput-performance profile

   To use the settings from the `throughput-performance` profile and change the value of `vm.swappiness` to 5, instead of the default 10, use:

       [main]
       include=throughput-performance

       [sysctl]
       vm.swappiness=5

4. To activate the profile, use:

       # tuned-adm profile modified-profile

5. Verify that the TuneD profile is active and the system settings are applied:

       $ tuned-adm active

       Current active profile: my-profile

       $ tuned-adm verify

       Verification succeeded, current system settings match the preset profile.
       See TuneD log file ('/var/log/tuned/tuned.log') for details.

Additional resources

- `tuned.conf(5)` man page

### Setting the disk scheduler using TuneD

This procedure creates and enables a TuneD profile that sets a given disk scheduler for selected block devices. The setting persists across system reboots.

In the following commands and configuration, replace:

- device with the name of the block device, for example `sdf`

- selected-scheduler with the disk scheduler that you want to set for the device, for example `bfq`

Prerequisites

- The `tuned` service is installed and enabled. For details, see https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/monitoring_and_managing_system_status_and_performance/getting-started-with-tuned_monitoring-and-managing-system-status-and-performance#installing-and-enabling-tuned_getting-started-with-tuned.

Procedure

1. Optional: Select an existing TuneD profile on which your profile will be based. For a list of available profiles, see https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/monitoring_and_managing_system_status_and_performance/getting-started-with-tuned_monitoring-and-managing-system-status-and-performance#tuned-profiles-distributed-with-rhel_getting-started-with-tuned.

   To see which profile is currently active, use:

       $ tuned-adm active

2. Create a new directory to hold your TuneD profile:

       # mkdir /etc/tuned/profiles/my-profile

3. Find the system unique identifier of the selected block device:

       $ udevadm info --query=property --name=/dev/device | grep -E '(WWN|SERIAL)'

       ID_WWN=0x5002538d00000000_
       ID_SERIAL=Generic-_SD_MMC_20120501030900000-0:0
       ID_SERIAL_SHORT=20120501030900000

   Note | The command in the this example will return all values identified as a World Wide Name (WWN) or serial number associated with the specified block device. Although it is preferred to use a WWN, the WWN is not always available for a given device and any values returned by the example command are acceptable to use as the device system unique ID.

4. Create the `/etc/tuned/profiles/my-profile/tuned.conf` configuration file. In the file, set the following options:

   1. Optional: Include an existing profile:

          [main]
          include=existing-profile

   2. Set the selected disk scheduler for the device that matches the WWN identifier:

          [disk]
          devices_udev_regex=IDNAME=device system unique id
          elevator=selected-scheduler

      Here:

      - Replace IDNAME with the name of the identifier being used (for example, `ID_WWN`).

      - Replace device system unique id with the value of the chosen identifier (for example, `0x5002538d00000000`).

        To match multiple devices in the `devices_udev_regex` option, enclose the identifiers in parentheses and separate them with vertical bars:

            devices_udev_regex=(ID_WWN=0x5002538d00000000)|(ID_WWN=0x1234567800000000)

5. Enable your profile:

       # tuned-adm profile my-profile

Verification steps

1. Verify that the TuneD profile is active and applied:

       $ tuned-adm active

       Current active profile: my-profile

       $ tuned-adm verify

       Verification succeeded, current system settings match the preset profile.
       See TuneD log file ('/var/log/tuned/tuned.log') for details.

Additional resources

- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/monitoring_and_managing_system_status_and_performance/customizing-tuned-profiles_monitoring-and-managing-system-status-and-performance.

### Related information

- The `tuned.conf(5)` man page

- The TuneD project website: https://tuned-project.org/