TunedProfile
tuned 简介
Linux 提供了一种简单的系统调优方法,那就是通过 tuned 服务。
其中 tuned 是服务端程序,用来监控和收集系统各个组件的数据,并依据数据提供的信息动态调整系统设置,达到动态优化系统的目的。tuned-adm 是客户端程序,用来和 tuned 打交道,用命令行的方式管理和配置 tuned,tuned-adm 提供了一些预先配置的优化方案可供直接使用,比如:笔记本、虚拟机、存储服务器等。
安装 tuned 包:
将 tuned 服务设置为开机启动,并启动 tuned 服务:
执行 dnf info tuned
命令,可以看到该包的介绍:它声称自己是 "动态调整系统设置的守护进程。通过定期监控几个系统组件的使用情况来实现这一点。根据这些信息,组件将进入更低或更高的节能模式,以适应当前的使用情况。目前只实现了以太网网络和 ATA 硬盘设备。"
> dnf info tuned
Last metadata expiration check: 3:10:03 ago on Mon Feb 13 08:17:32 2023.
Available Packages
Name : tuned
Version : 2.19.0
Release : 1.el9
Architecture : noarch
Size : 294 k
Source : tuned-2.19.0-1.el9.src.rpm
Repository : baseos
Summary : A dynamic adaptive system tuning daemon
URL : http://www.tuned-project.org/
License : GPLv2+
Description : The tuned package contains a daemon that tunes system settings dynamically.
: It does so by monitoring the usage of several system components periodically.
: Based on that information components will then be put into lower or higher
: power saving modes to adapt to the current usage. Currently only ethernet
: network and ATA harddisk devices are implemented.
tuned-adm
可以通过 tuned-adm
命令与 tuned 守护进程交互。
tuned-adm 的可用选项和配置文件列表:
> tuned-adm
usage: tuned-adm [-h] [--version] [--debug] [--async] [--timeout TIMEOUT] [--loglevel LOGLEVEL] {list,active,off,profile,profile_info,recommend,verify,auto_profile,profile_mode} ...
tuned-adm 选项可以列出、禁用、提取某个 profile 的信息、获取 profile 的使用建议、验证设置有没有被修改、自动选择 profile 等。
tuned 的 profile 存储在 /usr/lib/tuned/
目录(不同版本的 tuned 可能包含不同的 profile 或配置)。
常用的 profile 介绍:
virtual-host
:将服务器作为虚拟机的宿主机进行优化。virtual-guest
:将服务器作为运行在 “virtual-host” 之上的虚拟机进行优化。powersaving
:尽量减少电力消耗。balanced
:在节能和性能之间进行平衡。desktop
:基于平衡的、更好的应用程序响应能力。throughput-performance
:最大吞吐量。latency-performance
:减少延迟并提供性能。network-throughput
:基于throughput-performance
,但是有额外的网络调优。
如上所述,每个 profile 都是一种权衡:在提高性能时需要更多的功耗,或者提高吞吐量也可能会增加延迟。
> tuned-adm list
Available profiles:
- accelerator-performance - Throughput performance based tuning with disabled higher latency STOP states
- balanced - General non-specialized tuned profile
- desktop - Optimize for the desktop use-case
- hpc-compute - Optimize for HPC compute workloads
- intel-sst - Configure for Intel Speed Select Base Frequency
- 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
- optimize-serial-console - Optimize for serial console use.
- 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: throughput-performance
最后一行列出了当前激活的 profile 为 throughput-performance
,也可以通过 tuned-adm active
命令查看:
启用 latency-performance
profile:
# 激活 latency-performance profile
> tuned-adm profile latency-performance
# 验证激活结果
> tuned-adm active
Current active profile: latency-performance
特意使用 sysctl -w vm.swappiness=69
命令修改系统配置:
# 查看 vm.swappiness 的当前值
> sysctl -a | grep swappiness
vm.swappiness = 0
# 修改 vm.swappiness 的值
> sysctl -w vm.swappiness=69
vm.swappiness = 69
执行 tuned-adm verify
命令,验证 profile 的配置是否有变化:
# 检查 profile 配置是否有变化
> tuned-adm verify
Verification failed, current system settings differ from the preset profile.
You can mostly fix this by restarting the TuneD daemon, e.g.:
systemctl restart tuned
or
service tuned restart
Sometimes (if some plugins like bootloader are used) a reboot may be required.
See TuneD log file ('/var/log/tuned/tuned.log') for details.
系统设置与预设值不一样,可以重启 tuned 守护进程恢复配置。
默认情况下,动态调优是被禁用的,可以在配置文件 /etc/tuned/tuned-main.conf
中查看。
dynamic_tuning
的值是布尔值,0 或 False 时,禁用动态调优;- 1 或 True 时,启动动态调优。
此外,Cockpit 也提供了修改 profile 的界面。
自定义 tuned profile
Tuned profiles 是如何创建及工作的呢?
以 latency-performance
作为示例,通过 /usr/lib/tuned/latency-performance/tuned.conf
来讨论这个问题。
> cat /usr/lib/tuned/latency-performance/tuned.conf |grep -vi '^#' |grep -vi '^$'
[main]
summary=Optimize for deterministic performance at the cost of increased power consumption
[cpu]
force_latency=cstate.id_no_zero:1|3
governor=performance
energy_perf_bias=performance
min_perf_pct=100
[sysctl]
vm.dirty_ratio=10
vm.dirty_background_ratio=3
vm.swappiness=10
man tuned.conf
命令介绍了文件的语法,它是 ini 格式的,即一个按类别组织的文件,用方括号和等号赋值的键值对表示。
main 部分
[main]
部分定义了 profile 的摘要。
可以在 [main]
中定义 include
,根据现有的 profile 创建新的 profile。
在这种情况下,profile 文件中的参数有冲突时,使用新 profile 中的参数。其他部分则取决于安装的插件。
执行以下命令,查看可用的插件:
> rpm -ql tuned | grep 'plugins/plugin_.*.py$'
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_audio.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_bootloader.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_cpu.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_disk.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_eeepc_she.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_irqbalance.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_modules.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_mounts.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_net.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_rtentsk.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_scheduler.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_script.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_scsi_host.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_selinux.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_service.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_sysctl.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_sysfs.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_systemd.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_usb.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_video.py
/usr/lib/python3.9/site-packages/tuned/plugins/plugin_vm.py
如果相同类型的插件试图配置同一个设备,也就是它们之间有冲突时,replace=1
表示最后定义的插件将取代之前定义的插件。
cpu 部分
对于 CPU,它设置了性能调节器 (governor=performance
),可以通过 cat /sys/devices/system/cpu/*/cpufreq/scaling_governor
对系统中可用的 CPU 进行检查 (如果支持)。在一些系统中,路径可能不同,甚至不存在。可以通过执行 cpupower frequency-info - governors
查看是否支持,其中 powerave 和 performance 是最常见的。
> cpupower frequency-info - governors
analyzing CPU 0:
driver: acpi-cpufreq
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: Cannot determine or is not supported.
hardware limits: 2.20 GHz - 3.40 GHz
available frequency steps: 3.40 GHz, 2.80 GHz, 2.20 GHz
available cpufreq governors: conservative ondemand userspace powersave performance schedutil
current policy: frequency should be within 2.20 GHz and 3.40 GHz.
The governor "performance" may decide which speed to use
within this range.
current CPU frequency: 3.40 GHz (asserted by call to hardware)
boost state support:
Supported: yes
Active: yes
Boost States: 0
Total States: 3
Pstate-P0: 3400MHz
Pstate-P1: 2800MHz
Pstate-P2: 2200MHz
type 关键字定义使用的插件,这部分的名称是任意的自定义名称,通过 device 关键字指定设备。
例如,主机上有多块磁盘:sda 和用于数据备份的 sdb,为它们定义不同设置的部分:
名为 sda 的磁盘被配置为 readahead (预加载数据到缓存中);其他数据磁盘设置为节能模式,在不使用时减少噪音和功耗。
sysctl 部分
另一个有趣的插件是 sysctl,被多个 profile 使用,它以 sysctl 命令的方式定义设置。
正因为如此,可以做很多设置:定义传输控制协议 (TCP) 窗口大小以优化网络、虚拟内存管理、transparent huge pages 等。
集成关系
Tuned profile 可以从父级继承设置,因此不必重头定义 profile,而是在可用的 profile 中找到接近的,检查其中的配置,将其应用到自定义的 profile 中。
可以使用以下命令查看系统中定义的 profiles 部分:
> cat /usr/lib/tuned/*/tuned.conf | grep -v '^#' | grep '^\[' | sort -u
[audio]
[bootloader]
[cpu]
[disk]
[eeepc_she]
[main]
[modules]
[net]
[scheduler]
[script]
[scsi_host]
[sysctl.thunderx]
[sysctl]
[variables]
[video]
[vm.thunderx]
[vm]
可以看到,涉及了很多领域。
script 部分定义了一个由 powerave profile
使用的 shell 脚本;variables 部分由 throughput-performance
用来定义正则表达式,以便根据 CPU 进行匹配和应用设置。
自定义 profile 时,创建 /etc/tuned/newprofile/
目录 (newprofile 应改为自定义的 profile 名称),在该目录下必须创建 tuned.conf
文件,文件中包含 [main]
部分和插件部分。比较简单的方式是复制 /usr/lib/tuned/$profilename/
中的文件到 /etc/tuned/newprofile/
目录中。
Profile 创建完成后,就可以使用 tuned-adm profile newprofile
命令启用这个 profile 了。