Red Hat Training

A Red Hat training course is available for RHEL 8

第 3 章 自定义 Tuned 配置集

您可以创建或修改 Tuned 配置集,以针对您的预期用例优化系统性能。

先决条件

3.1. tuned 配置集

对系统的详细分析可能非常耗时。tuned 提供许多预定义配置集,适用于典型的用例。您还可以创建、修改和删除配置文件。

Tuned 提供的配置集分为以下类别:

  • 节能配置集
  • 性能提升配置集

性能提升配置集包括侧重于以下方面的配置集:

  • 存储和网络的低延迟
  • 存储和网络的高吞吐量
  • 虚拟机性能
  • 虚拟化主机性能

配置集配置语法

tuned.conf 文件可以包含一个 [main] 部分,以及用于配置插件实例的其它部分。但是,所有部分都是可选的。

以 hash 符号(#)开头的行是注释。

其它资源

  • tuned.conf(5) man 手册.

3.2. 默认 Tuned 配置集

在安装过程中,系统的最佳配置集会被自动选择。目前,默认配置集会根据以下可自定义规则选择:

环境默认配置集目标

计算节点

throughput-performance

最佳吞吐量性能

虚拟机

virtual-guest

最佳性能.如果您对最佳性能不感兴趣,您可以将其改为 balancedpowersave 配置集。

其他情况

balanced

平衡性能和功耗

其它资源

  • tuned.conf(5) man 手册.

3.3. 合并 Tuned 配置集

作为实验性功能,可以同时选择更多配置集。tuned 将尝试在负载期间合并它们。

如果存在冲突,则最后一个指定的配置集中的设置具有优先权。

例 3.1. 虚拟客户机中的低功耗

以下示例优化了系统在虚拟机中运行以获得最佳性能,并同时针对低功耗进行调整,而低功耗则是优先级:

# tuned-adm profile virtual-guest powersave
警告

合并可以自动完成,无需检查生成的参数组合是否有意义。因此,这个功能可能会以相反的方式调整一些参数,这可能是计数器:例如,使用 throughput-performance 配置集设置磁盘以实现高吞吐量,并同时将磁盘降序设置为 spindown-disk 配置集的低值。

其它资源

  • tuned.conf(5) man 手册.

3.4. Tuned 配置集的位置

在以下目录中调优存储配置集

/usr/lib/tuned/
发行版相关的配置文件存储在 目录中。每个配置集都有自己的目录。该配置集由名为 tuned.conf 的主配置文件以及其他可选文件组成,如 helper 脚本。
/etc/tuned/
如果需要自定义配置集,请将配置集目录复制到用于自定义配置集的 目录中。如果同一名称有两个配置集,则使用 /etc/tuned/ 中的自定义配置集。

其它资源

  • tuned.conf(5) man 手册.

3.5. Tuned 配置集之间的继承

调优配置集可以基于其他配置集,并且只能修改其父配置文件的某些方面。

Tuned 配置集的 [main] 部分识别 include 选项:

[main]
include=parent

配置文件中的所有设置都会在此 子配置文件中加载在以下部分中,子配置集可以覆盖从 配置集继承的某些设置 ,或者添加新的设置。

您可以根据 /usr/lib/tuned/ 中预安装的配置集在 /etc/tuned/ 目录中创建自己的子配置集,只调整一些参数。

如果在 Tuned 升级后更新了父配置集,如 Tuned 升级后,这些更改会反映在子配置集中

例 3.2. 基于均衡的省电配置文件

以下是扩展 balanced 配置集的自定义配置集示例,它为所有设备设置 Aggressive Link Power Management(ALPM)。

[main]
include=balanced

[scsi_host]
alpm=min_power

其它资源

  • tuned.conf(5) man page

3.6. Tuned 中的静态和动态调优

本节解释 Tuned 应用的两个系统调优类别之间的区别:静态 和动态

静态调优
主要由预定义的 sysctlsysfs 设置以及几个配置工具(如 ethtool )的一次性激活组成。
动态调优

观察如何在整个系统正常运行期间使用各种系统组件。tuned 可基于该监控信息动态调整系统设置。

例如,硬盘驱动器在启动和登录期间大量使用,但在用户可能主要使用 Web 浏览器或电子邮件客户端等应用时很少使用。同样,CPU 和网络设备在不同的时间使用不同。tuned 监控这些组件的活动,并响应其使用中的变化。

默认情况下禁用动态调优。要启用它,请编辑 /etc/tuned/tuned-main.conf 文件并将 dynamic_tuning 选项改为 1tuned 随后定期分析系统统计信息,并使用它们更新您的系统调优设置。要配置这些更新之间的时间间隔,使用 update_interval 选项。

目前实施动态调优算法,试图平衡性能和 powersave,因此在性能配置集中被禁用。可以在 Tuned 配置集中启用或禁用单个插件的动态调优。

例 3.3. workstation 上的静态和动态调优

在典型的办公室工作站上,以太网网络接口大部分时间处于非活动状态。只有几封电子邮件可以进入和传出,或者可能加载一些网页。

对于这些类型的负载,网络接口不必像默认那样全速运行。tuned 具有对网络设备的监控和调优插件,可检测此低活动,然后自动降低该接口的速度,通常导致功耗降低。

如果接口上的活动在较长时间内增加,例如,下载 DVD 镜像或打开包含大附件的电子邮件,Tuned 会检测到这一点,并将接口速度设置为在活动水平较高时提供最佳性能。

此原则也用于 CPU 和磁盘的其他插件。

3.7. tuned 插件

插件是 Tuned 配置集中的模块,Tuned 使用这些模块来监控或优化系统上的不同设备。

tuned 使用两种插件:

监控插件

监控插件用于从正在运行的系统获取信息。监控插件的输出可通过调优插件进行动态调优。

每当启用的调优插件需要其指标时,监控插件会自动实例化。如果两个调优插件需要相同的数据,则仅创建一个监控插件实例并共享数据。

调优插件
每个调优插件对单个子系统进行调优,并取从调优配置集填充的多个参数。每个子系统可以有多个设备,如多个 CPU 或网卡,它们由调优插件的各个实例处理。也支持单个设备的特定设置。

Tuned 配置集中的插件语法

描述插件实例的部分采用以下方式格式化:

[NAME]
type=TYPE
devices=DEVICES
名称
是插件实例的名称,因为它在日志中使用。它可以是任意字符串。
类型
是调优插件的类型。
DEVICES

此插件实例处理的设备列表。

devices 行可以包含列表、通配符(*)和否定法(!)。如果没有 devices 行,则TYPE 系统中存在或更新的所有设备都由插件实例处理。这与使用 devices=* 选项相同。

例 3.4. 使用插件匹配块设备

以下示例匹配以 sd 开始的所有块设备,如 sdasdb,且不禁用它们的障碍:

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

以下示例与 sda1sda2 以外的所有块设备匹配:

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

如果没有指定插件实例,则该插件不会被启用。

如果插件支持更多选项,则可以在插件部分指定它们。如果没有指定 选项,且之前未在包含的插件中指定,则使用默认值。

短插件语法

如果您不需要插件实例的自定义名称,且配置文件中只有一个实例定义,Tuned 支持以下简短语法:

[TYPE]
devices=DEVICES

在这种情况下,可以省略 type 行。然后,实例使用名称引用,与类型相同。以上示例可改写为:

例 3.5. 使用简短语法匹配块设备

[disk]
devices=sdb*
disable_barriers=false

配置集中的冲突插件定义

如果使用 include 选项多次指定同一部分,则会合并设置。如果由于冲突而无法合并,最后一个冲突的定义会覆盖先前的设置。如果您不知道之前定义的内容,您可以使用 replace 布尔值选项并将其设置为 true。这会导致之前的所有定义被覆盖,且不会发生合并。

您还可以通过指定 enabled=false 选项来禁用插件。这具有与从未定义实例相同的效果。如果您要从 include 选项中重新定义之前的定义,并且不希望插件在自定义配置集中活跃,则禁用插件非常有用。

备注

tuned 包括运行任何 shell 命令,作为启用或禁用调优配置文件的一部分。这可让您使用尚未集成到 Tuned 的功能扩展 Tuned 配置集。

您可以使用 script 插件指定任意 shell 命令。

其它资源

  • tuned.conf(5) man page

3.8. 可用的 Tuned 插件

本节列出了 Tuned 中当前可用的所有监控和调优插件。

监控插件

目前,以下监控插件已被实施:

disk
获取每个设备的磁盘负载(IO 操作数)和测量间隔。
net
获取每个网卡的网络负载(传输数据包数)和测量间隔。
load
获得每个 CPU 的 CPU 负载和测量间隔。

调优插件

目前,实施以下调优插件:只有其中一部分插件实现了动态调优。还列出了插件支持的选项:

cpu

将 CPU 调控器设置为 governor 选项指定的值,并根据 CPU 负载动态更改 Power Management Quality of Service(PM QoS)CPU Direct Memory Access(DMA)延迟。

如果 CPU 负载低于 load_threshold 选项指定的值,则延迟被设置为 latency_high 选项指定的值,否则设置为 latency_low 指定的值。

您还可以强制延迟到特定值,并防止它进一步更改。要做到这一点,将 force_latency 选项设置为所需的延迟值。

eeepc_she

根据 CPU 负载动态设置前端总线(FSB)速度。

此功能可在某些工作簿中找到,也称为 ASUS Super Hybrid Engine(SHE)。

如果 CPU 负载较低或等于 load_threshold_powersave 选项指定的值,插件会将 FSB 速度设置为 she_powersave 选项指定的值。如果 CPU 负载高于或等于 load_threshold_normal 选项指定的值,它会将 FSB 速度设置为 she_normal 选项指定的值。

如果 Tuned 没有检测到此功能的硬件支持,则不支持静态调优,且插件会透明地禁用。

net
将 Wake-on-LAN 功能配置为 wake_on_lan 选项指定的值。它使用与 ethtool 工具相同的语法。它还会根据接口使用率动态更改接口速度。
sysctl

设置插件选项指定的各种 sysctl 设置。

语法是 name=value,名称 sysctl 实用程序提供的名称相同。

如果您需要更改 Tuned 中未包含的其他插件的系统设置,请使用 sysctl 插件。如果某些特定插件覆盖了设置,则首选这些插件。

usb

将 USB 设备的超时时间设置为 autosuspend 参数指定的值。

0 表示自动暂停被禁用。

vm

根据 transparent_hugepages 选项的值启用或禁用透明巨页。

transparent_hugepages 选项的有效值有:

  • "always"
  • "永不"
  • "madvise"
audio

将音频解码器的 autosuspend 超时设置为 timeout 选项指定的值。

目前,支持 snd_hda_intelsnd_ac97_codec 编码。0 表示自动暂停被禁用。您还可以通过将布尔值选项 reset_controller 设置为 true 来强制控制器重置。

disk

将磁盘电梯设置为 elevator 选项指定的值。

它还设置:

  • APM 到 apm 选项指定的值
  • 调度程序数量到 scheduler_quantum 选项指定的值
  • 磁盘减速超时到 spindown 选项指定的值
  • 磁盘读取到 readahead 参数指定的值
  • 当前磁盘读头值乘以 readahead_multiply 选项指定的常量值

此外,这个插件会根据当前的驱动器使用率动态更改驱动器的高级电源管理和降序超时设置。动态调优可以通过布尔值选项 dynamic 进行控制,并默认启用。

scsi_host

调整 SCSI 主机的选项.

它将 Aggressive Link Power Management(ALPM)设置为 alpm 选项指定的值。

mounts
根据 disable_barriers 选项的布尔值,启用或禁用挂载的障碍。
script

加载或卸载配置集时,执行外部脚本或二进制文件。您可以选择任意可执行文件。

重要

script 插件主要为与早期版本的兼容性提供。如果其他 Tuned 插件涵盖所需的功能,则首选它们。

tuned 使用以下参数之一调用可执行文件:

  • start 加载配置集时
  • stop 卸载配置集时

您需要在可执行文件中正确实现 stop 操作,并恢复您在 start 操作中更改的所有设置。否则,更改 Tuned 配置集后的回滚步骤将无法正常工作。

Bash 脚本可以导入 /usr/lib/tuned/functions Bash 库,并使用那里定义的功能。这些函数仅用于 Tuned 不原生提供的功能。如果函数名称以下划线(如 _wifi_set_power_level )开头,请考虑这个功能私有,且不要在脚本中使用它,因为它将来可能会改变。

使用插件配置中的 script 参数指定可执行文件的路径。

例 3.6. 从配置集运行 Bash 脚本

要运行位于配置集目录中名为 script.sh 的 Bash 脚本,请使用:

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

设置插件选项指定的各种 sysfs 设置。

语法是 name=value,其中name 是要使用的 sysfs 路径。

如果需要更改没有被其他插件覆盖的一些设置,请使用此插件。如果特定插件涵盖所需的设置,则首选它们。

video

在显卡上设置各种幂流级别。目前,只支持 Radeon 卡。

可以使用 radeon_powersave 选项指定 powersave 级别。支持的值有:

  • default
  • auto
  • low
  • mid
  • high
  • dynpm
  • dpm-battery
  • dpm-balanced
  • dpm-perfomance

详情请查看 http://www.x.org/wiki/RadeonFeature#KMS_Power_Management_Options。请注意,这个插件是实验性的,在以后的版本中可能会更改 选项。

bootloader

在内核命令行中添加选项。此插件只支持 GRUB 2 引导装载程序。

可以通过 grub2_cfg_file 选项指定 GRUB 2 配置文件的自定义非标准位置。

内核选项添加到当前 GRUB 配置及其模板中。需要重新引导系统才能使内核选项生效。

切换到另一个配置集或手动停止 tuned 服务会删除附加选项。如果您关闭或重启系统,内核选项会在 grub.cfg 文件中保留。

内核选项可使用以下语法指定:

cmdline=arg1 arg2 ... argN

例 3.7. 修改内核命令行

例如,要在 Tuned 配置集中添加 quiet 内核选项,请在 tuned.conf 文件中包括以下行:

[bootloader]
cmdline=quiet

以下是在内核命令行中添加 isolcpus=2 选项的自定义配置集示例:

[bootloader]
cmdline=isolcpus=2

3.9. Tuned 配置集中的变量

激活 Tuned 配置集时,变量会在运行时扩展。

使用 Tuned 变量可减少 Tuned 配置集中所需的输入量。

Tuned 配置集中没有预定义的变量。您可以通过在配置集中创建 [variables] 部分并使用以下语法来定义自己的变量:

[variables]

variable_name=value

要扩展配置集中的变量值,请使用以下语法:

${variable_name}

例 3.8. 使用变量隔离 CPU 内核

在以下示例中,${isolated_cores} 变量扩展至 1,2,因此内核使用 isolcpus=1,2 选项引导:

[variables]
isolated_cores=1,2

[bootloader]
cmdline=isolcpus=${isolated_cores}

这些变量可以在单独的文件中指定。例如,您可以在 tuned.conf 中添加以下行:

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

[bootloader]
cmdline=isolcpus=${isolated_cores}

如果您在 /etc/tuned/my-variables.conf 文件中添加 isolated_cores=1,2 选项,内核将使用 isolcpus=1,2 选项引导。

其它资源

  • tuned.conf(5) man page

3.10. Tuned 配置集中的内置功能

当激活 Tuned 配置集时,内置功能会在运行时扩展。

您可以:

  • 将各种内置功能与 Tuned 变量一起使用
  • 在 Python 中创建自定义功能,并以插件的形式将它们添加到 Tuned

要调用函数,请使用以下语法:

${f:function_name:argument_1:argument_2}

要扩展配置集和 tuned.conf 文件所在的目录路径,请使用 PROFILE_DIR 功能,它需要特殊语法:

${i:PROFILE_DIR}

例 3.9. 使用变量和内置功能隔离 CPU 内核

在以下示例中,${non_isolated_cores} 变量扩展到 0,3-5cpulist_invert 内置函数通过 0,3-5 参数调用:

[variables]
non_isolated_cores=0,3-5

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

cpulist_invert 功能会颠倒 CPU 列表。对于 6-CPU 机器,inversion 是 1,2,内核使用 isolcpus=1,2 命令行选项引导。

其它资源

  • tuned.conf(5) man page

3.11. Tuned 配置集中可用的内置功能

所有 Tuned 配置集都包括以下内置功能:

PROFILE_DIR
返回配置集和 tuned.conf 文件所在的目录路径。
exec
执行进程并返回其输出。
assertion
比较两个参数。如果不匹配,函数会记录第一个参数的文本并中止配置集加载。
assertion_non_equal
比较两个参数。如果匹配,函数会记录第一个参数的文本并加载 aborts 配置集。
kb2s
将 KB 转换为磁盘扇区.
s2kb
将磁盘扇区转换为 KB.
strip
从所有传递的参数创建字符串,并删除前导和尾随空格。
virt_check

检查 Tuned 是否在虚拟机(VM)或裸机上运行:

  • 在虚拟机内,函数返回第一个参数。
  • 在裸机上,函数会返回第二个参数,即使出现错误也是如此。
cpulist_invert
颠倒 CPU 列表,使其成为补充。例如:在一个有 4 个 CPU 的系统中,从 0 到 3,列表 0,2,3 的 inversion 是 1
cpulist2hex
将 CPU 列表转换为十六进制 CPU 掩码。
cpulist2hex_invert
将 CPU 列表转换为十六进制 CPU 掩码,并颠倒 CPU 掩码。
hex2cpulist
将十六进制 CPU 掩码转换为 CPU 列表。
cpulist_online
检查列表中的 CPU 是否在线。返回仅包含在线 CPU 的列表。
cpulist_present
检查列表中是否存在 CPU。返回仅包含现有 CPU 的列表。
cpulist_unpack
将 CPU 列表解包为 1-3,41,2,3,4
cpulist_pack
将 CPU 列表以 1,2,3,5 的形式打包到 1-3,5

3.12. 创建新的 Tuned 配置集

此流程使用自定义性能规则创建新的 Tuned 配置集。

先决条件

流程

  1. /etc/tuned/ 目录中,创建一个名为与您要创建的配置集相同的新目录:

    # mkdir /etc/tuned/my-profile
  2. 在新目录中,创建名为 tuned.conf 的文件。根据您的要求,添加 [main] 部分和其中的插件定义。

    例如,查看 balanced 配置集的配置:

    [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. 要激活配置集,请使用:

    # tuned-adm profile my-profile
  4. 验证 Tuned 配置集是否活跃并应用系统设置:

    $ tuned-adm active
    
    Current active profile: my-profile
    $ tuned-adm verify
    
    Verfication succeeded, current system settings match the preset profile.
    See tuned log file ('/var/log/tuned/tuned.log') for details.

其它资源

  • tuned.conf(5) man page

3.13. 修改现有的 Tuned 配置集

此流程基于现有的 Tuned 配置集创建修改的子配置集。

先决条件

流程

  1. /etc/tuned/ 目录中,创建一个名为与您要创建的配置集相同的新目录:

    # mkdir /etc/tuned/modified-profile
  2. 在新目录中,创建一个名为 tuned.conf 的文件,并设置 [main] 部分,如下所示:

    [main]
    include=parent-profile

    parent-profile 替换为您要修改的配置集的名称。

  3. 包括您的配置集修改。

    例 3.10. 在 throughput-performance 配置集中降低 swappiness

    要使用 throughput-performance 配置集中的设置并将 vm.swappiness 的值改为 5,而不是默认的 10,请使用:

    [main]
    include=throughput-performance
    
    [sysctl]
    vm.swappiness=5
  4. 要激活配置集,请使用:

    # tuned-adm profile modified-profile
  5. 验证 Tuned 配置集是否活跃并应用系统设置:

    $ tuned-adm active
    
    Current active profile: my-profile
    $ tuned-adm verify
    
    Verfication succeeded, current system settings match the preset profile.
    See tuned log file ('/var/log/tuned/tuned.log') for details.

其它资源

  • tuned.conf(5) man page

3.14. 使用 Tuned 设置磁盘调度程序

此流程创建并启用 Tuned 配置集,该配置集为所选块设备设置给定磁盘调度程序。这个设置会在系统重启后保留。

在以下命令和配置中替换:

  • 带有块设备名称的设备,例如: sdf
  • 带有您要为该设备设置的磁盘调度程序的 selected-scheduler,例如 bfq

先决条件

流程

  1. 可选:选择一个您配置集将要基于的现有 Tuned 配置集。有关可用配置集列表,请参阅 RHEL 提供的 Tuned 配置集

    要查看哪个配置集当前处于活跃状态,请使用:

    $ tuned-adm active
  2. 创建一个新目录来保存您的 Tuned 配置集:

    # mkdir /etc/tuned/my-profile
  3. 查找所选块设备系统唯一标识符:

    $ 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
    注意

    本例中的 命令将返回标识为全局名称(WWN)或与指定块设备关联的序列号的所有值。虽然最好使用 WWN,但 WWN 并不总是可用于给定设备,示例命令返回的任何值都可用作设备系统唯一 ID

  4. 创建 /etc/tuned/my-profile/tuned.conf 配置文件。在该文件中设置以下选项:

    1. 可选:包含现有配置集:

      [main]
      include=existing-profile
    2. 为与 WWN 标识符匹配的设备设置所选磁盘调度程序:

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

      在这里:

      • 使用正在使用的标识符的名称替换 IDNAME (例如 ID_WWN)。
      • 将设备系统唯一 id 替换为所选标识符的值(例如 0x5002538d00000000)。

        要匹配 devices_udev_regex 选项中的多个设备,请将标识符括在括号中,并使用竖线分隔它们:

        devices_udev_regex=(ID_WWN=0x5002538d00000000)|(ID_WWN=0x1234567800000000)
  5. 启用您的配置集:

    # tuned-adm profile my-profile

验证步骤

  • 验证 Tuned 配置集是否活跃并应用:

    $ 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.