监控和管理系统状态和性能
优化系统吞吐量、延迟和电源消耗
摘要
对红帽文档提供反馈
我们感谢您对我们文档的反馈。让我们了解如何改进它。
通过 Jira 提交反馈(需要帐户)
- 登录到 Jira 网站。
- 点顶部导航栏中的 Create
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您的改进建议。包括文档相关部分的链接。
- 点对话框底部的 Create。
第 1 章 TuneD 入门
作为系统管理员,您可以使用 TuneD 应用程序来针对各种用例优化系统的性能配置集。
1.1. TuneD 的目的
TuneD 是监控您的系统并优化特定工作负载性能的服务。TuneD 的核心是 配置集 (profiles) ,它针对不同的用例调优您的系统。
TuneD 通过很多预定义的配置集发布,它们适用于以下用例:
- 高吞吐量
- 低延迟
- 保存电源
可以修改为每个配置集定义的规则,并自定义如何调整特定设备。当您切换到另一个配置集或取消激活 TuneD 时,对之前的配置集进行的所有更改都会恢复到其原始状态。
您还可以将 TuneD 配置为响应设备使用的变化,并调整设置以提高活跃设备的性能并减少不活跃设备的功耗。
1.2. 调优配置集
系统的详细分析可能会非常耗时。TuneD 为典型的用例提供了很多预定义的配置集。您还可以创建、修改和删除配置集。
TuneD 提供的配置集被分为以下几个类别:
- 节能配置集
- 性能提升配置集
性能提升配置集包括侧重于以下方面的配置集:
- 存储和网络的低延迟
- 存储和网络的高吞吐量
- 虚拟机性能
- 虚拟化主机性能
配置集配置的语法
tuned.conf
文件可以包含一个 [main]
部分,其他部分用于配置插件实例。但是,所有部分都是可选的。
以 hash 符号 (#
) 开头的行是注释。
其他资源
-
您系统上的
tuned.conf (5)
手册页
1.3. 默认 TuneD 配置集
在安装过程中,将自动选择您的系统的最佳配置集。目前,会根据以下自定义规则选择默认配置集:
环境 | 默认配置集 | 目标 |
---|---|---|
Compute 节点 |
| 最佳吞吐量性能 |
虚拟机 |
|
最佳的性能。如果实现最佳性能并不是您最需要考虑的,可以将其改为 |
其他情况 |
| 平衡性能和能源消耗 |
其他资源
-
您系统上的
tuned.conf (5)
手册页
1.4. 合并的 TuneD 配置集
作为实验性功能,可以一次性选择更多配置集。tuned 将尝试在负载期间合并它们。
如果存在冲突,则最后指定的配置集的设置会优先使用。
例 1.1. 虚拟客户端中低功耗
以下示例优化了在虚拟机中运行的系统,以获得最佳性能,并同时将其调优以实现低功耗,低功耗比高性能有更高优先级:
# tuned-adm profile virtual-guest powersave
合并会在不检查生成的参数组合是否有意义的情况下自动进行。因此,该功能可能会以相反的方式调整一些参数,这么做可能会影响生产效率。例如,使用 throughput-performance
配置集针对高吞吐量设置磁盘,但当前通过 spindown-disk
配置集将磁盘旋转设置为低值。
其他资源
-
系统中
tuned-adm
和tuned.conf (5)
手册页
1.5. TuneD 配置集的位置
TuneD 配置集存储在以下目录中:
/usr/lib/tuned/
-
特定于分发的配置文件存储在目录中。每个配置集都有自己的目录。该配置集由名为
tuned.conf
的主配置文件以及其他文件(如帮助程序脚本)组成。 /etc/tuned/
-
如果您需要自定义配置集,请将配置集目录复制到用于自定义配置集的目录中。如果同一名称有两个配置集,则使用位于
/etc/tuned/
中的自定义配置集。
其他资源
-
您系统上的
tuned.conf (5)
手册页
1.6. RHEL 提供的调优配置集
以下是在 Red Hat Enterprise Linux 中安装 TuneD 的配置集列表。
更特定产品的或第三方的 TuneD 配置集也可能会存在。这些配置集通常由单独的 RPM 软件包提供。
balanced
默认的节能配置文件。它在性能和功耗之间具有折衷。在可能的情况下尽可能使用自动扩展和自动调整。唯一缺陷是增加延迟。在当前的 TuneD 版本中,它启用了 CPU、磁盘、音频和视频插件,并激活了
conservative
CPU 调控器。如果支持,radeon_powersave
选项使用dpm-balanced
值,否则被设置为auto
。它将
energy_performance_preference
属性改为normal
能源设置。它还将scaling_governor
策略属性改为conservative
或powersave
CPU 调控器。powersave
用于最大节能性能的配置集。它可以对性能进行调整,从而最大程度降低实际功耗。在当前的 TuneD 发行版本中,它为 SATA 主机适配器启用 USB 自动挂起、WiFi 节能和 Aggresive Link Power Management (ALPM) 节能。它还为使用低折率的系统调度多核功耗,并激活
ondemand
监管器。它启用了 AC97 音频节能,或根据您的系统,HDA-Intel 节能时间为 10 秒。如果您的系统包含启用了 KMS 支持的 Radeon 图形卡,配置集会将其配置为自动节能。在 ASUS Eee PC 上,启用了动态超级混合引擎。它将
energy_performance_preference
属性改为powersave
或power
energy 设置。它还会将scaling_governor
策略属性更改为ondemand
或powersave
CPU 调控器。注意在某些情况下,与
powersave
配置集相比,balanced
配置集效率更高。请考虑存在定义的需要完成的工作,例如一个需要转码的视频文件。如果转码以全功率完成,则您的机器可能会消耗较少的能源,因为任务快速完成,因此计算机可以启动空闲,且自动缩减到非常有效的节能模式。另一方面,如果您把文件转码为节流的机器,则计算机在转码期间会消耗较少的电源,但进程会花费更长时间,且总体消耗的能源可能会更高。
这就是为什么
balanced
配置文件通常是一个更好的选择。throughput-performance
针对高吞吐量优化的服务器配置文件。它禁用节能机制并启用
sysctl
设置,以提高磁盘和网络 IO 的吞吐量性能。CPU 调控器设置为performance
。它将
energy_performance_preference
和scaling_governor
属性设置为performance
配置集。accelerator-performance
-
accelerator-performance
配置集包含与throughput-performance
配置集相同的调整。另外,它会将 CPU 锁定为低 C 状态,以便使延迟小于 100us。这提高了某些加速器的性能,如 GPU。 latency-performance
为低延迟优化的服务器配置文件。它禁用节能机制并启用
sysctl
设置来缩短延迟。CPU 调控器被设置为performance
,CPU 被锁定到低 C 状态(按 PM QoS)。它将
energy_performance_preference
和scaling_governor
属性设置为performance
配置集。network-latency
低延迟网络调整的配置集。它基于
latency-performance
配置集。它还禁用透明大内存页和 NUMA 平衡,并调整其他一些与网络相关的sysctl
参数。它继承
latency-performance
配置集,该配置集将power_performance_preference
和scaling_governor
属性更改为performance
配置集。hpc-compute
-
针对高性能计算而优化的配置集。它基于
latency-performance
配置集。 network-throughput
用于吞吐量网络调优的配置集。它基于
throughput-performance
配置集。此外,它还增加了内核网络缓冲区。它继承
latency-performance
或throughput-performance
配置集,并将energy_performance_preference
和scaling_governor
属性改为performance
配置集。virtual-guest
为 Red Hat Enterprise Linux 9 虚拟机和 VMWare 虚拟机设计的配置集基于
throughput-performance
配置集(除其他任务)减少了虚拟内存的交换性并增加磁盘预读值。它不会禁用磁盘障碍。它继承
throughput-performance
配置集,该配置集将energy_performance_preference
和scaling_governor
属性更改为performance
配置集。virtual-host
基于
throughput-performance
配置集(除其他任务)为虚拟主机设计的配置集降低了虚拟内存交换,增加磁盘预读值,并启用更主动的脏页面回写值。它继承
throughput-performance
配置集,该配置集将energy_performance_preference
和scaling_governor
属性更改为performance
配置集。oracle
-
根据
throughput-performance
配置集,为 Oracle 数据库负载进行了优化。它还禁用透明大内存页,并修改其他与性能相关的内核参数。这个配置集由tuned-profiles-oracle
软件包提供。 desktop
-
根据
balanced
配置文件,为桌面进行了优化的配置集。此外,它还启用了调度程序自动组以更好地响应交互式应用程序。 optimize-serial-console
通过减少 printk 值,将 I/O 活动微调到串行控制台的配置集。这应该使串行控制台更快响应。此配置集用作其他配置集的覆盖。例如:
# tuned-adm profile throughput-performance optimize-serial-console
mssql
-
为 Microsoft SQL Server 提供的配置集。它基于
throughput-performance
配置集。 intel-sst
为带有用户定义的 Intel Speed Select Technology 配置的系统进行优化的配置集。此配置集用作其他配置集的覆盖。例如:
# tuned-adm profile cpu-partitioning intel-sst
1.7. TuneD cpu-partitioning 配置集
要为对延迟敏感的工作负载调整 Red Hat Enterprise Linux 9,红帽建议使用 cpu-partitioning
TuneD 配置集。
在 Red Hat Enterprise Linux 9 之前,低延迟 Red Hat 文档描述了实现低延迟调整所需的大量低级别步骤。在 Red Hat Enterprise Linux 9 中,您可以使用 cpu-partitioning
TuneD 配置集更有效地执行低延迟性能优化。根据个人低延迟应用程序的要求,此配置集可轻松自定义。
下图显示了如何使用 cpu-partitioning
配置集。这个示例使用 CPU 和节点布局。
图 1.1. cpu-partitioning 图
您可以使用以下配置选项在 /etc/tuned/cpu-partitioning-variables.conf
文件中配置 cpu-partitioning 配置集:
- 带有负载均衡的隔离 CPU
在 cpu-partitioning 图中,从 4 到 23 编号的块是默认的隔离 CPU。在这些 CPU 上启用了内核调度程序的进程负载均衡。它专为需要内核调度程序负载平衡的多个线程的低延迟进程而设计。
您可以使用
isolated_cores=cpu-list
选项在/etc/tuned/cpu-partitioning-variables.conf
文件中配置 cpu-partitioning 配置集,它列出了 CPU 来隔离将使用内核调度程序负载平衡。隔离的 CPU 列表用逗号分开,也可以使用一个短划线(如
3-5
)指定范围。这个选项是必须的。这个列表中缺少的任何 CPU 会自动被视为内务 CPU。- 没有负载均衡的隔离 CPU
在 cpu-partitioning 图中,编号为 2 和 3 的块是不提供任何其他内核调度程序进程负载均衡的隔离 CPU。
您可以使用
no_balance_cores=cpu-list
选项在/etc/tuned/cpu-partitioning-variables.conf
文件中配置 cpu-partitioning 配置集,它列出了不使用内核调度程序负载平衡的 CPU。指定
no_balance_cores
选项是可选的,但此列表中的任何 CPU 都必须是isolated_cores
列表中所列 CPU 的子集。使用这些 CPU 的应用程序线程需要单独固定到每个 CPU。
- 日常 CPU
-
在
cpu-partitioning-variables.conf
文件中没有隔离的 CPU 会自动被视为内务 CPU。在内务 CPU 上,允许执行所有服务、守护进程、用户进程、可移动内核线程、中断处理程序和内核计时器。
其他资源
-
系统上的
tuned-profiles-cpu-partitioning (7)
手册页
1.8. 使用 TuneD cpu-partitioning 配置集进行低延迟调整
这个步骤描述了如何使用 TuneD 的 cpu-partitioning
配置集为低延迟调整系统。它使用了低延迟应用的示例,它可以使用 cpu-partitioning
和 CPU 布局,如 cpu-partitioning 图中所述。
本例中的应用程序使用了:
- 从网络读取数据的专用的 reader 线程将固定到 CPU 2。
- 处理此网络数据的大量线程将固定到 CPU 4-23。
- 将处理的数据写入网络的专用写入器线程将固定到 CPU 3。
先决条件
-
您已以 root 用户身份,使用
dnf install tuned-profiles-cpu-partitioning
命令安装cpu-partitioning
TuneD 配置集。
步骤
编辑
/etc/tuned/cpu-partitioning-variables.conf
文件并添加以下信息:# All isolated CPUs: isolated_cores=2-23 # Isolated CPUs without the kernel’s scheduler load balancing: no_balance_cores=2,3
设置
cpu-partitioning
TuneD 配置集:# tuned-adm profile cpu-partitioning
重启
重新引导后,将根据 cpu-partitioning 图中的隔离,为低延迟调优。该应用可以使用 taskset 将读取器和写入器线程固定到 CPU 2 和 3,以及 CPU 4-23 上剩余的应用程序线程。
其他资源
-
系统上的
tuned-profiles-cpu-partitioning (7)
手册页
1.9. 自定义 cpu-partitioning TuneD 配置集
您可以扩展 TuneD 配置集,以进行额外的性能优化更改。
例如,cpu-partitioning
配置集将 CPU 设置为使用 cstate=1
。要使用 cpu-partitioning
配置集,但额外将 CPU cstate 从 cstate1 更改为 cstate0,以下流程描述了一个新的 TuneD 配置集,名称为 my_profile,它继承 cpu-partitioning
配置集,然后设置 C state-0。
步骤
创建
/etc/tuned/my_profile
目录:# mkdir /etc/tuned/my_profile
在此目录中创建
tuned.conf
文件并添加以下内容:# vi /etc/tuned/my_profile/tuned.conf [main] summary=Customized tuning on top of cpu-partitioning include=cpu-partitioning [cpu] force_latency=cstate.id:0|1
使用新配置集:
# tuned-adm profile my_profile
在共享示例中,不需要重新启动。但是,如果 my_profile 配置集中的更改需要重新引导才能生效,则重新启动计算机。
其他资源
-
系统上的
tuned-profiles-cpu-partitioning (7)
手册页
1.10. RHEL 提供的实时 TuneD 配置集
实时配置集适用于运行实时内核的系统。如果没有特殊的内核构建,则不会将系统配置为实时。在 RHEL 上,配置集可从额外的软件仓库获得。
可用的实时配置集如下:
realtime
在裸机实时系统上使用。
由
tuned-profiles-realtime
软件包提供,该软件包可从 RT 或 NFV 存储库中获得。realtime-virtual-host
在为实时配置的虚拟化主机中使用。
由
tuned-profiles-nfv-host
软件包提供,该软件包可通过 NFV 存储库获取。realtime-virtual-guest
在为实时配置的虚拟化客户端中使用。
由
tuned-profiles-nfv-guest
软件包提供,该软件包可通过 NFV 存储库获取。
1.11. TuneD 中的静态和动态性能优化
在决定对于给定情况或目的使用哪种方法时,了解应用 TuneD 的两种系统调优(static和dynamic)之间的区别非常重要。
- 静态调整
-
主要由预定义的
sysctl
和sysfs
设置的应用程序组成,以及激活多个配置工具(如ethtool
)的一次性激活。 - 动态调整
监视如何在系统正常运行时间期间使用各种系统组件。tuned 根据监控信息动态调整系统设置。
例如,硬盘驱动器在启动和登录期间大量使用,但当用户主要可能与 Web 浏览器或电子邮件客户端等应用程序工作时,通常使用。同样,CPU 和网络设备在不同时间上有所不同。TuneD 监控这些组件的活动,并对使用中的更改做出反应。
默认情况下禁用动态性能优化。要启用它,请编辑
/etc/tuned/tuned-main.conf
文件并将dynamic_tuning
选项改为1
。然后 TuneD 会定期分析系统统计信息,并使用它们更新您的系统调优设置。要在这些更新之间配置时间间隔(以秒为单位),请使用update_interval
选项。目前实施了动态调优算法,尝试平衡性能和节能,因此在性能配置集中禁用。可以在 TuneD 配置集中启用或禁用各个插件的动态性能优化。
例 1.2. 工作站上的静态和动态调优
在典型的办公室工作站上,以太网网络接口在大多数时间都不活跃。通常只会发送和接收一些电子邮件,或载入一些网页。
对于这些负载,网络接口不必像默认情况那样始终全速运行。TuneD 为网络设备有一个监控和调优插件,可检测此低活动,然后自动降低该接口的速度,通常会实现较低的功耗。
如果在较长的时间内接口上的活动增加,例如:因为下载了 DVD 镜像或打开了带有大量附加的电子邮件,则 TuneD 会检测到这个信息,并设置接口速度的最大速度,以便在活动级别高时提供最佳性能。
这个原则还用于 CPU 和磁盘的其他插件。
1.12. TuneD no-daemon(非守护进程)模式
您可以在 no-daemon
模式下运行 TuneD,它不需要任何常驻内存。在这个模式中,TuneD 应用设置并退出。
默认情况下,no-daemon
模式被禁用,因为在这个模式中缺少大量 TuneD 功能,包括:
- D-Bus 支持
- 热插支持
- 对设置进行回滚支持
要启用 no-daemon
模式,请在 /etc/tuned/tuned-main.conf
文件中包含以下行:
daemon = 0
1.13. 安装并启用 TuneD
此流程安装并启用 TuneD 应用程序,安装 TuneD 配置集,并为您的系统预设默认 TuneD 配置集。
流程
安装
Tuned
软件包:# dnf install tuned
启用并启动
TuneD
服务:# systemctl enable --now tuned
可选:为实时系统安装 TuneD 配置集:
对于实时系统的 TuneD 配置文件,启用
rhel-9
存储库。# subscription-manager repos --enable=rhel-9-for-x86_64-nfv-beta-rpms
安装它。
# dnf install tuned-profiles-realtime tuned-profiles-nfv
验证 TuneD 配置集是否活跃并应用:
$ tuned-adm active Current active profile: throughput-performance
注意活跃的配置文件 TuneD 会根据您的机器类型和系统设置会自动进行不同的预置。
$ tuned-adm verify Verification succeeded, current system settings match the preset profile. See tuned log file ('/var/log/tuned/tuned.log') for details.
1.14. 列出可用的 TuneD 配置集
此流程列出了系统中当前可用的所有 TuneD 配置集。
步骤
要列出系统中的所有可用 TuneD 配置集,请使用:
$ 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 - 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
要只显示当前活跃的配置集,请使用:
$ tuned-adm active Current active profile: throughput-performance
其他资源
-
系统中
tuned-adm (8)
手册页
1.15. 设置 TuneD 配置集
此流程激活系统中的所选 TuneD 配置集。
先决条件
-
TuneD
服务正在运行。详情请参阅安装和启用 TuneD。
步骤
可选:您可以让 TuneD 为您的系统推荐最合适的配置集:
# tuned-adm recommend throughput-performance
激活配置集:
# tuned-adm profile selected-profile
另外,您可以激活多个配置集的组合:
# tuned-adm profile selected-profile1 selected-profile2
例 1.3. 为低功耗优化的虚拟机
以下示例优化了在虚拟机中运行的系统,以获得最佳性能,并同时将其调优以实现低功耗,低功耗比高性能有更高优先级:
# tuned-adm profile virtual-guest powersave
查看系统中当前活跃的 TuneD 配置集:
# tuned-adm active Current active profile: selected-profile
重启系统:
# reboot
验证
验证 TuneD 配置集是否活跃并应用:
$ tuned-adm verify Verification succeeded, current system settings match the preset profile. See tuned log file ('/var/log/tuned/tuned.log') for details.
其他资源
-
系统中
tuned-adm (8)
手册页
1.16. 使用 TuneD D-Bus 接口
您可以通过 TuneD D-Bus 接口在运行时直接与 TuneD 进行通信,以控制各种 TuneD 服务。
您可以使用 busctl
或 dbus-send
命令访问 D-Bus API。
虽然您可以使用 busctl
或 dbus-send
命令,但 busctl
命令是 systemd
的一部分,因此已在大多数主机上存在。
1.16.1. 使用 TuneD D-Bus 接口来显示可用的 TuneD D-Bus API 方法
您可以使用 TuneD D-Bus 接口查看可与 TuneD 一起使用的的 D-Bus API 方法。
先决条件
- TuneD 服务正在运行。详情请参阅安装和启用 TuneD。
步骤
要查看可用的 TuneD API 方法,请运行:
$ busctl introspect com.redhat.tuned /Tuned com.redhat.tuned.control
输出应类似于以下内容:
NAME TYPE SIGNATURE RESULT/VALUE FLAGS .active_profile method - s - .auto_profile method - (bs) - .disable method - b - .get_all_plugins method - a{sa{ss}} - .get_plugin_documentation method s s - .get_plugin_hints method s a{ss} - .instance_acquire_devices method ss (bs) - .is_running method - b - .log_capture_finish method s s - .log_capture_start method ii s - .post_loaded_profile method - s - .profile_info method s (bsss) - .profile_mode method - (ss) - .profiles method - as - .profiles2 method - a(ss) - .recommend_profile method - s - .register_socket_signal_path method s b - .reload method - b - .start method - b - .stop method - b - .switch_profile method s (bs) - .verify_profile method - b - .verify_profile_ignore_missing method - b - .profile_changed signal sbs - -
您可以在 TuneD 上游存储库 中找到不同的可用方法的描述。
1.16.2. 使用 TuneD D-Bus 接口来更改活跃的 TuneD 配置文件
您可以使用 TuneD D-Bus 接口,将活跃的 TuneD 配置文件替换为所需的 TuneD 配置文件。
先决条件
- TuneD 服务正在运行。详情请参阅安装和启用 TuneD。
步骤
要更改活跃的 TuneD 配置文件,请运行:
$ busctl call com.redhat.tuned /Tuned com.redhat.tuned.control switch_profile s profile (bs) true "OK"
使用所需的配置文件的名称替换 profile。
验证
要查看当前活跃的 TuneD 配置文件,请运行:
$ busctl call com.redhat.tuned /Tuned com.redhat.tuned.control active_profile s "profile"
1.17. 禁用 TuneD
此流程禁用 TuneD,并将所有受影响的系统设置重置为其原始状态,然后再修改 TuneD。
步骤
临时禁用所有调整:
# tuned-adm off
调整会在
TuneD
服务重启后再次应用。或者,要永久停止并禁用
TuneD
服务:# systemctl disable --now tuned
其他资源
-
系统中
tuned-adm (8)
手册页
第 2 章 自定义 TuneD 配置集
您可以创建或修改 TuneD 配置集来优化预期的用例的系统性能。
先决条件
- 安装并启用 TuneD,如安装和启用 TuneD 所述。
2.1. 调优配置集
系统的详细分析可能会非常耗时。TuneD 为典型的用例提供了很多预定义的配置集。您还可以创建、修改和删除配置集。
TuneD 提供的配置集被分为以下几个类别:
- 节能配置集
- 性能提升配置集
性能提升配置集包括侧重于以下方面的配置集:
- 存储和网络的低延迟
- 存储和网络的高吞吐量
- 虚拟机性能
- 虚拟化主机性能
配置集配置的语法
tuned.conf
文件可以包含一个 [main]
部分,其他部分用于配置插件实例。但是,所有部分都是可选的。
以 hash 符号 (#
) 开头的行是注释。
其他资源
-
您系统上的
tuned.conf (5)
手册页
2.2. 默认 TuneD 配置集
在安装过程中,将自动选择您的系统的最佳配置集。目前,会根据以下自定义规则选择默认配置集:
环境 | 默认配置集 | 目标 |
---|---|---|
Compute 节点 |
| 最佳吞吐量性能 |
虚拟机 |
|
最佳的性能。如果实现最佳性能并不是您最需要考虑的,可以将其改为 |
其他情况 |
| 平衡性能和能源消耗 |
其他资源
-
您系统上的
tuned.conf (5)
手册页
2.3. 合并的 TuneD 配置集
作为实验性功能,可以一次性选择更多配置集。tuned 将尝试在负载期间合并它们。
如果存在冲突,则最后指定的配置集的设置会优先使用。
例 2.1. 虚拟客户端中低功耗
以下示例优化了在虚拟机中运行的系统,以获得最佳性能,并同时将其调优以实现低功耗,低功耗比高性能有更高优先级:
# tuned-adm profile virtual-guest powersave
合并会在不检查生成的参数组合是否有意义的情况下自动进行。因此,该功能可能会以相反的方式调整一些参数,这么做可能会影响生产效率。例如,使用 throughput-performance
配置集针对高吞吐量设置磁盘,但当前通过 spindown-disk
配置集将磁盘旋转设置为低值。
其他资源
-
系统中
tuned-adm
和tuned.conf (5)
手册页
2.4. TuneD 配置集的位置
TuneD 配置集存储在以下目录中:
/usr/lib/tuned/
-
特定于分发的配置文件存储在目录中。每个配置集都有自己的目录。该配置集由名为
tuned.conf
的主配置文件以及其他文件(如帮助程序脚本)组成。 /etc/tuned/
-
如果您需要自定义配置集,请将配置集目录复制到用于自定义配置集的目录中。如果同一名称有两个配置集,则使用位于
/etc/tuned/
中的自定义配置集。
其他资源
-
您系统上的
tuned.conf (5)
手册页
2.5. TuneD 配置集之间的继承
TuneD 配置集可以基于其他配置集,仅修改其父级配置集的某些方面。
TuneD 配置集的 [main]
部分可以识别 include
选项:
[main]
include=parent
父 配置集中的所有设置都会加载到此 子 配置集中。在以下小节中,child 配置集可以覆盖从 parent 配置集继承的特定设置,或者添加 parent 配置集中没有的新设置。
您可以基于 /usr/lib/tuned/
中预安装的配置集,在 /etc/tuned/
目录中创建自己的 child 配置集并调整了一些参数。
如果对 parent 配置集(如 TuneD 升级后)进行了更新,则更改会反映在 child 配置集中。
例 2.2. 基于均衡的节能配置集
以下是一个可扩展 balanced
配置集的自定义配置集,并将所有设备的主动链路电源管理 (ALPM) 设置为最大节能项。
[main] include=balanced [scsi_host] alpm=min_power
其他资源
-
您系统上的
tuned.conf (5)
手册页
2.6. TuneD 中的静态和动态性能优化
在决定对于给定情况或目的使用哪种方法时,了解应用 TuneD 的两种系统调优(static和dynamic)之间的区别非常重要。
- 静态调整
-
主要由预定义的
sysctl
和sysfs
设置的应用程序组成,以及激活多个配置工具(如ethtool
)的一次性激活。 - 动态调整
监视如何在系统正常运行时间期间使用各种系统组件。tuned 根据监控信息动态调整系统设置。
例如,硬盘驱动器在启动和登录期间大量使用,但当用户主要可能与 Web 浏览器或电子邮件客户端等应用程序工作时,通常使用。同样,CPU 和网络设备在不同时间上有所不同。TuneD 监控这些组件的活动,并对使用中的更改做出反应。
默认情况下禁用动态性能优化。要启用它,请编辑
/etc/tuned/tuned-main.conf
文件并将dynamic_tuning
选项改为1
。然后 TuneD 会定期分析系统统计信息,并使用它们更新您的系统调优设置。要在这些更新之间配置时间间隔(以秒为单位),请使用update_interval
选项。目前实施了动态调优算法,尝试平衡性能和节能,因此在性能配置集中禁用。可以在 TuneD 配置集中启用或禁用各个插件的动态性能优化。
例 2.3. 工作站上的静态和动态调优
在典型的办公室工作站上,以太网网络接口在大多数时间都不活跃。通常只会发送和接收一些电子邮件,或载入一些网页。
对于这些负载,网络接口不必像默认情况那样始终全速运行。TuneD 为网络设备有一个监控和调优插件,可检测此低活动,然后自动降低该接口的速度,通常会实现较低的功耗。
如果在较长的时间内接口上的活动增加,例如:因为下载了 DVD 镜像或打开了带有大量附加的电子邮件,则 TuneD 会检测到这个信息,并设置接口速度的最大速度,以便在活动级别高时提供最佳性能。
这个原则还用于 CPU 和磁盘的其他插件。
2.7. TuneD 插件
插件是 TuneD 配置集中的模块,TuneD 使用它们监控或优化系统上的不同设备。
TuneD 使用两种类型的插件:
- 监控插件
监控插件用于从正在运行的系统中获取信息。通过调优插件进行动态调优,可以使用监控插件的输出。
当任何已启用的调优插件需要指标时,监控插件会自动实例化。如果两个调优插件需要相同的数据,则只创建一个监控插件的实例,并且数据会被共享。
- 调优插件
- 每个调优插件对单个子系统进行调优,并会获取从 TuneD 配置集填充的多个参数。每个子系统可以有多个设备,如多个 CPU 或网卡,这些设备由调优插件的单个实例处理。还支持单个设备的具体设置。
TuneD 配置集中的插件语法
描述插件实例的部分采用以下格式:
[NAME] type=TYPE devices=DEVICES
- NAME
- 是插件实例的名称,在日志中使用。它可以是一个任意字符串。
- TYPE
- 是调优插件的类型。
- DEVICES
是此插件实例处理的设备列表。
devices
行可以包含一个列表、通配符 (*
) 和负效果 (!
) 。如果没有devices
行,则插件实例处理所有在 TYPE 系统中附加的所有设备。这与使用devices=*
选项相同。例 2.4. 使用插件匹配块设备
以下示例与以
sd
开头的所有块设备(如sda
或sdb
)匹配,且不禁用这些块设备:[data_disk] type=disk devices=sd* disable_barriers=false
以下示例与
sda1
和sda2
以外的所有块设备匹配:[data_disk] type=disk devices=!sda1, !sda2 disable_barriers=false
如果没有指定插件的实例,则不会启用插件。
如果插件支持更多选项,也可以在插件部分中指定它们。如果没有指定选项,且之前未在 included 插件中指定,则使用默认值。
简短插件语法
如果您的插件实例不需要使用自定义名称,且配置文件中只有一个定义,则 TuneD 支持以下短语法:
[TYPE] devices=DEVICES
在这种情况下,可以省略 type
行。然后,实例使用名称来指代,与类型相同。然后,前面的示例可重写为:
例 2.5. 使用简短语法匹配块设备
[disk] devices=sdb* disable_barriers=false
配置集中的冲突插件定义
如果使用 include
选项指定同一部分,则会合并设置。如果因为冲突而无法合并它们,则最后冲突的定义会覆盖上一个设置。如果您不知道之前定义的内容,您可以使用 replace
布尔值选项并将其设置为 true
。这会导致之前带有相同名称的定义被覆盖,且不会出现合并。
您还可以通过指定 enabled=false
选项来禁用插件。这与实例从未定义的影响相同。如果您从 include
选项重新定义之前定义,且不想在自定义配置集中激活插件,则禁用插件会很有用。
- 注意
TuneD 包含了作为启用或禁用调优配置文件的一部分来运行任何 shell 命令的功能。这可让您使用尚未集成到 TuneD 的功能扩展 TuneD 配置集。
您可以使用
script
插件指定任意 shell 命令。
其他资源
-
您系统上的
tuned.conf (5)
手册页
2.8. 可用的 TuneD 插件
监控插件
目前,实施了以下监控插件:
disk
- 每个设备获取磁盘负载(IO 操作数)和测量间隔。
net
- 每个网卡获取网络负载(传输数据包的数量)和测量间隔。
load
- 获取每个 CPU 的 CPU 负载和测量间隔。
调优插件
目前,实施了以下调优插件。只有其中一些插件实施动态性能优化。列出插件支持的选项:
cpu
将 CPU 调控器设置为
governor
选项指定的值,并根据 CPU 负载动态更改电源管理服务质量 (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
,其中 name 与sysctl
实用程序提供的名称相同。如果您需要更改 TuneD 中其他插件所涵盖的系统设置,请使用
sysctl
插件。如果某些特定插件提供了设置,首选这些插件。usb
将 USB 设备的自动暂停超时设置为
autosuspend
参数指定的值。值
0
表示禁用自动暂停。vm
启用或禁用透明大内存页,具体取决于 transparent
_hugepages
选项的值。transparent_hugepages
选项的有效值为:- "always"
- "never"
- "madvise"
audio
将音频解码器的 autosuspend timeout 设置为
timeout
选项指定的值。目前,支持
snd_hda_intel
和snd_ac97_codec
codec。值0
表示自动暂停已被禁用。您还可以通过将 布尔值选项reset_controller
设置为true
来强制实施控制器重置。disk
将磁盘电梯设置为
elevator
选项指定的值。它还设置:
-
apm
选项指定的值的 APM -
调度程序对由
scheduler_quantum
选项指定的值进行量化 -
磁盘 spindown 的超时值由
spindown
选项指定的值 -
磁盘的 readahead 会到
readahead
参数指定的值 -
当前磁盘 readahead 值乘以
readahead_multiply
选项指定的常数
此外,此插件根据当前的驱动器利用率动态地更改驱动器的高级电源管理和机超时设置。动态调优可以由布尔值选项
动态
控制,默认情况下是启用的。-
scsi_host
SCSI 主机的选项调整。
它将积极链接电源管理 (ALPM) 设置为
alpm
选项指定的值。mounts
-
根据
disable_barriers
选项的布尔值启用或禁用挂载障碍。 script
加载或卸载配置集时,执行外部脚本或二进制代码。您可以选择任意可执行文件。
重要script
插件主要被用来与更早的版本兼容。如果其他 TuneD 插件涵盖所需的功能,则首选其他 TuneD 插件。TuneD 使用以下参数之一调用可执行文件:
-
在载入配置集时
start
-
在卸载配置集时
stop
您需要在可执行文件中正确实施
stop
操作,并恢复您在start
操作过程中更改的所有设置。否则,在更改 TuneD 配置集后回滚步骤将无法正常工作。Bash 脚本可以导入
/usr/lib/tuned/functions
Bash 库,并使用那里定义的功能。只在由 TuneD 原生提供的功能中使用这些功能。如果函数名称以下划线开头,如_wifi_set_power_level
,请考虑函数私有且不要在脚本中使用,因为它可能会在以后有所变化。使用插件配置中的
script
参数指定可执行文件的路径。例 2.6. 从配置集运行 Bash 脚本
要运行位于配置集目录中的
script.sh
的 Bash 脚本,请使用:[script] script=${i:PROFILE_DIR}/script.sh
-
在载入配置集时
sysfs
设置由插件选项指定的各种
sysfs
设置。语法为
name=value
,其中 name 是要使用的sysfs
路径。如果需要更改其他插件未涵盖的一些设置,请使用此插件。如果插件涵盖所需的设置,则首选插件。
video
在视频卡中设置各种电源保存级别。目前,只支持 Radeon 卡。
可以使用
radeon_powersave
选项指定节能级别。支持的值有:-
default
-
auto
-
低
-
mid
-
high
-
dynpm
-
dpm-battery
-
dpm-balanced
-
dpm-perfomance
详情请查看 www.x.org。请注意,此插件是实验性的,选项可能会在以后的版本中有所变化。
-
bootloader
在内核命令行中添加选项。这个插件只支持 GRUB 2 引导装载程序。
grub2_cfg_file
选项指定 GRUB 2 配置文件的自定义非标准位置。内核选项会添加到当前 GRUB 配置及其模板中。需要重新引导系统才能使内核选项生效。
切换到另一个配置集或手动停止
TuneD
服务会删除附加选项。如果您关闭或重启系统,则 kernel 选项会在grub.cfg
文件中保留。内核选项可使用以下语法指定:
cmdline=arg1 arg2 ... argN
例 2.7. 修改内核命令行
例如,要将
quiet
kernel 选项添加到 TuneD 配置集中,请在tuned.conf
文件中包括以下行:[bootloader] cmdline=quiet
以下是在内核命令行中添加
isolcpus=2
选项的自定义配置集示例:[bootloader] cmdline=isolcpus=2
service
处理由插件选项指定的各种
sysvinit
、sysv-rc
、openrc
和systemd
服务。语法为
service.service_name=command[,file:file]
。支持的服务处理命令有:
-
start
-
stop
-
enable
-
disable
使用逗号(
、
)或分号(;
)分隔多个命令。如果指令冲突,service
插件将使用最后列出的。使用可选的
file:file
指令,仅为systemd
安装一个覆盖配置文件file
。其他 init 系统会忽略这个指令。service
插件将覆盖配置文件复制到/etc/systemd/system/service_name.service.d/
目录中。卸载配置文件后,如果目录为空,service
插件会删除它们。注意service
插件仅在带有非systemd
init 系统的当前运行级别上运行。例 2.8. 启动并启用带有覆盖文件的sendmail
sendmail
服务[service] service.sendmail=start,enable,file:${i:PROFILE_DIR}/tuned-sendmail.conf
内部变量
${i:PROFILE_DIR}
指向插件从中加载配置文件的目录。-
scheduler
- 提供调优调度优先级的各种选项,CPU 核隔离,以及进程、线程和 IRQ 相关性。
有关可用的不同选项的具体内容,请参阅 scheduler
TuneD 插件的功能。
2.9. scheduler
TuneD 插件的功能
使用 scheduler
TuneD 插件控制并调优调度优先级、CPU 核隔离和进程、线程和 IRQ 相关性。
CPU 隔离
要防止进程、线程和 IRQ 使用某些 CPU,请使用 isolated_cores
选项。它更改进程和线程关联性、IRQ 关联性,并为 IRQ 设置 default_smp_affinity
参数。
根据 sched_setaffinity()
系统调用的成功,对与 ps_whitelist
选项匹配的所有进程和线程,会调整 CPU 关联性掩码。ps_whitelist
正则表达式的默认设置是 .*
,以匹配所有进程和线程名称。要排除某些进程和线程,请使用 ps_blacklist
选项。这个选项的值也被解释为一个正则表达式。进程和线程名称与该表达式匹配。配置文件回滚可让所有匹配的进程和线程在所有 CPU 上运行,并在配置文件应用程序之前恢复 IRQ 设置。
对于 ps_whitelist
和 ps_blacklist
选项,支持用 ;
分隔的多个正则表达式。转义的分号 \;
按字面处理。
例 2.9. 隔离 CPU 2-4
以下配置隔离 CPU 2-4.与 ps_blacklist
正则表达式匹配的进程和线程可以使用任何 CPU,而不考虑隔离:
[scheduler] isolated_cores=2-4 ps_blacklist=.*pmd.*;.*PMD.*;^DPDK;.*qemu-kvm.*
IRQ SMP 关联性
/proc/irq/default_smp_affinity
文件包含一个位掩码,表示系统上所有不活跃中断请求(IRQ)源的的默认目标 CPU 核。激活或分配 IRQ 后,/proc/irq/default_smp_affinity
文件中的值决定 IRQ 的关联性位掩码。
default_irq_smp_affinity
参数控制 TuneD 向 /proc/irq/default_smp_affinity
文件中写入什么。default_irq_smp_affinity
参数支持以下值和行为:
calc
从
isolated_cores
参数计算/proc/irq/default_smp_affinity
文件的内容。isolated_cores
参数的反转计算非隔离核。然后,将非隔离核和之前
/proc/irq/default_smp_affinity
文件的交集写入/proc/irq/default_smp_affinity
文件中。如果省略了
default_irq_smp_affinity
参数,则这是默认行为。ignore
-
TuneD 不修改
/proc/irq/default_smp_affinity
文件。 - CPU 列表
使用单个数字的形式,如
1
,逗号分隔的列表,如1、3
或范围,如3-5
。解开 CPU 列表,并将其直接写到
/proc/irq/default_smp_affinity
文件中。
例 2.10. 使用显式 CPU 列表设置默认的 IRQ smp 关联性
以下示例使用显式 CPU 列表将默认的 IRQ SMP 关联性设置为 CPU 0 和 2:
[scheduler] isolated_cores=1,3 default_irq_smp_affinity=0,2
调度策略
要调整一组进程或线程的调度策略、优先级和关联性,请使用以下语法:
group.groupname=rule_prio:sched:prio:affinity:regex
其中 rule_prio
定义规则的内部 TuneD 优先级。规则根据优先级排序。这是继承的需要,以能够重新排序之前定义的规则。应按照定义的顺序处理相同的 rule_prio
规则。但是,这是依赖于 Python 解释器。要禁用 groupname
的一个继承规则,请使用:
group.groupname=
sched
必须是以下之一:
f
- 对于先进先出(FIFO)
b
- 对于批处理
r
- 对于循环
o
- 对于其他
*
- 对于不更改
关联性
是十六进制的 CPU 关联性。对于没有更改,使用 *
。
prio
是调度优先级(请参阅 chrt -m
)。
regex
是 Python 正则表达式。它与 ps -eo cmd
命令的输出匹配。
任何给定的进程名称可以匹配多个组。在这种情况下,最后匹配的 regex
决定优先级和调度策略。
例 2.11. 设置调度策略和优先级
以下示例对内核线程和 watchdog 设置调度策略和优先级:
[scheduler] group.kthreads=0:*:1:*:\[.*\]$ group.watchdog=0:f:99:*:\[watchdog.*\]
scheduler
插件使用 perf
事件循环来识别新创建的进程。默认情况下,它侦听 perf.RECORD_COMM
和 perf.RECORD_EXIT
事件。
将 perf_process_fork
参数设置为 true
,来告知插件也侦听 perf.RECORD_FORK
事件,这意味着由 fork ()
系统调用创建的子进程已被处理。
处理 perf
事件可能会造成大量 CPU 开销。
可以使用 scheduler runtime
选项来缓解scheduler 插件的 CPU 开销,并将其设置为 0
。这会完全禁用动态 scheduler 功能,并且不会对 perf 事件进行监控和操作。这样做的缺点是,进程和线程调优只能在配置文件应用程序中完成。
例 2.12. 禁用动态 scheduler 功能
以下示例禁用了动态 scheduler 功能,同时也隔离了 CPU 1 和 3:
[scheduler] runtime=0 isolated_cores=1,3
mmapped
缓冲用于 perf
事件。在负载过重时,此缓冲区可能会溢出,因此插件可能会开始丢失事件,不会处理一些新创建的进程。在这种情况下,使用 perf_mmap_pages
参数来增加缓冲区大小。perf_mmap_pages
参数的值必须是 2 的幂。如果没有手动设置 perf_mmap_pages
参数,则使用默认值 128。
使用 cgroups
的限制
scheduler
插件支持使用 cgroup
v1 的进程和线程限制。
cgroup_mount_point
选项指定挂载 cgroup 文件系统的路径,或者 TuneD 预期它挂载在哪里。如果未设置,则预期为 /sys/fs/cgroup/cpuset
。
如果 cgroup_groups_init
选项被设置为 1
,则TuneD 会创建和删除使用 cgroup*
选项定义的所有 cgroups
。这是默认的行为。如果 cgroup_mount_point
选项设为 0
,则必须使用其他方法预设置 cgroups
。
如果 cgroup_mount_point_init
选项被设置为 1
,则TuneD 会创建和删除 cgroup 挂载点。其暗示 cgroup_groups_init = 1
。如果 cgroup_mount_point_init
选项被设置为 0
,则必须通过其他方法预设置 cgroups
挂载点。这是默认的行为。
cgroup_for_isolated_cores
选项是 isolated_cores
选项功能的 cgroup
名称。例如,如果系统有 4 个 CPU,isolated_cores=1
表示 Tuned 将所有进程和线程移到 CPU 0、2 和 3。scheduler
插件通过将计算的 CPU 关联性写入指定 cgroup 的 cpuset.cpus
控制文件来隔离指定的核,并将所有匹配的进程和线程移到这个组中。如果此选项未设置,则使用 sched_setaffinity ()
的经典 cpuset 关联性设置 CPU 关联性。
cgroup.cgroup_name
选项为任意 cgroup
定义关联性。您甚至可以使用层次结构的 cgroups,但您必须按正确顺序指定层次结构。TuneD 不会在此处做任何健全性检查,但它会强制 cgroup
位于 cgroup_mount_point
选项指定的位置。
以 group.
开头的 scheduler 选项的语法已被增强来使用 cgroup.cgroup_name
,而不是十六进制 关联性
。匹配的进程被移到 cgroup
cgroup_name
中。您还可以使用不是由 cgroup.
选项定义的 cgroups,如上所述。例如,cgroups
不是由 TuneD 管理的。
所有 cgroup
名称通过使用斜杠(/
)替换所有句点(.
.)来进行清理。这可防止插件写到 cgroup_mount_point
选项指定的位置外。
例 2.13. 使用带有 scheduler
插件的 cgroup
v1
以下示例创建 2 个 cgroups
,group1
和 group2
。它将 cgroup group1
关联性设置为 CPU 2,将 cgroup
group2
设置为 CPU 0 和 2。假有定 4 个 CPU 设置,isolated_cores=1
选项将所有进程和线程移到 CPU 核 0、2 和 3。ps_blacklist
正则表达式指定的进程和线程没有移动。
[scheduler] cgroup_mount_point=/sys/fs/cgroup/cpuset cgroup_mount_point_init=1 cgroup_groups_init=1 cgroup_for_isolated_cores=group cgroup.group1=2 cgroup.group2=0,2 group.ksoftirqd=0:f:2:cgroup.group1:ksoftirqd.* ps_blacklist=ksoftirqd.*;rcuc.*;rcub.*;ktimersoftd.* isolated_cores=1
cgroup_ps_blacklist
选项排除了属于指定 cgroup
的进程。此选项指定的正则表达式与 /proc/PID/cgroups
的 cgroup
层次结构匹配。在正则表达式匹配前,逗号(,
)将 cgroups
v1 层次结构与 /proc/PID/cgroups
分隔开。以下是正则表达式匹配的内容的示例:
10:hugetlb:/,9:perf_event:/,8:blkio:/
多个正则表达式可以通过分号(;
)分隔。分号表示逻辑"或"运算符。
例 2.14. 使用 cgroup 从调度程序中排除进程
在以下示例中,scheduler
插件将所有进程从核 1 移出,但属于 cgroup /daemons
的进程除外。\b
字符串是一个与单词边界匹配的正则表达式元字符。
[scheduler] isolated_cores=1 cgroup_ps_blacklist=:/daemons\b
在以下示例中,scheduler
插件排除了属于层次结构 ID 为 8 和 controller-list blkio
的 cgroup 的所有进程。
[scheduler] isolated_cores=1 cgroup_ps_blacklist=\b8:blkio:
最近的内核将一些 sched_
和 numa_balancing_
内核运行时参数从 sysctl
工具管理的 /proc/sys/kernel
目录移到 debugfs
,通常挂载在 /sys/kernel/debug
目录下。TuneD 通过 scheduler
插件为以下参数提供抽象机制,其中,根据使用的内核,TuneD 将指定的值写到正确的位置:
-
sched_min_granularity_ns
-
sched_latency_ns
, -
sched_wakeup_granularity_ns
-
sched_tunable_scaling
, -
sched_migration_cost_ns
-
sched_nr_migrate
-
numa_balancing_scan_delay_ms
-
numa_balancing_scan_period_min_ms
-
numa_balancing_scan_period_max_ms
numa_balancing_scan_size_mb
例 2.15. 为迁移决策设置任务的"cache hot"值。
在旧内核上,设置以下参数意味着
sysctl
将值500000
写到/proc/sys/kernel/sched_migration_cost_ns
文件中:[sysctl] kernel.sched_migration_cost_ns=500000
在最近的内核上,这相当于通过
scheduler
插件设置以下参数:[scheduler] sched_migration_cost_ns=500000
意味着 TuneD 将值
500000
写到/sys/kernel/debug/sched/migration_cost_ns
文件中。
2.10. TuneD 配置集中的变量
激活 TuneD 配置集时,在运行时扩展的变量。
使用 TuneD 变量可减少 TuneD 配置集中必要输入的数量。
TuneD 配置集中没有预定义的变量。您可以通过在配置集中创建 [variables]
部分并使用以下语法来定义您自己的变量:
[variables] variable_name=value
要扩展配置集中的变量的值,请使用以下语法:
${variable_name}
例 2.16. 使用变量隔离 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}
如果您将 isolated_cores=1,2
选项添加到 /etc/tuned/my-variables.conf
文件,则内核会使用 isolcpus=1,2
选项引导。
其他资源
-
您系统上的
tuned.conf (5)
手册页
2.11. TuneD 配置集中的内置功能
当激活 TuneD 配置集时,内置功能会在运行时扩展。
您可以:
- 与 TuneD 变量一起使用各种内置功能
- 在 Python 中创建自定义功能,并以插件的形式将它们添加到 TuneD
要调用函数,请使用以下语法:
${f:function_name:argument_1:argument_2}
要扩展配置集和 tuned.conf
文件所在的目录路径,请使用 PROFILE_DIR
功能,它需要特殊语法:
${i:PROFILE_DIR}
例 2.17. 使用变量和内置功能隔离 CPU 内核
在以下示例中, ${non_isolated_cores}
变量扩展至 0,3-5
,且 cpulist_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)
手册页
2.12. TuneD 配置集中的内置功能
所有 TuneD 配置集中都有以下内置功能:
PROFILE_DIR
-
返回配置文件和
tuned.conf
文件所在的目录路径。 exec
- 执行进程并返回其输出。
assertion
- 比较两个参数。如果不匹配,会在日志中记录来自第一个参数的信息,并中止配置集加载。
assertion_non_equal
- 比较两个参数。如果不匹配,会在日志中记录来自第一个参数的信息,并中止配置集加载。
kb2s
- 将 KB 转换为磁盘扇区.
s2kb
- 将磁盘扇区转换为 KB。
strip
- 从所有传递的参数创建字符串,并删除前导和尾随空格。
virt_check
检查 TuneD 是否在虚拟机 (VM) 或裸机中运行:
- 在虚拟机内部,函数返回第一个参数。
- 在裸机上,函数返回第二个参数,即使出现错误。
cpulist_invert
-
颠倒 CPU 列表,使其补充。例如,在一个有 4 个 CPU 的系统上,从 0 到 3,列表
0,2,3
的反转是1
。 cpulist2hex
- 将 CPU 列表转换为十六进制 CPU 掩码。
cpulist2hex_invert
- 将 CPU 列表转换为十六进制 CPU 掩码并进行反转。
hex2cpulist
- 将十六进制 CPU 掩码转换为 CPU 列表。
cpulist_online
- 检查列表中的 CPU 是否在线。返回仅包含在线 CPU 的列表。
cpulist_present
- 检查列表中是否存在 CPU。返回只包含当前 CPU 的列表。
cpulist_unpack
-
解包 CPU 列表,格式为
1-3,4
到1,2,3,4
。 cpulist_pack
-
把包 CPU 列表,格式为
1,2,3,5
到1-3,5
2.13. 创建新的 TuneD 配置集
此流程使用自定义性能配置集创建一个新的 TuneD 配置集。
先决条件
-
TuneD
服务正在运行。详情请参阅安装和启用 TuneD。
步骤
在
/etc/tuned/
目录中,创建一个名为您要创建的配置集的新目录:# mkdir /etc/tuned/my-profile
在新目录中,创建名为
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
要激活配置集,请使用:
# 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.
其他资源
-
您系统上的
tuned.conf (5)
手册页
2.14. 修改现有 TuneD 配置集
此流程根据现有的 TuneD 配置集创建修改后的子配置集。
先决条件
-
TuneD
服务正在运行。详情请参阅安装和启用 TuneD。
步骤
在
/etc/tuned/
目录中,创建一个名为您要创建的配置集的新目录:# mkdir /etc/tuned/modified-profile
在新目录中,创建一个名为
tuned.conf
的文件,并按如下所示设置[main]
部分:[main] include=parent-profile
使用您要修改的配置集的名称替换 parent-profile。
包括您的配置集修改。
例 2.18. 在 throughput-performance 配置集中降低 swappiness
要使用
throughput-performance
配置集的设置,并将vm.swappiness
的值改为 5,而不是默认的 10,请使用:[main] include=throughput-performance [sysctl] vm.swappiness=5
要激活配置集,请使用:
# tuned-adm profile modified-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.
其他资源
-
您系统上的
tuned.conf (5)
手册页
2.15. 使用 TuneD 设置磁盘调度程序
此流程创建并启用 TuneD 配置集,该配置集为所选块设备设置给定磁盘调度程序。这个设置会在系统重启后保留。
在以下命令和配置中替换:
-
带有块设备名称的 device,如
sdf
-
带有您要为该设备设置的磁盘调度程序的 selected-scheduler,例如
bfq
先决条件
-
TuneD
服务已安装并启用。详情请参阅安装和启用 TuneD。
流程
可选:选择一个您的配置集将要基于的现有 Tuned 配置集。有关可用配置集列表,请参阅 RHEL 提供的 TuneD 配置集。
要查看哪个配置集当前处于活跃状态,请使用:
$ tuned-adm active
创建一个新目录来保存 TuneD 配置集:
# mkdir /etc/tuned/my-profile
查找所选块设备系统唯一标识符:
$ 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
注意本例中的命令将返回以 World Wide Name (WWN) 或与指定块设备关联的序列号的所有值。虽然最好使用 WWN,但给定设备始终不能使用 WWN,但 example 命令返回的任何值都可以接受用作 device system unique ID。
创建
/etc/tuned/my-profile/tuned.conf
配置文件。在该文件中设置以下选项:可选:包含现有配置集:
[main] include=existing-profile
为与 WWN 标识符匹配的设备设置所选磁盘调度程序:
[disk] devices_udev_regex=IDNAME=device system unique id elevator=selected-scheduler
在这里:
-
使用要使用的标识符的名称替换 IDNAME (如
ID_WWN
)。 将 device system unique id 替换为所选标识符的值(如
0x5002538d00000000
)。要匹配
devices_udev_regex
选项中的多个设备,将标识符放在括号中,并使用垂直栏来分离它们:devices_udev_regex=(ID_WWN=0x5002538d00000000)|(ID_WWN=0x1234567800000000)
-
使用要使用的标识符的名称替换 IDNAME (如
启用您的配置集:
# 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.
读取
/sys/block/设备/queue/scheduler
文件的内容:# cat /sys/block/device/queue/scheduler [mq-deadline] kyber bfq none
在文件名中,将 device 替换为块设备名称,如
sdc
。活跃的调度程序列在方括号中 (
[]
) 。
其他资源
第 3 章 使用 tuna 接口检查系统
tuna
工具减少了执行调优任务的复杂性。使用 tuna
调整调度程序可调项、调优线程优先级、RRQ 处理程序以及隔离 CPU 核和套接字。通过使用 tuna
工具,您可以执行以下操作:
- 列出系统上的 CPU。
- 列出系统上当前运行的中断请求(IRQ)。
- 更改有关线程的策略和优先级信息。
- 显示系统的当前策略和优先级。
3.1. 安装 tuna 工具
tuna
工具设计为在运行中的系统上使用。这允许特定应用程序的测量工具在更改后马上查看和分析系统性能。
流程
安装
tuna
工具:# dnf install tuna
验证
显示可用的
tuna
CLI 选项:# tuna -h
其他资源
-
系统上
tuna (8)
手册页
3.2. 使用 tuna 工具查看系统状态
您可以使用 tuna
命令行界面(CLI)工具查看系统状态。
先决条件
-
tuna
工具已安装。如需更多信息,请参阅 安装 tuna 工具。
流程
查看当前的策略和优先级:
# tuna show_threads pid SCHED_ rtpri affinity cmd 1 OTHER 0 0,1 init 2 FIFO 99 0 migration/0 3 OTHER 0 0 ksoftirqd/0 4 FIFO 99 0 watchdog/0
或者,要查看与 PID 或与命令名称匹配的具体线程,请输入:
# tuna show_threads -t pid_or_cmd_list
pid_or_cmd_list 参数是一个用逗号分开的 PID 或 command-name 模式的列表。
根据您的场景,执行以下操作之一:
-
要使用
tuna
CLI 调优 CPU,请完成 使用 tuna 工具调优 CPU 中的步骤。 -
要使用
tuna
工具调优 IRQ,请完成 使用 tuna工具调优 IRQ 中的步骤。
-
要使用
保存更改的配置:
# tuna save filename
这个命令只保存当前运行的内核线程。未运行的进程不会保存。
其他资源
-
系统上
tuna (8)
手册页
3.3. 使用 tuna 工具调优 CPU
tuna
工具命令可以针对单个 CPU 为目标。通过使用 tuna
工具,您可以执行以下操作:
隔离 CPU
- 在指定 CPU 上运行的所有任务都移至下一个可用 CPU。通过将 CPU 从所有线程的关联性掩码中删除来隔离 CPU ,使其不可用。
包括 CPU
- 允许任务在指定的 CPU 上运行。
恢复 CPU
- 将指定的 CPU 恢复到之前的配置。
先决条件
-
tuna
工具已安装。如需更多信息,请参阅 安装 tuna 工具。
流程
列出所有 CPU,并指定受命令影响的 CPU 的列表:
# ps ax | awk 'BEGIN { ORS="," }{ print $1 }' PID,1,2,3,4,5,6,8,10,11,12,13,14,15,16,17,19
在
tuna
界面中显示线程列表:# tuna show_threads -t 'thread_list from above cmd'
指定要受某一命令影响的 CPU 的列表:
# *tuna [command] --cpus cpu_list *
cpu_list 参数是一个用逗号分开的 CPU 号的列表,如
--cpus 0,2
。要将特定 CPU 添加到当前的 cpu_list 中,请使用例如
--cpus +0
。根据您的场景,执行以下操作之一:
要隔离一个 CPU,请输入:
# tuna isolate --cpus cpu_list
要包括一个 CPU,请输入:
# tuna include --cpus cpu_list
要使用具有四个或更多处理器的系统,请使所有
ssh
线程在 CPU 0 和 1 上运行,使所有http
线程在 CPU 2 和 3 上运行:# tuna move --cpus 0,1 -t ssh* # tuna move --cpus 2,3 -t http\*
验证
显示当前配置,并验证更改是否已应用:
# tuna show_threads -t ssh* pid SCHED_ rtpri affinity voluntary nonvoluntary cmd 855 OTHER 0 0,1 23 15 sshd # tuna show_threads -t http\* pid SCHED_ rtpri affinity voluntary nonvoluntary cmd 855 OTHER 0 2,3 23 15 http
其他资源
-
/proc/cpuinfo
文件 -
系统上
tuna (8)
手册页
3.4. 使用 tuna 工具调优 IRQ
/proc/interrupts
文件记录每个 IRQ 的中断数、中断类型和位于 IRQ 的设备的名称。
先决条件
-
tuna
工具已安装。如需更多信息,请参阅安装 tuna 工具。
流程
查看当前的 IRQ 及其关联性:
# tuna show_irqs # users affinity 0 timer 0 1 i8042 0 7 parport0 0
指定要受某一命令影响的 IRQ 的列表:
# tuna [command] --irqs irq_list --cpus cpu_list
irq_list 参数是用逗号分开的 IRQ 编号或 user-name 模式的列表。
将 [command] 替换为例如
--spread
:将一个中断移到指定的 CPU 中:
# tuna show_irqs --irqs 128 users affinity 128 iwlwifi 0,1,2,3 # tuna move --irqs 128 --cpus 3
使用 irq_list 参数替换 128,将 3 替换为 cpu_list 参数。
cpu_list 参数是一个用逗号分开的 CPU 号的列表,如
--cpus 0,2
。如需更多信息,请参阅 使用 tuna 工具调优 CPU。
验证
在将任何中断移到特定的 CPU 之前和之后,比较所选 IRQs 的状态:
# tuna show_irqs --irqs 128 users affinity 128 iwlwifi 3
其他资源
-
/procs/interrupts
文件 -
系统上
tuna (8)
手册页
第 4 章 使用 RHEL 系统角色监控性能
作为系统管理员,您可以使用 metrics
RHEL 系统角色监控系统的性能。
4.1. 准备一个控制节点和受管节点来使用 RHEL 系统角色
在使用单独的 RHEL 系统角色管理服务和设置前,您必须准备控制节点和受管节点。
4.1.1. 在 RHEL 9 上准备一个控制节点
在使用 RHEL 系统角色前,您必须配置一个控制节点。然后,此系统根据 playbook 从清单中配置受管主机。
前提条件
- 该系统已在客户门户网站中注册。
-
Red Hat Enterprise Linux Server
订阅已附加到系统。 -
可选:
Ansible Automation Platform
订阅被附加到系统上。
流程
创建一个名为
ansible
的用户,来管理并运行 playbook:[root@control-node]# useradd ansible
切换到新创建的
ansible
用户:[root@control-node]# su - ansible
以这个用户身份执行其余步骤。
创建一个 SSH 公钥和私钥:
[ansible@control-node]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/ansible/.ssh/id_rsa): Enter passphrase (empty for no passphrase): <password> Enter same passphrase again: <password> ...
为密钥文件使用推荐的默认位置。
- 可选: 要防止 Ansible 在每次建立连接时提示您输入 SSH 密钥密码,请配置一个 SSH 代理。
使用以下内容创建
~/.ansible.cfg
文件:[defaults] inventory = /home/ansible/inventory remote_user = ansible [privilege_escalation] become = True become_method = sudo become_user = root become_ask_pass = True
注意~/.ansible.cfg
文件中的设置具有更高的优先级,并覆盖全局/etc/ansible/ansible.cfg
文件中的设置。使用这些设置,Ansible 执行以下操作:
- 管理指定清单文件中的主机。
-
当帐户建立到受管节点的 SSH 连接时,使用
remote_user
参数中设置的帐户。 -
使用
sudo
工具,以root
用户身份在受管节点上执行任务。 - 每次应用 playbook 时,都会提示输入远程用户的 root 密码。出于安全考虑,建议这样做。
创建一个列出受管主机主机名的 INI 或 YAML 格式的
~/inventory
文件。您还可以在清单文件中定义主机组。例如,以下是 INI 格式的清单文件,它有三个主机,以及一个名为US
的主机组:managed-node-01.example.com [US] managed-node-02.example.com ansible_host=192.0.2.100 managed-node-03.example.com
请注意,控制节点必须能够解析主机名。如果 DNS 服务器无法解析某些主机名,请在主机条目旁边添加
ansible_host
参数来指定其 IP 地址。安装 RHEL 系统角色:
在没有 Ansible Automation Platform 的 RHEL 主机上,安装
rhel-system-roles
软件包:[root@control-node]# dnf install rhel-system-roles
此命令在
/usr/share/ansible/collections/ansible_collections/redhat/rhel_system_roles/
目录中安装集合,且ansible-core
软件包作为依赖项。在 Ansible Automation Platform 上,以
ansible
用户身份执行以下步骤:-
在
~/.ansible.cfg
文件中 将 Red Hat Automation hub 定义为内容的主要来源。 从 Red Hat Automation Hub 安装
redhat.rhel_system_roles
集合:[ansible@control-node]$ ansible-galaxy collection install redhat.rhel_system_roles
此命令在
~/.ansible/collections/ansible_collections/redhat/rhel_system_roles/
目录中安装集合。
-
在
后续步骤
- 准备受管节点。如需更多信息,请参阅 准备一个受管节点。
4.1.2. 准备受管节点
受管节点是在清单中列出的系统,它由控制节点根据 playbook 进行配置。您不必在受管主机上安装 Ansible。
前提条件
- 您已准备好了控制节点。如需更多信息,请参阅 在 RHEL 9 上准备一个控制节点。
您从控制节点进行 SSH 访问的权限。
重要以
root
用户身份进行直接的 SSH 访问是一个安全风险。要降低这个风险,您将在此节点上创建一个本地用户,并在准备受管节点时配置一个sudo
策略。然后,控制节点上的 Ansible 可以使用本地用户帐户登录到受管节点,并以不同的用户身份(如root
)运行 playbook。
流程
创建一个名为
ansible
的用户:[root@managed-node-01]# useradd ansible
控制节点稍后使用这个用户建立与这个主机的 SSH 连接。
为
ansible
用户设置密码:[root@managed-node-01]# passwd ansible Changing password for user ansible. New password: <password> Retype new password: <password> passwd: all authentication tokens updated successfully.
当 Ansible 使用
sudo
以root
用户身份执行任务时,您必须输入此密码。在受管主机上安装
ansible
用户的 SSH 公钥:以
ansible
用户身份登录到控制节点,并将 SSH 公钥复制到受管节点:[ansible@control-node]$ ssh-copy-id managed-node-01.example.com /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ansible/.ssh/id_rsa.pub" The authenticity of host 'managed-node-01.example.com (192.0.2.100)' can't be established. ECDSA key fingerprint is SHA256:9bZ33GJNODK3zbNhybokN/6Mq7hu3vpBXDrCxe7NAvo.
当提示时,输入
yes
进行连接:Are you sure you want to continue connecting (yes/no/[fingerprint])? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
当提示时,输入密码:
ansible@managed-node-01.example.com's password: <password> Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'managed-node-01.example.com'" and check to make sure that only the key(s) you wanted were added.
通过在控制节点上远程执行命令来验证 SSH 连接:
[ansible@control-node]$ ssh managed-node-01.example.com whoami ansible
为
ansible
用户创建sudo
配置:使用
visudo
命令创建并编辑/etc/sudoers.d/ansible
文件:[root@managed-node-01]# visudo /etc/sudoers.d/ansible
与普通编辑器相比,使用
visudo
的好处是,在安装文件前,该工具提供基本的检查,如解析错误。在
/etc/sudoers.d/ansible
文件中配置满足您要求的sudoers
策略,例如:要为
ansible
用户授予权限,以便在输入ansible
用户密码后在此主机上以任何用户和组身份来运行所有命令,请使用:ansible ALL=(ALL) ALL
要向
ansible
用户授予权限,以便在不输入ansible
用户密码的情况下在该主机上以任何用户和组身份来运行所有命令,请使用:ansible ALL=(ALL) NOPASSWD: ALL
或者,配置匹配您安全要求的更精细的策略。有关
sudoers
策略的详情,请查看sudoers (5)
手册页。
验证
验证您可以在所有受管节点上执行来自控制节点的命令:
[ansible@control-node]$ ansible all -m ping BECOME password: <password> managed-node-01.example.com | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } ...
硬编码的所有组会动态包含清单文件中列出的所有主机。
使用 Ansible
command
模块在所有受管节点上运行whoami
工具来验证特权升级是否正常工作:[ansible@control-node]$ ansible all -m command -a whoami BECOME password: <password> managed-node-01.example.com | CHANGED | rc=0 >> root ...
如果命令返回 root,则您在受管节点上正确地配置了
sudo
。
其他资源
- 在 RHEL 9 上准备一个控制节点
-
sudoers (5)
手册页
4.2. metrics
RHEL 系统角色简介
RHEL 系统角色是 Ansible 角色和模块的集合,其提供一致的配置接口来远程管理多个 RHEL 系统。metrics
系统角色为本地系统配置性能分析服务,并可以选择包含要由本地系统监控的远程系统的列表。metrics
系统角色可让您使用 pcp
来监控系统的性能,而无需单独配置 pcp
,因为 pcp
的设置和部署是已由 playbook 处理。
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.metrics/README.md
文件 -
/usr/share/doc/rhel-system-roles/metrics/
directory
4.3. 使用 metrics
RHEL 系统角色,以可视化方式监控本地系统
此流程描述了如何使用 metrics
RHEL 系统角色来监控您的本地系统,同时通过 Grafana
提供数据可视化。
前提条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 localhost
在控制节点上的清单文件中被配置:localhost ansible_connection=local
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Manage metrics hosts: localhost roles: - rhel-system-roles.metrics vars: metrics_graph_service: yes metrics_manage_firewall: true metrics_manage_selinux: true
因为
metrics_graph_service
布尔值被设置为value="yes"
,所以Grafana
会被自动安装,并使用pcp
置备为数据源。因为metrics_manage_firewall
和metrics_manage_selinux
都被设为了true
,所以 metrics 角色使用firewall
和selinux
系统角色来管理 metrics 角色使用的端口。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
-
要查看机器上收集的指标的视图,请访问
grafanaweb
界面 ,如 访问 Grafana web UI 中所述。
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.metrics/README.md
文件 -
/usr/share/doc/rhel-system-roles/metrics/
directory
4.4. 使用 metrics
RHEL 系统角色设置一组单独的系统,来监控它们自己
此流程描述了如何使用 metrics
系统角色设置一组机器来监控其自身。
前提条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure a fleet of machines to monitor themselves hosts: managed-node-01.example.com roles: - rhel-system-roles.metrics vars: metrics_retention_days: 0 metrics_manage_firewall: true metrics_manage_selinux: true
因为
metrics_manage_firewall
和metrics_manage_selinux
都被设为了true
,所以 metrics 角色使用firewall
和selinux
角色来管理metrics
角色使用的端口。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.metrics/README.md
文件 -
/usr/share/doc/rhel-system-roles/metrics/
directory
4.5. 使用 metrics
RHEL 系统角色,使用本地机器集中监控一组机器
此流程描述了如何使用 metrics
系统角色设置本地机器来集中监控一组机器,同时通过 grafana
提供数据的视觉化,并通过 redis
提供数据的查询。
前提条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 localhost
在控制节点上的清单文件中被配置:localhost ansible_connection=local
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:- name: Set up your local machine to centrally monitor a fleet of machines hosts: localhost roles: - rhel-system-roles.metrics vars: metrics_graph_service: yes metrics_query_service: yes metrics_retention_days: 10 metrics_monitored_hosts: ["database.example.com", "webserver.example.com"] metrics_manage_firewall: yes metrics_manage_selinux: yes
因为
metrics_graph_service
和metrics_query_service
布尔值被设置为了value="yes"
,所以grafana
会被自动安装,并使用pcp
置备为数据源,并将pcp
数据记录索引到redis
中,允许pcp
查询语言用于复杂的数据查询。因为metrics_manage_firewall
和metrics_manage_selinux
都被设为了true
,所以metrics
角色使用firewall
和selinux
角色来管理metrics
角色使用的端口。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
-
要查看机器集中收集的指标的图形表示,并查询数据,请访问
grafana
web 界面,如 访问 Grafana Web UI 中所述。
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.metrics/README.md
文件 -
/usr/share/doc/rhel-system-roles/metrics/
directory
4.6. 使用 metrics
RHEL 系统角色,在监控系统时设置身份验证
PCP 通过简单身份验证安全层 (SASL) 框架支持 scram-sha-256
验证机制。metrics
RHEL 系统角色使用 scram-sha-256
身份验证机制自动化设置身份验证的步骤。这个流程描述了如何使用 metrics
RHEL 系统角色设置身份验证。
前提条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
步骤
编辑现有的 playbook 文件,如
~/playbook.yml
,并添加与身份验证相关的变量:--- - name: Set up authentication by using the scram-sha-256 authentication mechanism hosts: managed-node-01.example.com roles: - rhel-system-roles.metrics vars: metrics_retention_days: 0 metrics_manage_firewall: true metrics_manage_selinux: true metrics_username: <username> metrics_password: <password>
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
验证
sasl
配置:# pminfo -f -h "pcp://managed-node-01.example.com?username=<username>" disk.dev.read Password: <password> disk.dev.read inst [0 or "sda"] value 19540
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.metrics/README.md
文件 -
/usr/share/doc/rhel-system-roles/metrics/
directory
4.7. 使用 metrics
RHEL 系统角色为 SQL Server 配置并启用指标集合
此流程描述了如何使用 metrics
RHEL 系统角色,通过本地系统上的 pcp
来自动化配置,并为 Microsoft SQL Server 启用指标集合。
前提条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您已 安装了用于 Red Hat Enterprise Linux 的 Microsoft SQL Server,并建立了一个与 SQL 服务器的可信连接。
- 您已 为用于 Red Hat Enterprise Linux 的 SQL Server 安装了 Microsoft ODBC 驱动程序。
localhost
在控制节点上的清单文件中被配置:localhost ansible_connection=local
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure and enable metrics collection for Microsoft SQL Server hosts: localhost roles: - rhel-system-roles.metrics vars: metrics_from_mssql: true metrics_manage_firewall: true metrics_manage_selinux: true
因为
metrics_manage_firewall
和metrics_manage_selinux
都被设为了true
,所以metrics
角色使用firewall
和selinux
角色来管理metrics
角色使用的端口。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
使用
pcp
命令来验证 SQL Server PMDA 代理 (mssql) 是否已加载并在运行:# pcp platform: Linux sqlserver.example.com 4.18.0-167.el8.x86_64 #1 SMP Sun Dec 15 01:24:23 UTC 2019 x86_64 hardware: 2 cpus, 1 disk, 1 node, 2770MB RAM timezone: PDT+7 services: pmcd pmproxy pmcd: Version 5.0.2-1, 12 agents, 4 clients pmda: root pmcd proc pmproxy xfs linux nfsclient mmv kvm mssql jbd2 dm pmlogger: primary logger: /var/log/pcp/pmlogger/sqlserver.example.com/20200326.16.31 pmie: primary engine: /var/log/pcp/pmie/sqlserver.example.com/pmie.log
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.metrics/README.md
文件 -
/usr/share/doc/rhel-system-roles/metrics/
directory
4.8. 使用 Metrics RHEL 系统角色配置 PMIE webhooks
前提条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 -
在 Ansible 清单中,您已定义了
servers
和metrics_monitor
主机组。在本例中,servers
组包括server-node-01.example.com
和server-node-02.example.com
。metrics_monitor
组包含pcp-monitor-node-01.example.com
。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure PCP webhooks hosts: servers tasks: - name: Configure PCP metrics recording ansible.builtin.include_role: name: rhel-system-roles.metrics vars: metrics_retention_days: 7 metrics_manage_firewall: true - name: Configure the PMIE webhooks hosts: metrics_monitor tasks: - name: Configure the monitoring node ansible.builtin.include_role: name: redhat.rhel_system_roles.metrics vars: metrics_manage_firewall: true metrics_retention_days: 7 metrics_monitored_hosts: "{{ groups['servers'] }}" metrics_webhook_endpoint: "http://<webserver>:<port>/<endpoint>"
示例 playbook 中指定的设置包括以下内容:
metrics_manage_firewall
-
为
true
时,firewall
RHEL 系统角色管理metrics
角色使用的端口。 metrics_retention_days
- 保留收集的指标的天数。
metrics_monitored_hosts
- 监控系统应观察的主机。
metrics_webhook_endpoint
- 发送任何检测到的性能问题的通知的 Webhook 端点。默认情况下,这些检测只记录到本地系统。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.metrics/README.md
文件。playbook 将pcp-monitor-node-01.example.com
主机配置为其自身,以及server-node-01.example.com
和server-node-02.example.com
系统的中央监控站点。playbook 还为所有 3 个系统配置global webhook_action
和global webhook_endpoint
PMIE 配置选项,并重启 PMIE 服务以应用更改。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
检查
pcp-monitor-node-01.example.com
上的配置概述:[root@pcp-monitor-node-01 ~]# pcp summary Performance Co-Pilot configuration on pcp-monitor-node-01.example.com: platform: Linux pcp-monitor-node-01.example.com 5.14.0-427.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Feb 23 01:51:18 EST 2024 x86_64 hardware: 8 cpus, 1 disk, 1 node, 1773MB RAM timezone: CEST-2 services: pmcd pmproxy pmcd: Version 6.2.0-1, 12 agents, 6 clients pmda: root pmcd proc pmproxy xfs linux nfsclient mmv kvm jbd2 dm openmetrics pmlogger: primary logger: /var/log/pcp/pmlogger/pcp-monitor-node-01.example.com/20240510.16.25 server-node-01.example.com: /var/log/pmlogger/server-node-01.example.com/20240510.16.25 server-node-02.example.com: /var/log/pmlogger/server-node-02.example.com/20240510.16.25 pmie: primary engine: /var/log/pcp/pmie/pcp-monitor-node-01.example.com/pmie.log server-node-01.example.com: : /var/log/pcp/pmie/server-node-01.example.com/pmie.log server-node-02.example.com: : /var/log/pcp/pmie/server-node-02.example.com/pmie.log
概述的最后三行显示 PMIE 被配置为监控所有三个系统。
验证
global webhook_action
PMIE 配置选项是否已启用:[root@pcp-monitor-node-01 ~]# grep webbook_action /var/lib/pcp/config/pmie/config.default // 0 global webhook_action = yes
第 5 章 设置 PCP
Performance Co-Pilot (PCP) 是用于监控、视觉化、存储和分析系统级性能测量的工具、服务和库集。
5.1. PCP 概述
您可以使用 Python、Perl、C++ 和 C 接口添加性能指标。分析工具可以直接使用 Python、C++、C 客户端 API,并通过 JSON 界面探索所有可用的性能数据。
您可以通过将实时结果与存档数据进行比较来分析数据模型。
PCP 的功能:
- 轻量级分布式架构,在复杂的系统集中分析过程中非常有用。
- 它允许监控和管理实时数据。
- 它允许记录和检索历史数据。
PCP 包含以下组件:
-
Performance Metric Collector Daemon (
pmcd
) 从已安装的性能指标域代理 (pmda
) 收集性能数据。PMDA 可以单独加载或卸载在系统上,并由同一主机上的 PMCD 控制。 -
pminfo
或pmstat
等各种客户端工具可以检索、显示、存档和处理同一主机或网络上的此数据。 -
pcp
软件包提供命令行工具和底层功能。 -
pcp-gui
软件包提供了图形应用程序。执行dnf install pcp-gui
命令安装pcp-gui
软件包。如需更多信息,请参阅使用 PCP Charts 应用程序进行 Visual tracing PCP 日志归档。
其他资源
-
在您的系统中的
pcp (1)
手册页 -
/usr/share/doc/pcp-doc/
directory - PCP 分发的系统服务和工具
- Performance Co-Pilot (PCP) 文章、解决方案、教程以及红帽客户门户网站中的白皮书的索引
- PCP 工具与旧工具红帽知识库文章的并排比较
- PCP 上游文档
5.2. 安装并启用 PCP
要开始使用 PCP,请安装所有必需的软件包并启用 PCP 监控服务。
这个步骤描述了如何使用 pcp
软件包安装 PCP。如果要自动化 PCP 安装,请使用 pcp-zeroconf
软件包安装它。有关使用 pcp-zeroconf
安装 PCP 的更多信息,请参阅 使用 pcp-zeroconf 设置 PCP。
步骤
安装
pcp
软件包:# dnf install pcp
在主机机器上启用并启动
pmcd
服务:# systemctl enable pmcd # systemctl start pmcd
验证
验证
pmcd
进程是否在主机上运行:# pcp Performance Co-Pilot configuration on workstation: platform: Linux workstation 4.18.0-80.el8.x86_64 #1 SMP Wed Mar 13 12:02:46 UTC 2019 x86_64 hardware: 12 cpus, 2 disks, 1 node, 36023MB RAM timezone: CEST-2 services: pmcd pmcd: Version 4.3.0-1, 8 agents pmda: root pmcd proc xfs linux mmv kvm jbd2
其他资源
-
在您的系统中的
pmcd (1)
man page - PCP 分发的系统服务和工具
5.3. 部署最小 PCP 设置
PCP 最小设置收集 Red Hat Enterprise Linux 的性能统计信息。设置涉及在产品系统中添加收集数据以便进一步分析所需的最小软件包数量。
您可以使用各种 PCP 工具分析生成的 tar.gz
文件和 pmlogger
输出存档,并将它们与其他性能信息源进行比较。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
步骤
更新
pmlogger
配置:# pmlogconf -r /var/lib/pcp/config/pmlogger/config.default
启动
pmcd
和pmlogger
服务:# systemctl start pmcd.service # systemctl start pmlogger.service
- 执行所需的操作来记录性能数据。
停止
pmcd
和pmlogger
服务:# systemctl stop pmcd.service # systemctl stop pmlogger.service
保存输出并将其保存到基于主机名和当前日期和时间的
tar.gz
文件中:# cd /var/log/pcp/pmlogger/ # tar -czf $(hostname).$(date +%F-%Hh%M).pcp.tar.gz $(hostname)
使用 PCP 工具提取此文件并分析数据。
其他资源
-
pmlogconf (1)
,pmlogger (1)
, 和pmcd (1)
man pages - 系统服务和使用 PCP 分发的工具
5.4. PCP 分发的系统服务和工具
Performance Co-Pilot (PCP)包括可用来测量性能的各种系统服务和工具。基本软件包 pcp
包括系统服务和基本工具。pcp-system-tools
、pcp-gui
和 pcp-devel
软件包提供了其他工具。
PCP 分发的系统服务的角色
pmcd
- Performance Metric Collector Daemon (PMCD) 。
pmie
- 性能指标对引擎.
pmlogger
- 性能指标日志记录器。
pmproxy
- 实时和历史性能指标代理、时间序列查询和 REST API 服务。
基本 PCP 软件包分发的工具
pcp
- 显示 Performance Co-Pilot 安装的当前状态。
pcp-vmstat
- 每 5 秒提供高级系统性能概述。显示有关进程、内存、分页、块 IO、 traps 和 CPU 活动的信息。
pmconfig
- 显示配置参数的值。
pmdiff
- 比较一个或两个存档(给定时间窗内)中每个指标的平均值,而在搜索性能回归时可能会感兴趣的更改。
pmdumplog
- 显示 Performance Co-Pilot 归档文件中的控制、元数据、索引和状态信息。
pmfind
- 在网络上查找 PCP 服务。
pmie
- 定期评估一组算术、逻辑和规则表达式的 inference 引擎。指标可以从 live 系统或 Performance Co-Pilot 归档文件收集。
pmieconf
-
显示或设置可配置的
pmie
变量。 pmiectl
-
管理
pmie
的非主要实例。 pminfo
- 显示性能指标的相关信息。指标可以从 live 系统或 Performance Co-Pilot 归档文件收集。
pmlc
-
交互式配置活动的
pmlogger
实例。 pmlogcheck
- 在 Performance Co-Pilot 归档文件中标识无效数据。
pmlogconf
-
创建和修改
pmlogger
配置文件。 pmlogctl
-
管理
pmlogger
的非主要实例。 pmloglabel
- 验证、修改或修复 Performance Co-Pilot 归档文件的标签。
pmlogredact
- 从 PCP 归档中删除敏感信息。
pmlogsummary
- 计算 Performance Co-Pilot 归档文件中存储性能指标的统计信息。
pmprobe
- 决定性能指标的可用性。
pmsocks
- 允许通过防火墙访问 Performance Co-Pilot 主机。
pmstat
- 定期显示系统性能的简短摘要。
pmstore
- 修改性能指标的值。
pmtrace
- 提供到 trace PMDA 的命令行界面。
pmval
- 显示性能指标的当前值。
单独安装的 pcp-system-tools
软件包分发的工具
pcp-atop
- 从性能角度显示最重要的硬件资源的系统级别:CPU、内存、磁盘和网络。
pcp-atopsar
-
在各种系统资源使用率上生成系统级活动报告。报告从之前使用
pmlogger
或pcp-atop
的-w
选项记录的原始日志文件生成。 pcp-buddyinfo
- 报告 buddy 算法的统计信息。
pcp-dmcache
- 显示有关配置的设备映射缓存目标的信息,例如:设备 IOP、缓存和元数据设备利用率,以及在每次缓存设备的读写率和比率。
pcp-dstat
-
一次显示一个系统的指标。要显示多个系统的指标,请使用
--host
选项。 pcp-free
- 报告系统中的空闲和已用内存。
pcp-htop
-
以类似于
top
命令的方式显示系统上运行的所有进程及其命令行参数,但允许您使用鼠标进行垂直和水平滚动。您还可以以树形格式查看进程,并同时对多个进程选择和实施。 pcp-ipcs
- 显示有关调用进程具有读取访问权限的进程间通信(IPC)工具的信息。
pcp-meminfo
- 报告内核系统内存的统计信息。
pcp-mpstat
- 报告 CPU 和与中断相关的统计信息。
pcp-netstat
- 报告网络协议和网络接口的统计信息。
pcp-numastat
- 显示内核内存分配器的 NUMA 分配统计信息。
pcp-pidstat
- 显示系统上运行的各个任务或进程的信息,如 CPU 百分比、内存和堆栈使用率、调度和优先级。报告默认情况下本地主机的实时数据。
pcp-shping
-
pmdashping
性能指标域代理(PMDA)导出的有关 shell-ping 服务指标的样本和报告。 pcp-slabinfo
- 报告内核 slab 分配器的统计信息。
pcp-ss
-
显示
pmdasockets
PMDA 收集的套接字统计信息。 pcp-tapestat
- 报告磁带设备的 I/O 统计信息。
pcp-uptime
- 显示系统正在运行的时长,当前登录的用户数量,以及过去 1、5 和 15 分钟的系统负载平均值。
pcp-zoneinfo
- 报告与 Non-Uniform Memory Access (NUMA)节点相关的统计信息。
pcp-verify
- 检查 Performance Co-Pilot 收集器安装的各个方面,并报告其是否为某些操作模式进行了正确配置。
pmiostat
-
报告 SCSI 设备(默认)或设备映射器设备的 I/O 统计信息(使用
-x
device-mapper 选项)。 pmrep
- 报告选定、易于自定义、性能指标值。
单独安装的 pcp-gui
软件包分发的工具
pmchart
- 通过 Performance Co-Pilot 的功能来绘制性能指标值。
pmdumptext
- 输出从 Performance Co-Pilot 归档收集的性能指标值。
单独安装的 pcp-devel
软件包分发的工具
pmclient
- 使用性能指标应用程序编程接口 (PMAPI) 显示高级系统性能指标。
pmdbg
- 显示可用的 Performance Co-Pilot 调试控制标记及其值。
pmerr
- 显示可用的 Performance Co-Pilot 错误代码及其对应的错误消息。
与单独安装的 pcp-geolocate
软件包一起分发的工具
pcp-geolocate
- 发现收集器系统地理标签,并以 JSON 格式报告本地 PCP 收集器主机的 latitude 和 longitude。
5.5. PCP 部署架构
Performance Co-Pilot (PCP)根据 PCP 部署规模,支持多个部署架构,并提供许多选项来完成高级设置。
可用的扩展部署设置变体基于红帽推荐的部署设置、调整因素和配置选项,包括:
Localhost
每个服务在被监控的机器上本地运行。当您在没有配置更改的情况下启动服务时,这是默认的部署。在这种情况下无法对单个节点进行扩展。
默认情况下,Redis 的部署设置是单机 localhost。但是,Red Hat Redis 可以选择以高可用性和高度扩展的集群执行,其中数据在多个主机之间共享。另一个可行选择是在云中部署 Redis 集群,或者从云供应商中使用受管 Redis 集群。
Decentralized
localhost 和分散设置之间的唯一区别是集中式 Redis 服务。在这种模型中,主机在每个被监控的主机上执行
pmlogger
服务,并从本地pmcd
实例检索指标。然后本地pmproxy
服务将性能指标导出到中央 Redis 实例。图 5.1. 分散日志记录
集中式日志记录 - pmlogger 场
当被监控主机的资源使用情况受限时,另一个部署选项是一个
pmlogger
场,也称为集中式日志记录。在本设置中,单个日志记录器主机执行多个pmlogger
进程,各自配置为从不同的远程pmcd
主机检索性能指标。集中式日志记录器主机也被配置为执行pmproxy
服务,该服务发现生成的 PCP 存档日志并将指标数据加载到 Redis 实例中。图 5.2. 集中式日志记录 - pmlogger 场
联邦 - 多个 pmlogger farms
对于大规模部署,红帽建议以联邦方式部署多个
pmlogger
farm。例如,每个机架或数据中心一个pmlogger
farm。每个pmlogger
farm 都会将指标加载到中央 Redis 实例中。图 5.3. 联邦 - 多个 pmlogger farms
默认情况下,Redis 的部署设置是单机 localhost。但是,Red Hat Redis 可以选择以高可用性和高度扩展的集群执行,其中数据在多个主机之间共享。另一个可行选择是在云中部署 Redis 集群,或者从云供应商中使用受管 Redis 集群。
其他资源
-
pcp (1)
,pmlogger (1)
,pmproxy (1)
, 和pmcd (1)
man pages - 推荐的部署架构
5.6. 推荐的部署架构
下表根据监控的主机数量描述了推荐的部署架构。
主机数 (N) | 1-10 | 10-100 | 100-1000 |
---|---|---|---|
| N | N | N |
| 1 到 N | N/10 到 N | N/100 到 N |
| 1 到 N | 1 到 N | N/100 到 N |
Redis 服务器 | 1 到 N | 1 到 N/10 | N/100 到 N/10 |
Redis 集群 | 否 | Maybe | 是 |
推荐的部署设置 | localhost、Decentralized 或 centralized logging | Decentralized, Centralized logging 或 Federated | decentralized 或 Federated |
5.7. 大小考虑因素
以下是扩展所需的大小调整因素:
远程系统大小
-
CPU、磁盘、网络接口和其他硬件资源的数量会影响中央日志记录主机上的每个
pmlogger
收集的数据量。 日志记录的指标数据
-
日志记录的指标的数量和类型是重要的角色。特别是,
per-process proc.*
指标需要大量磁盘空间,例如,标准pcp-zeroconf
设置、10s 日志记录间隔、11 MB、没有 proc 指标和 155 MB 的 proc 指标 - 可获得 10 倍。此外,每个指标的实例数量,如 CPU、块设备和网络接口的数量也会影响所需的存储容量。 日志记录间隔
-
指标的日志记录频率,会影响存储要求。预期的每日 PCP 归档文件大小会为每个
pmlogger
实例写入到pmlogger.log
文件。这些值未压缩估算。由于 PCP 归档的压缩非常大,大约 10:1,因此可以为特定站点确定实际的长期磁盘空间要求。 pmlogrewrite
-
在每个 PCP 升级后,将执行
pmlogrewrite
工具,并重写旧的归档(如果之前版本中的指标元数据有变化)和 PCP 的新版本。这个过程持续时间使用存储的存档数扩展线性。
其他资源
-
系统中的
pmlogrewrite (1)
和pmlogger (1)
man page
5.8. PCP 扩展的配置选项
以下是扩展所需的配置选项:
sysctl 和 rlimit 设置
-
当启用归档发现时,对于每个
pmlogger
,pmproxy
都需要 4 个描述符,用于监控或注销,以及服务日志和pmproxy
客户端套接字的额外文件描述符(如果有)。每个pmlogger
进程在远程pmcd
套接字、存档文件、服务日志等中使用大约 20 个文件描述符。总的来说,这可以超过运行约 200 个pmlogger
进程的系统上的默认 1024 软限制。pcp-5.3.0
及之后的版本中的pmproxy
服务会自动将软限制增加到硬限制。在 PCP 的早期版本中,如果要部署大量pmlogger
进程,则需要调优;这可以通过增加pmlogger
的软或硬限制来实现。如需更多信息,请参阅 如何为 systemd 运行的服务设置限制 (ulimit) 。 本地归档
-
pmlogger
服务将本地和远程pmcds
的指标存储在/var/log/pcp/pmlogger/
目录中。要控制本地系统的日志间隔,请更新/etc/pcp/pmlogger/control.d/configfile文件
,并在参数中添加-t X
,其中 X 是日志间隔(以秒为单位)。要配置应该记录哪些指标,请执行pmlogconf /var/lib/pcp/config/pmlogger/config.clienthostname
。此命令使用一组默认指标来部署配置文件,可选择性地进行进一步自定义。要指定保留设置(指定何时清除旧的 PCP 存档),更新/etc/sysconfig/pmlogger_timers
文件指定PMLOGGER_DAILY_PARAMS="-E -k X"
,其中 X 是保留 PCP 归档的天数。 Redis
pmproxy
服务将日志记录的指标从pmlogger
发送到 Redis 实例。以下是两个选项,用于指定/etc/pcp/pmproxy/pmproxy.conf
配置文件中的保留设置:-
stream.expire
指定应删除过时指标时的持续时间,即在指定时间内没有更新的指标,以秒为单位。 -
stream.maxlen
指定每个主机的一个指标值的最大指标值数。此设置应是保留的时间除以日志间隔,例如如果保留时间为 14 天日志间隔是 60s,则设置为 20160 (60*60*24*14/60)
-
其他资源
-
pmproxy (1)
,pmlogger (1)
, 和sysctl (8)
man pages
5.9. 示例:分析集中式日志记录部署
在集中式日志记录设置中收集以下结果(也称为 pmlogger 场部署),其默认 pcp-zeroconf 5.3.0
安装,其中每个远程主机都是在有 64 个 CPU 内核、376 GB RAM 的服务器上运行 pmcd
的相同容器实例。
日志记录间隔为 10s,不包含远程节点的 proc 指标,内存值则引用 Resident Set Size (RSS) 值。
主机数量 | 10 | 50 |
---|---|---|
PCP 每天归档存储 | 91 MB | 522 MB |
| 160 MB | 580 MB |
每天 | 2 MB | 9 MB |
| 1.4 GB | 6.3 GB |
每天的 redis 内存 | 2.6 GB | 12 GB |
主机数量 | 10 | 50 | 100 |
---|---|---|---|
PCP 每天归档存储 | 20 MB | 120 MB | 271 MB |
| 104 MB | 524 MB | 1049 MB |
每天 | 0.38 MB | 1.75 MB | 3.48 MB |
| 2.67 GB | 5.5GB | 9 GB |
每天的 redis 内存 | 0.54 GB | 2.65 GB | 5.3 GB |
pmproxy
队列 Redis 请求,并使用 Redis pipelining 来加快 Redis 查询。这可能导致大量内存使用。有关此问题的故障排除,请参阅对高内存的使用进行故障排除。
5.10. 示例:分析联合设置部署
以下结果在联合设置中观察,也称为多个 pmlogger
farm,由三个集中式日志记录(pmlogger
farm)设置组成,每个 pmlogger
farm 都监控 100 个远程主机,总计为 300 个主机。
pmlogger
场的设置与下面提到的配置一样
60s 日志记录间隔的 示例:分析集中式日志记录部署 ,但 Redis 服务器在集群模式下运行。
PCP 每天归档存储 | pmlogger Memory | 每天网络 (In/Out) | pmproxy Memory | 每天的 redis 内存 |
---|---|---|---|---|
277 MB | 1058 MB | 15.6 MB / 12.3 MB | 6-8 GB | 5.5 GB |
此处,所有值都是每个主机。网络带宽较高,因为 Redis 集群的节点间通信。
5.11. 建立安全的 PCP 连接
您可以配置 PCP 收集器和监控组件,以参与安全的 PCP 协议交换。
5.11.1. 确保 PCP 连接安全
您可以在 Performance Co-Pilot (PCP)收集器和监控组件之间建立安全连接。PCP 收集器组件是 PCP 的一部分,它从不同的源收集和提取性能数据。PCP 监控组件是 PCP 的一部分,它显示从安装了 PCP 收集器组件的主机或存档中收集来的数据。在这些组件之间建立安全连接有助于防止未授权方访问或修改正在收集和监控的数据。
所有与性能指标收集器守护进程(pmcd
)的连接都是使用基于 TCP/IP 的 PCP 协议建立的。协议代理和 PCP REST API 由 pmproxy
守护进程提供 - REST API 可通过 HTTPS 访问,以确保安全连接。
pmcd
和 pmproxy
守护进程能够在单一端口上同时进行 TLS 和非 TLS 通信。pmcd
的默认端口是 44321 ,44322 用于 pmproxy
。这意味着您不必为您的 PCP 收集器系统在 TLS 或非 TLS 通信之间进行选择,您可以同时使用它们。
5.11.2. 为 PCP 收集器组件配置安全连接
所有 PCP 收集器系统必须有有效的证书,以便参与 PCP 协议交换。
从 TLS 的角度来看,pmproxy
守护进程同时作为客户端和服务器运行。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
私有客户端密钥存储在
/etc/pcp/tls/client.key
文件中。如果您使用其他路径,请调整该流程的对应步骤。有关创建私钥和证书签名请求(CSR)的详细信息,以及如何从证书颁发机构(CA)请求证书,请参阅您的 CA 文档。
-
TLS 客户端证书存储在
/etc/pcp/tls/client.crt
文件中。如果您使用其他路径,请调整该流程的对应步骤。 -
CA 证书存储在
/etc/pcp/tls/ca.crt
文件中。如果您使用其他路径,请调整该流程的对应步骤。另外,对于pmproxy
守护进程: -
私有服务器密钥存储在
/etc/pcp/tls/server.key
文件中。如果您使用其他路径,请调整流程的相应步骤 -
TLS 服务器证书存储在
/etc/pcp/tls/server.crt
文件中。如果您使用其他路径,请调整该流程的对应步骤。
步骤
更新收集器系统上的 PCP TLS 配置文件,以使用 CA 发布的证书来建立安全连接:
# cat > /etc/pcp/tls.conf << END tls-ca-cert-file = /etc/pcp/tls/ca.crt tls-key-file = /etc/pcp/tls/server.key tls-cert-file = /etc/pcp/tls/server.crt tls-client-key-file = /etc/pcp/tls/client.key tls-client-cert-file = /etc/pcp/tls/client.crt END
重启 PCP 收集器基础架构:
# systemctl restart pmcd.service # systemctl restart pmproxy.service
验证
验证 TLS 配置:
在
pmcd
服务上:# grep 'Info:' /var/log/pcp/pmcd/pmcd.log [Tue Feb 07 11:47:33] pmcd(6558) Info: OpenSSL 3.0.7 setup
在
pmproxy
服务上:# grep 'Info:' /var/log/pcp/pmproxy/pmproxy.log [Tue Feb 07 11:44:13] pmproxy(6014) Info: OpenSSL 3.0.7 setup
5.11.3. 为 PCP 监控组件配置安全连接
配置 PCP 监控组件以参与安全 PCP 协议交换。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
私有客户端密钥存储在
~/.pcp/tls/client.key
文件中。如果您使用其他路径,请调整该流程的对应步骤。有关创建私钥和证书签名请求(CSR)的详细信息,以及如何从证书颁发机构(CA)请求证书,请参阅您的 CA 文档。
-
TLS 客户端证书存储在
~/.pcp/tls/client.crt
文件中。如果您使用其他路径,请调整该流程的对应步骤。 -
CA 证书存储在
/etc/pcp/tls/ca.crt
文件中。如果您使用其他路径,请调整该流程的对应步骤。
步骤
使用以下信息创建一个 TLS 配置文件:
$ home=
echo ~
$ cat > ~/.pcp/tls.conf << END tls-ca-cert-file = /etc/pcp/tls/ca.crt tls-key-file = $home/.pcp/tls/client.key tls-cert-file = $home/.pcp/tls/client.crt END建立安全连接:
$ export PCP_SECURE_SOCKETS=enforce $ export PCP_TLSCONF_PATH=~/.pcp/tls.conf
验证
验证安全连接是否已配置:
$ pminfo --fetch --host pcps://localhost kernel.all.load kernel.all.load inst [1 or "1 minute"] value 1.26 inst [5 or "5 minute"] value 1.29 inst [15 or "15 minute"] value 1.28
5.12. 对高内存使用量进行故障排除
以下情况可能会导致内存用量:
-
pmproxy
进程忙于处理新的 PCP 归档,且没有处理 Redis 请求和响应的备用 CPU 周期。 - Redis 节点或集群已过载,且无法在时间处理传入的请求。
pmproxy
服务守护进程使用 Redis 流并支持配置参数,这些参数是 PCP 调优参数,并影响 Redis 内存用量和密钥保留。/etc/pcp/pmproxy/pmproxy.conf
文件列出了 pmproxy
和关联的 API 的可用选项。
以下流程描述了如何对高内存使用率问题进行故障排除。
先决条件
安装
pcp-pmda-redis
软件包:# dnf install pcp-pmda-redis
安装 redis PMDA:
# cd /var/lib/pcp/pmdas/redis && ./Install
步骤
要排除高内存用量的问题,请执行以下命令并观察
inflight
列:$ pmrep :pmproxy backlog inflight reqs/s resp/s wait req err resp err changed throttled byte count count/s count/s s/s count/s count/s count/s count/s 14:59:08 0 0 N/A N/A N/A N/A N/A N/A N/A 14:59:09 0 0 2268.9 2268.9 28 0 0 2.0 4.0 14:59:10 0 0 0.0 0.0 0 0 0 0.0 0.0 14:59:11 0 0 0.0 0.0 0 0 0 0.0 0.0
此列显示有多少 Redis 请求是 in-flight,这意味着它们被排队或发送,目前还没有收到回复。
数字表示以下条件之一:
-
pmproxy
进程忙于处理新的 PCP 归档,且没有处理 Redis 请求和响应的备用 CPU 周期。 - Redis 节点或集群已过载,且无法在时间处理传入的请求。
-
要对高内存使用问题进行故障排除,请减少此场的
pmlogger
进程数量,再添加另一个 pmlogger 场。使用联邦 - 多个 pmlogger farm 设置。如果 Redis 节点使用 100% 的 CPU 延长的时间,请将其移到具有更好的性能的主机,或使用集群的 Redis 设置。
要查看
pmproxy.redis.*
指标,请使用以下命令:$ pminfo -ftd pmproxy.redis pmproxy.redis.responses.wait [wait time for responses] Data Type: 64-bit unsigned int InDom: PM_INDOM_NULL 0xffffffff Semantics: counter Units: microsec value 546028367374 pmproxy.redis.responses.error [number of error responses] Data Type: 64-bit unsigned int InDom: PM_INDOM_NULL 0xffffffff Semantics: counter Units: count value 1164 [...] pmproxy.redis.requests.inflight.bytes [bytes allocated for inflight requests] Data Type: 64-bit int InDom: PM_INDOM_NULL 0xffffffff Semantics: discrete Units: byte value 0 pmproxy.redis.requests.inflight.total [inflight requests] Data Type: 64-bit unsigned int InDom: PM_INDOM_NULL 0xffffffff Semantics: discrete Units: count value 0 [...]
要查看有多少 Redis 请求在flight 中,请参阅
pmproxy.redis.requests.inflight.total
指标和pmproxy.redis.requests.inflight.bytes
指标来查看所有当前在flight Redis 请求中消耗的字节数。通常,redis 请求队列为零,但可以根据大型 pmlogger 场的使用而构建,这限制了可扩展性,并可能导致
pmproxy
客户端的高延迟。使用
pminfo
命令查看有关性能指标的信息。例如,要查看redis.*
指标,请使用以下命令:$ pminfo -ftd redis redis.redis_build_id [Build ID] Data Type: string InDom: 24.0 0x6000000 Semantics: discrete Units: count inst [0 or "localhost:6379"] value "87e335e57cffa755" redis.total_commands_processed [Total number of commands processed by the server] Data Type: 64-bit unsigned int InDom: 24.0 0x6000000 Semantics: counter Units: count inst [0 or "localhost:6379"] value 595627069 [...] redis.used_memory_peak [Peak memory consumed by Redis (in bytes)] Data Type: 32-bit unsigned int InDom: 24.0 0x6000000 Semantics: instant Units: count inst [0 or "localhost:6379"] value 572234920 [...]
要查看峰值内存用量,请参阅
redis.used_memory_peak
指标。
其他资源
-
pmdaredis (1)
,pmproxy (1)
, 和pminfo (1)
man pages 在您的系统中 - PCP 部署架构
第 6 章 使用 pmlogger 记录性能数据
使用 PCP 工具,您可以记录性能指标值并稍后重新显示。这可让您执行改进的性能分析。
使用 pmlogger
工具,您可以:
- 在系统上创建所选指标的归档日志
- 指定系统中记录哪些指标以及它们的频率
6.1. 使用 pmlogconf 修改 pmlogger 配置文件
当 pmlogger
服务运行时,PCP 会记录主机上一组默认指标。
使用 pmlogconf
实用程序检查默认配置。如果 pmlogger
配置文件不存在,则 pmlogconf
会使用默认指标值创建该文件。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
步骤
创建或修改
pmlogger
配置文件:# pmlogconf -r /var/lib/pcp/config/pmlogger/config.default
-
按照
pmlogconf
提示启用或禁用相关性能指标组,并控制每个启用的组的日志间隔。
其他资源
-
系统中的
pmlogconf (1)
和pmlogger (1)
man page - 系统服务和使用 PCP 分发的工具
6.2. 手动编辑 pmlogger 配置文件
要使用特定指标和给定间隔创建定制的日志配置,请手动编辑 pmlogger
配置文件。默认 pmlogger
配置文件为 /var/lib/pcp/config/pmlogger/config.default
。配置文件指定主日志记录实例记录哪些指标。
在手动配置中,您可以:
- 记录没有列在自动配置中的指标。
- 选择自定义日志记录频率。
- 使用应用程序指标添加 PMDA。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
步骤
打开并编辑
/var/lib/pcp/config/pmlogger/config.default
文件以添加特定的指标:# It is safe to make additions from here on ... # log mandatory on every 5 seconds { xfs.write xfs.write_bytes xfs.read xfs.read_bytes } log mandatory on every 10 seconds { xfs.allocs xfs.block_map xfs.transactions xfs.log } [access] disallow * : all; allow localhost : enquire;
其他资源
-
您系统上的
pmlogger (1)
man page - 系统服务和使用 PCP 分发的工具
6.3. 启用 pmlogger 服务
必须启动并启用 pmlogger
服务,以记录本地计算机上的指标值。
这个步骤描述了如何启用 pmlogger
服务。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
步骤
启动并启用
pmlogger
服务:# systemctl start pmlogger # systemctl enable pmlogger
验证
验证
pmlogger
服务是否已启用:# pcp Performance Co-Pilot configuration on workstation: platform: Linux workstation 4.18.0-80.el8.x86_64 #1 SMP Wed Mar 13 12:02:46 UTC 2019 x86_64 hardware: 12 cpus, 2 disks, 1 node, 36023MB RAM timezone: CEST-2 services: pmcd pmcd: Version 4.3.0-1, 8 agents, 1 client pmda: root pmcd proc xfs linux mmv kvm jbd2 pmlogger: primary logger: /var/log/pcp/pmlogger/workstation/20190827.15.54
其他资源
-
您系统上的
pmlogger (1)
man page - 系统服务和使用 PCP 分发的工具
-
/var/lib/pcp/config/pmlogger/config.default
file
6.4. 为指标集合设置客户端系统
这个步骤描述了如何设置客户端系统,以便中央服务器能够从运行 PCP 的客户端收集指标。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
步骤
安装
pcp-system-tools
软件包:# dnf install pcp-system-tools
为
pmcd
配置 IP 地址:# echo "-i 192.168.4.62" >>/etc/pcp/pmcd/pmcd.options
使用客户端应侦听的 IP 地址替换 192.168.4.62。
默认情况下,
pmcd
侦听 localhost。配置防火墙以永久添加公共
zone
:# firewall-cmd --permanent --zone=public --add-port=44321/tcp success # firewall-cmd --reload success
设置 SELinux 布尔值:
# setsebool -P pcp_bind_all_unreserved_ports on
启用
pmcd
和pmlogger
服务:# systemctl enable pmcd pmlogger # systemctl restart pmcd pmlogger
验证
验证
pmcd
是否已正确侦听配置的 IP 地址:# ss -tlp | grep 44321 LISTEN 0 5 127.0.0.1:44321 0.0.0.0:* users:(("pmcd",pid=151595,fd=6)) LISTEN 0 5 192.168.4.62:44321 0.0.0.0:* users:(("pmcd",pid=151595,fd=0)) LISTEN 0 5 [::1]:44321 [::]:* users:(("pmcd",pid=151595,fd=7))
其他资源
-
pmlogger (1)
,firewall-cmd (1)
,ss (8)
, 和setsebool (8)
man pages - 系统服务和使用 PCP 分发的工具
-
/var/lib/pcp/config/pmlogger/config.default
file
6.5. 设置中央服务器以收集数据
这个步骤描述了如何创建中央服务器从运行 PCP 的客户端收集指标。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
- 为指标集合配置了客户端。如需更多信息,请参阅为指标集合设置客户端系统。
步骤
安装
pcp-system-tools
软件包:# dnf install pcp-system-tools
使用以下内容创建
/etc/pcp/pmlogger/control.d/remote
文件:# DO NOT REMOVE OR EDIT THE FOLLOWING LINE $version=1.1 192.168.4.13 n n PCP_ARCHIVE_DIR/rhel7u4a -r -T24h10m -c config.rhel7u4a 192.168.4.14 n n PCP_ARCHIVE_DIR/rhel6u10a -r -T24h10m -c config.rhel6u10a 192.168.4.62 n n PCP_ARCHIVE_DIR/rhel8u1a -r -T24h10m -c config.rhel8u1a 192.168.4.69 n n PCP_ARCHIVE_DIR/rhel9u3a -r -T24h10m -c config.rhel9u3a
使用客户端 IP 地址替换 192.168.4.13、192.168.4.14、192.168.4.62 和 192.168.4.69。
启用
pmcd
和pmlogger
服务:# systemctl enable pmcd pmlogger # systemctl restart pmcd pmlogger
验证
确保您可以从每个目录中访问最新的归档文件:
# for i in /var/log/pcp/pmlogger/rhel*/*.0; do pmdumplog -L $i; done Log Label (Log Format Version 2) Performance metrics from host rhel6u10a.local commencing Mon Nov 25 21:55:04.851 2019 ending Mon Nov 25 22:06:04.874 2019 Archive timezone: JST-9 PID for pmlogger: 24002 Log Label (Log Format Version 2) Performance metrics from host rhel7u4a commencing Tue Nov 26 06:49:24.954 2019 ending Tue Nov 26 07:06:24.979 2019 Archive timezone: CET-1 PID for pmlogger: 10941 [..]
/var/log/pcp/pmlogger/
目录中的存档文件可用于进一步分析和显示。
其他资源
-
您系统上的
pmlogger (1)
man page - 系统服务和使用 PCP 分发的工具
-
/var/lib/pcp/config/pmlogger/config.default
file
6.6. systemd
单元和 pmlogger
当您部署 pmlogger
服务时,可以作为单个主机监控自身或作为单个主机从多个远程主机收集指标的 pmlogger
农场,都会自动部署几个关联的 systemd
服务和计时器单元。这些服务和计时器提供常规检查,以确保 pmlogger
实例正在运行,重启任何缺失的实例,并执行存档管理,如文件压缩。
pmlogger
通常部署的检查和内务服务有:
pmlogger_daily.service
-
默认情况下,在每天午夜后不久运行,以聚合、压缩和轮转一个或多个 PCP 存档集合。还会剔除超过限制(默认为 2 周)的存档。由
pmlogger_daily.timer
单元触发,是pmlogger.service
单元所需要的。 pmlogger_check
-
每半小时执行一次,检查
pmlogger
实例是否在运行。重启任何缺失的实例,并执行任何所需的压缩任务。由pmlogger_check.timer
单元触发,是pmlogger.service
单元所需要的。 pmlogger_farm_check
-
检查所有配置的
pmlogger
实例的状态。重启任何缺失的实例。将所有非主实例迁移到pmlogger_farm
服务。由pmlogger_farm_check.timer
触发,是pmlogger_farm.service
单元所需要的,而pmlogger.service
单元本身也需要它。
这些服务通过一系列正依赖项进行管理,意味着在激活主 pmlogger
实例时它们都是启用的。请注意,虽然 pmlogger_daily.service
默认被禁用,但通过 pmlogger.service
的依赖项处于活跃状态的 pmlogger_daily.timer
将触发 pmlogger_daily.service
运行。
pmlogger_daily
也与 pmlogrewrite
集成,以便在合并前自动重写存档。这帮助确保不断变化的生产环境和 PMDA 中元数据的一致性。例如,如果一个监控的主机上的 pmcd
在日志记录间隔期间被更新了,主机上一些指标的语义可能也会被更新,因此使新存档与之前记录的该主机的存档不兼容。如需更多信息,请参阅 pmlogrewrite(1)
手册页。
管理 pmlogger
触发的 systemd
服务
您可以为 pmlogger
实例收集的数据创建一个自动的自定义归档管理系统。这通过控制文件来完成。这些控制文件是:
对于主
pmlogger
实例:-
etc/pcp/pmlogger/control
-
/etc/pcp/pmlogger/control.d/local
-
对于远程主机:
/etc/pcp/pmlogger/control.d/remote
将 remote 替换为您需要的文件名。
- 注意
-
主
pmlogger
实例必须与它连接的pmcd
运行在同一台主机上。如果一个中央主机在几个连接到远程主机上运行的pmcd
实例的pmlogger
实例上收集数据,则不需要主实例,并且在配置中可能也不需要。
文件应该为要记录的每个主机包含一行。自动创建的主日志记录器实例的默认格式类似如下:
# === LOGGER CONTROL SPECIFICATIONS === # #Host P? S? directory args # local primary logger LOCALHOSTNAME y n PCP_ARCHIVE_DIR/LOCALHOSTNAME -r -T24h10m -c config.default -v 100Mb
这些字段包括:
Host
- 要记录的主机的名称
P?
-
代表“Primary?”此字段表示主机是否是主日志记录器实例,
y
,或不是n
。在您配置的所有文件中可以只有一个主日志记录器,它必须与它连接的pmcd
在同一台主机上运行。 S?
-
代表"Socks?"此字段表示此日志记录器实例是否需要使用
SOCKS
协议来通过防火墙连接到pmcd
,y
或不需要n
。 directory
- 与此行关联的所有存档都在此目录下创建。
args
传给
pmlogger
的参数。args
字段的默认值是:-r
- 报告存档大小和增长率。
T24h10m
-
指定每天何时结束记录日志。这通常是
pmlogger_daily.service
运行时的时间。默认值为24h10m
,表示日志记录最迟应在开始后 24 小时 10 分钟结束。 -c config.default
- 指定要使用哪个配置文件。这实际上定义了要记录哪些指标。
-v 100Mb
-
指定一个数据卷被填满后,创建另一个数据卷的大小。切换到新存档后,之前记录的存档将被
pmlogger_daily
或pmlogger_check
压缩。
其他资源
-
您系统上的
pmlogger (1)
和pmlogrewrite (1)
man page -
pmlogger_daily (1)
,pmlogger_check (1)
, 和pmlogger.control (5)
man page
6.7. 使用 pmrep 重现 PCP 日志存档
记录指标数据后,您可以重新执行 PCP 日志存档。要将日志导出到文本文件并将其导入到电子表格中,请使用 pcp2csv
、pcp2xml
、pmrep
或 pmlogsummary
等。
使用 pmrep
工具,您可以:
- 查看日志文件
- 解析所选 PCP 日志存档,并将值导出到 ASCII 表中
- 通过在命令行中指定单个指标,从日志中提取整个存档日志或只从日志中选择指标值
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
-
pmlogger
服务已启用。如需更多信息,请参阅启用 pmlogger 服务。 安装
pcp-system-tools
软件包:# dnf install pcp-gui
步骤
显示指标上的数据:
$ pmrep --start @3:00am --archive 20211128 --interval 5seconds --samples 10 --output csv disk.dev.write Time,"disk.dev.write-sda","disk.dev.write-sdb" 2021-11-28 03:00:00,, 2021-11-28 03:00:05,4.000,5.200 2021-11-28 03:00:10,1.600,7.600 2021-11-28 03:00:15,0.800,7.100 2021-11-28 03:00:20,16.600,8.400 2021-11-28 03:00:25,21.400,7.200 2021-11-28 03:00:30,21.200,6.800 2021-11-28 03:00:35,21.000,27.600 2021-11-28 03:00:40,12.400,33.800 2021-11-28 03:00:45,9.800,20.600
上述示例以逗号分隔值格式显示存档中以 5 秒 间隔收集的
disk.dev.write
指标中的数据。注意将此示例中的
20211128
替换为包含您要显示数据的pmlogger
存档的文件名。
其他资源
-
pmlogger (1)
,pmrep (1)
, 和pmlogsummary (1)
man page - PCP 分发的系统服务和工具
6.8. 启用 PCP 版本 3 归档
Performance Co-Pilot (PCP)归档存储单个主机记录的 PCP 指标的历史值,并支持回顾性性能分析。PCP 归档包含线下或站下分析所需的所有重要指标数据和元数据。这些存档可被大多数 PCP 客户端工具读取,或者由 pmdumplog
工具原始转储。
从 PCP 6.0 开始,除了版本 2 归档外,版本 3 归档也被支持。版本 2 存档保留默认值,除了得到 RHEL 9.2 及之后版本的长期支持的版本 3 之外,出于向后兼容目的,还会继续得到长期支持。
与版本 2 相比,使用 PCP 版本 3 归档提供了以下好处:
- 支持实例域更改增量
- Y2038-safe 时间戳
- 纳秒精度时间戳
- 任意时区支持
- 用于大于 2GB 的单个卷的 64 位文件偏移
前提条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
流程
在您选择的文本编辑器中打开
/etc/pcp.conf
文件,并设置 PCP 归档版本:PCP_ARCHIVE_VERSION=3
重启
pmlogger
服务以应用您的配置更改:# systemctl restart pmlogger.service
- 使用您的新配置创建一个新的 PCP 存档日志。如需更多信息,请参阅使用 pmlogger 的日志记录性能数据。
验证
验证使用新配置创建的归档的版本:
# pmloglabel -l /var/log/pcp/pmlogger/20230208 Log Label (Log Format Version 3) Performance metrics from host host1 commencing Wed Feb 08 00:11:09.396 2023 ending Thu Feb 07 00:13:54.347 2023
其他资源
-
您系统上的
logarchive (5)
和pmlogger (1)
man page - 使用 pmlogger 记录性能数据
第 7 章 使用 Performance Co-Pilot 监控性能
Performance Co-Pilot (PCP) 是用于监控、视觉化、存储和分析系统级性能测量的工具、服务和库集。
作为系统管理员,您可以使用 Red Hat Enterprise Linux 9 中的 PCP 应用程序监控系统性能。
7.1. 使用 pmda-postfix 监控 postfix
这个步骤描述了如何使用 pmda-
postfix
监控 postfix 邮件服务器的性能指标。它有助于检查每秒接收多少电子邮件。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
-
pmlogger
服务已启用。如需更多信息,请参阅启用 pmlogger 服务。
步骤
安装以下软件包:
安装
pcp-system-tools
:# dnf install pcp-system-tools
安装
pmda-postfix
软件包以监控postfix
:# dnf install pcp-pmda-postfix postfix
安装日志记录守护进程:
# dnf install rsyslog
安装邮件客户端进行测试:
# dnf install mutt
启用
postfix
和rsyslog
服务:# systemctl enable postfix rsyslog # systemctl restart postfix rsyslog
启用 SELinux 布尔值,以便
pmda-postfix
可以访问所需的日志文件:# setsebool -P pcp_read_generic_logs=on
安装
PMDA
:# cd /var/lib/pcp/pmdas/postfix/ # ./Install Updating the Performance Metrics Name Space (PMNS) ... Terminate PMDA if already installed ... Updating the PMCD control file, and notifying PMCD ... Waiting for pmcd to terminate ... Starting pmcd ... Check postfix metrics have appeared ... 7 metrics and 58 values
验证
验证
pmda-postfix
操作:echo testmail | mutt root
验证可用指标:
# pminfo postfix postfix.received postfix.sent postfix.queues.incoming postfix.queues.maildrop postfix.queues.hold postfix.queues.deferred postfix.queues.active
其他资源
-
您系统上的
rsyslogd (8)
,postfix (1)
, 和setsebool (8)
man page - 系统服务和使用 PCP 分发的工具
7.2. 使用 PCP Charts 应用程序可视化追踪 PCP 日志存档
记录指标数据后,您可以作为图形重新执行 PCP 日志存档。指标来源于一个或多个实时主机,可通过替代选项将 PCP 日志存档中的指标数据用作历史数据的来源。要自定义 PCP 图表 应用程序接口来显示性能指标中的数据,您可以使用行图表、栏图或利用率图形。
使用 PCP Charts 应用程序,您可以:
- 重播 PCP 图表 应用程序中的数据,并使用图形来视觉化重新内省数据以及系统的实时数据。
- 将性能指标值图表到图表中。
- 同时显示多个 chart。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
-
使用
pmlogger
记录性能数据。如需更多信息,请参阅使用 pmlogger 的日志记录性能数据。 安装
pcp-gui
软件包:# dnf install pcp-gui
步骤
从命令行启动 PCP Charts 应用程序:
# pmchart
图 7.1. PCP Charts 应用程序
pmtime
服务器设置位于底部。可以使用 start 和 pause 按钮控制:- PCP 轮询指标数据的时间间隔
- 历史数据指标的日期和时间
- 点 File 然后点 New Chart,通过指定主机名或地址来选择来自本地机器和远程机器的指标。高级配置选项包括手动设置图表值的功能,以及手动选择图表颜色。
记录在 PCP Charts 应用程序中创建的视图:
以下是获取镜像或记录 PCP Charts 应用程序中创建的视图的选项:
- 点 File,然后点 Export 以保存当前视图的镜像。
- 点 Record,然后 Start 启动记录。点 Record,然后 Stop 停止记录。停止记录后,会存档记录的指标,以便稍后查看。
可选:在 PCP Charts 应用程序中,主配置文件称为 view,允许保存与一个或多个 chart 关联的元数据。此元数据描述了所有图表,包括所使用的指标和图表列。通过点 File 保存自定义 视图 配置,然后保存 View,稍后载入 视图 配置。
以下 PCP 图表 应用程序视图配置文件示例描述了一个堆栈图图,显示了读取和写入到给定 XFS 文件系统
loop1
的字节总数:#kmchart version 1 chart title "Filesystem Throughput /loop1" style stacking antialiasing off plot legend "Read rate" metric xfs.read_bytes instance "loop1" plot legend "Write rate" metric xfs.write_bytes instance "loop1"
其他资源
-
您系统上的
pmchart (1)
和pmtime (1)
man page - 系统服务和使用 PCP 分发的工具
7.3. 使用 PCP 从 SQL 服务器收集数据
SQL Server 代理在 Performance Co-Pilot (PCP) 中提供,它可帮助您监控和分析数据库性能问题。
这个步骤描述了如何通过系统中的 pcp
为 Microsoft SQL Server 收集数据。
前提条件
- 您已安装了用于 Red Hat Enterprise Linux 的 Microsoft SQL Server,并建立了与 SQL 服务器的"信任"连接。
- 您已为 Red Hat Enterprise Linux 安装了用于 SQL Server 的 Microsoft ODBC 驱动程序。
流程
安装 PCP:
# dnf install pcp-zeroconf
安装
pyodbc
驱动程序所需的软件包:# dnf install python3-pyodbc
安装
mssql
代理:为 PCP 安装 Microsoft SQL Server 域名代理:
# dnf install pcp-pmda-mssql
编辑
/etc/pcp/mssql/mssql.conf
文件,为mssql
代理配置 SQL 服务器帐户的用户名和密码。请确定您配置的帐户具有性能数据的访问权限。username: user_name password: user_password
使用这个帐户的 SQL Server 帐户和 user_password 替换 user_name。
安装代理:
# cd /var/lib/pcp/pmdas/mssql # ./Install Updating the Performance Metrics Name Space (PMNS) ... Terminate PMDA if already installed ... Updating the PMCD control file, and notifying PMCD ... Check mssql metrics have appeared ... 168 metrics and 598 values [...]
验证
使用
pcp
命令,验证 SQL Server PMDA (mssql
) 是否已加载并在运行:$ pcp Performance Co-Pilot configuration on rhel.local: platform: Linux rhel.local 4.18.0-167.el8.x86_64 #1 SMP Sun Dec 15 01:24:23 UTC 2019 x86_64 hardware: 2 cpus, 1 disk, 1 node, 2770MB RAM timezone: PDT+7 services: pmcd pmproxy pmcd: Version 5.0.2-1, 12 agents, 4 clients pmda: root pmcd proc pmproxy xfs linux nfsclient mmv kvm mssql jbd2 dm pmlogger: primary logger: /var/log/pcp/pmlogger/rhel.local/20200326.16.31 pmie: primary engine: /var/log/pcp/pmie/rhel.local/pmie.log
查看 PCP 可以从 SQL Server 收集的指标的完整列表:
# pminfo mssql
查看指标列表后,您可以报告事务的速度。例如,要报告每秒总事务数,超过 5 秒时间窗:
# pmval -t 1 -T 5 mssql.databases.transactions
-
使用
pmchart
命令查看系统中的这些指标的图形图表。如需更多信息,请参阅使用 PCP Charts 应用程序进行 Visual tracing PCP 日志归档。
其他资源
-
pcp (1)
,pminfo (1)
,pmval (1)
,pmchart (1)
, pmchart (1), 和pmdamssql (1)
man page - 带有 RHEL 8.2 Red Hat Developers Blog 的 Microsoft SQL Server 的 Performance Co-Pilot
7.4. 从 sadc 归档生成 PCP 归档
您可以使用 sysstat
软件包提供的 sadf
工具来生成来自原生 sadc
归档的 PCP 存档。
先决条件
已创建了
sadc
存档:# /usr/lib64/sa/sadc 1 5 -
在本例中,
sadc
是抽样系统数据 1 时间,间隔为 5 秒。outfile 指定为-
,它导致sadc
将数据写入标准系统活动每日数据文件。此文件名为 saDD,默认情况下位于 /var/log/sa 目录中。
步骤
从
sadc
归档生成 PCP 存档:# sadf -l -O pcparchive=/tmp/recording -2
在本例中,使用
-2
选项会导致sadf
从sadc
归档(2 天)中生成 PCP 存档。
验证
您可以使用 PCP 命令检查和分析 sadc
存档生成的 PCP 存档,正如一个原生 PCP 存档一样。例如:
要显示 PCP 存档中从
sadc
归档生成的指标列表,请运行:$ pminfo --archive /tmp/recording Disk.dev.avactive Disk.dev.read Disk.dev.write Disk.dev.blkread [...]
要显示 PCP 归档的归档和主机名的时间范围,请运行:
$ pmdumplog --label /tmp/recording Log Label (Log Format Version 2) Performance metrics from host shard commencing Tue Jul 20 00:10:30.642477 2021 ending Wed Jul 21 00:10:30.222176 2021
要将性能指标值绘制成图形,请运行:
$ pmchart --archive /tmp/recording
第 8 章 使用 PCP 对 XFS 的性能分析
XFS PMDA 作为 pcp
软件包的一部分提供,并在安装过程中默认启用。它用于在 Performance Co-Pilot (PCP) 中收集 XFS 文件系统的性能指标数据。
您可以使用 PCP 分析 XFS 文件系统的性能。
8.1. 手动安装 XFS PMDA
如果 pcp
配置输出中没有列出 XFS PMDA,请手动安装 PMDA 代理。
这个步骤描述了如何手动安装 PMDA 代理。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
步骤
进入 xfs 目录:
# cd /var/lib/pcp/pmdas/xfs/
手动安装 XFS PMDA:
xfs]# ./Install Updating the Performance Metrics Name Space (PMNS) ... Terminate PMDA if already installed ... Updating the PMCD control file, and notifying PMCD ... Check xfs metrics have appeared ... 387 metrics and 387 values
验证
验证
pmcd
进程是否在主机上运行,且在配置中列出 XFS PMDA:# pcp Performance Co-Pilot configuration on workstation: platform: Linux workstation 4.18.0-80.el8.x86_64 #1 SMP Wed Mar 13 12:02:46 UTC 2019 x86_64 hardware: 12 cpus, 2 disks, 1 node, 36023MB RAM timezone: CEST-2 services: pmcd pmcd: Version 4.3.0-1, 8 agents pmda: root pmcd proc xfs linux mmv kvm jbd2
其他资源
-
在您的系统中的
pmcd (1)
man page - 系统服务和使用 PCP 分发的工具
8.2. 使用 pminfo 检查 XFS 性能指标
PCP 启用 XFS PMDA 以允许每个挂载的 XFS 文件系统报告特定的 XFS 指标。这样可以更加轻松地查明特定挂载的文件系统问题并评估性能。
pminfo
命令为每个挂载的 XFS 文件系统提供每个设备 XFS 指标。
此流程显示 XFS PMDA 提供所有可用指标的列表。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
步骤
显示 XFS PMDA 提供的所有可用指标列表:
# pminfo xfs
显示各个指标的信息。以下示例使用
pminfo
工具检查特定的 XFS读
和写
指标:显示
xfs.write_bytes
指标的简短描述:# pminfo --oneline xfs.write_bytes xfs.write_bytes [number of bytes written in XFS file system write operations]
显示
xfs.read_bytes
指标的长描述:# pminfo --helptext xfs.read_bytes xfs.read_bytes Help: This is the number of bytes read via read(2) system calls to files in XFS file systems. It can be used in conjunction with the read_calls count to calculate the average size of the read operations to file in XFS file systems.
获取
xfs.read_bytes
指标的当前性能值:# pminfo --fetch xfs.read_bytes xfs.read_bytes value 4891346238
使用
pminfo
获取每个设备 XFS 指标:# pminfo --fetch --oneline xfs.perdev.read xfs.perdev.write xfs.perdev.read [number of XFS file system read operations] inst [0 or "loop1"] value 0 inst [0 or "loop2"] value 0 xfs.perdev.write [number of XFS file system write operations] inst [0 or "loop1"] value 86 inst [0 or "loop2"] value 0
其他资源
-
您系统上的
pminfo (1)
手册页 - XFS 的 PCP 指标组
- 每个设备 PCP 指标组用于 XFS
8.3. 使用 pmstore 重置 XFS 性能指标
使用 PCP,您可以修改特定指标的值,特别是当指标充当控制变量时,如 xfs.control.reset
指标。要修改指标值,请使用 pmstore
工具。
这个步骤描述了如何使用 pmstore
工具重置 XFS 指标。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
步骤
显示指标的值:
$ pminfo -f xfs.write xfs.write value 325262
重置所有 XFS 指标:
# pmstore xfs.control.reset 1 xfs.control.reset old value=0 new value=1
验证
在重置指标后查看信息:
$ pminfo --fetch xfs.write xfs.write value 0
其他资源
-
系统中的
pmstore (1)
和pminfo (1)
man page - 系统服务和使用 PCP 分发的工具
- XFS 的 PCP 指标组
8.4. XFS 的 PCP 指标组
下表描述了 XFS 可用的 PCP 指标组。
指标组 | 提供的指标 |
| 常规 XFS 指标,包括读取和写入操作计数、读取和写入字节计数。另外,索引节点的次数也会刷新、集群集群和集群失败数的计数器。 |
| 有关文件系统中对象分配的指标范围,其中包括扩展的数量和块创建/自由。分配树查找和比较,以及扩展从 btree 创建和删除记录。 |
| 指标包括块映射的读/写入和块删除次数,用于插入、删除和查找的扩展列表操作。另外,还可从 blockmap 进行比较、查找、插入和删除操作的操作计数器。 |
| XFS 文件系统的目录操作计数器,用于创建、删除条目,计数为"getdent"操作。 |
| meta-data 事务的数量的计数器包括同步和异步事务的数量以及空事务的数量。 |
| 操作系统在索引节点缓存中查找带有不同结果的 XFS 索引节点的次数计数器。这些计数的缓存命中,缓存未命中等。 |
| 通过 XFS 文件 sytems 写入的日志缓冲区数的计数器包括写入磁盘的块数量。还提供日志清除和固定数量的指标。 |
| XFS flush deamon 清空的文件数据的字节数以及缓冲区数量计数器(清空到磁盘上连续和非相邻空间)的计数器。 |
| 所有 XFS 文件系统的属性数量、设置、删除和列出操作的数量。 |
| 在 XFS 文件系统上,配额操作的指标包括数字配额回收、配额缓存未命中、缓存命中和配额数据回收。 |
| 有关 XFS 缓冲区对象的指标范围。计数器包括请求的缓冲区调用数、成功缓冲区锁定、等待的缓冲区锁定、miss_locks、miss_retries 和 buffer hit(在查找页面时)。 |
| 有关 XFS btree 操作的指标。 |
| 配置用于重置 XFS 统计数据的指标计数器的配置指标。使用 pmstore 工具切换控制指标。 |
8.5. 每个设备 PCP 指标组用于 XFS
下表描述了适用于 XFS 的每设备 PCP 指标组。
指标组 | 提供的指标 |
| 常规 XFS 指标,包括读取和写入操作计数、读取和写入字节计数。另外,索引节点的次数也会刷新、集群集群和集群失败数的计数器。 |
| 有关文件系统中对象分配的指标范围,其中包括扩展的数量和块创建/自由。分配树查找和比较,以及扩展从 btree 创建和删除记录。 |
| 指标包括块映射的读/写入和块删除次数,用于插入、删除和查找的扩展列表操作。另外,还可从 blockmap 进行比较、查找、插入和删除操作的操作计数器。 |
| XFS 文件系统的目录操作计数器,用于创建、删除条目,计数为"getdent"操作。 |
| meta-data 事务的数量的计数器包括同步和异步事务的数量以及空事务的数量。 |
| 操作系统在索引节点缓存中查找带有不同结果的 XFS 索引节点的次数计数器。这些计数的缓存命中,缓存未命中等。 |
| 通过 XFS filesytems 写入的日志缓冲区数的计数器包括写入磁盘的块数量。还提供日志清除和固定数量的指标。 |
| XFS flush deamon 清空的文件数据的字节数以及缓冲区数量计数器(清空到磁盘上连续和非相邻空间)的计数器。 |
| 所有 XFS 文件系统的属性数量、设置、删除和列出操作的数量。 |
| 在 XFS 文件系统上,配额操作的指标包括数字配额回收、配额缓存未命中、缓存命中和配额数据回收。 |
| 有关 XFS 缓冲区对象的指标范围。计数器包括请求的缓冲区调用数、成功缓冲区锁定、等待的缓冲区锁定、miss_locks、miss_retries 和 buffer hit(在查找页面时)。 |
| 有关 XFS btree 操作的指标。 |
第 9 章 设置 PCP 指标的图形表示
使用 pcp
、grafana
、pcp redis
、pcp bpftrace
和 pcp vector
的组合来提供 Performance Co-Pilot (PCP)收集的实时数据或数据的图形表示。
9.1. 使用 pcp-zeroconf 设置 PCP
这个步骤描述了如何在使用 pcp-zeroconf
软件包的系统中设置 PCP。安装 pcp-zeroconf
软件包后,系统会将默认指标集合记录到存档文件中。
步骤
安装
pcp-zeroconf
软件包:# dnf install pcp-zeroconf
验证
确保
pmlogger
服务处于活跃状态,并开始归档指标:# pcp | grep pmlogger pmlogger: primary logger: /var/log/pcp/pmlogger/localhost.localdomain/20200401.00.12
其他资源
-
系统上的
pmlogger
man page - 使用 Performance Co-Pilot 监控性能
9.2. 设置 grafana-server
Grafana 生成可从浏览器访问的图形。grafana-server
是 Grafana 仪表盘的后端服务器。默认情况下,它监听所有接口,并提供通过 Web 浏览器访问的 Web 服务。grafana-pcp
插件与后端中的 pmproxy
协议交互。
这个步骤描述了如何设置 grafana-server
。
先决条件
- 配置了 PCP。如需更多信息,请参阅使用 pcp-zeroconf 设置 PCP。
步骤
安装以下软件包:
# dnf install grafana grafana-pcp
重启并启用以下服务:
# systemctl restart grafana-server # systemctl enable grafana-server
为到 Grafana 服务的网络流量打开服务器防火墙。
# firewall-cmd --permanent --add-service=grafana success # firewall-cmd --reload success
验证
确定
grafana-server
正在侦听并响应请求:# ss -ntlp | grep 3000 LISTEN 0 128 *:3000 *:* users:(("grafana-server",pid=19522,fd=7))
确保安装了
grafana-pcp
插件:# grafana-cli plugins ls | grep performancecopilot-pcp-app performancecopilot-pcp-app @ 3.1.0
其他资源
-
系统中的
pmproxy (1)
和grafana-server
man page
9.3. 访问 Grafana Web UI
这个步骤描述了如何访问 Grafana Web 界面。
使用 Grafana Web 界面,您可以:
- 添加 PCP Redis、PCP bpftrace 和 PCP 向量数据源
- 创建仪表盘
- 查看任何有用的指标的概述
- 在 PCP Redis 中创建警报
先决条件
- 配置了 PCP。如需更多信息,请参阅使用 pcp-zeroconf 设置 PCP。
-
grafana-server
被配置。如需更多信息,请参阅设置 grafana-server。
步骤
在客户端系统中,打开浏览器,并使用 http://192.0.2.0:3000 链接通过端口
3000
访问grafana-server
。将 192.0.2.0 替换为您的计算机 IP。
首次登录时,在 Email or username 和 Password 字段中输入 admin。
Grafana 提示设置 新密码 以创建安全帐户。如果要稍后设置,请点 Skip。
- 在菜单中,将鼠标悬停在 Configuration 图标上,然后单击 Plugins。
- 在 Plugins 选项卡的 Search by name or type 中输入 performance co-pilot,然后点 Performance Co-Pilot (PCP) 插件。
- 在 Plugins / Performance Co-Pilot 窗格中,点 。
点 Grafana 图标。Grafana Home 页会被显示。
图 9.1. 仪表盘主页
注意屏幕右上角有一个类似的 图标,但它控制常规 仪表盘设置。
在 Grafana Home 页面中,点 Add your first data source 添加 PCP Redis、PCP bpftrace 和 PCP 向量数据源。有关添加数据源的更多信息,请参阅:
- 要添加 pcp redis 数据源,查看默认仪表盘,创建面板和警报规则,请参阅在 PCP Redis 数据源中创建面板和警报。
- 要添加 pcp bpftrace 数据源并查看默认仪表盘,请参阅 PCP bpftrace System Analysis 仪表盘。
- 要添加 pcp向量数据源,查看默认仪表盘并查看向量清单,请参阅 查看 PCP 向量 检查列表。
- 可选:在菜单中,将鼠标悬停在 admin profile 图标上,以更改 Preferences,包括 Edit Profile、Change Password 或 Sign out。
其他资源
-
系统中
grafana-cli
和grafana-server
man page
9.4. 为 Grafana 配置安全连接
您可以在 Grafana 和 Performance Co-Pilot (PCP)组件之间建立安全连接。在这些组件之间建立安全连接有助于防止未授权方访问或修改正在收集和监控的数据。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
-
grafana-server
被配置。如需更多信息,请参阅设置 grafana-server。 私有客户端密钥存储在
/etc/grafana/grafana.key
文件中。如果您使用其他路径,请修改流程相应步骤中的路径。有关创建私钥和证书签名请求(CSR)的详细信息,以及如何从证书颁发机构(CA)请求证书,请参阅您的 CA 文档。
-
TLS 客户端证书存储在
/etc/grafana/grafana.crt
文件中。如果您使用其他路径,请修改流程相应步骤中的路径。
步骤
作为 root 用户,打开
/etc/grafana/grana.ini
文件,并调整[server]
部分中的以下选项,以反映以下内容:protocol = https cert_key = /etc/grafana/grafana.key cert_file = /etc/grafana/grafana.crt
确保 grafana 可以访问证书:
# su grafana -s /bin/bash -c \ 'ls -1 /etc/grafana/grafana.crt /etc/grafana/grafana.key' /etc/grafana/grafana.crt /etc/grafana/grafana.key
重启并启用 Grafana 服务,以应用配置更改:
# systemctl restart grafana-server # systemctl enable grafana-server
验证
-
在客户端系统上,打开浏览器并使用 https://192.0.2.0:3000 链接访问
grafana-server
机器的端口 3000。将 192.0.2.0 替换为您的机器 IP。 确认 锁图标显示在地址栏旁边。
注意如果协议设置为
http
,并且尝试 HTTPS 连接,则您将收到ERR_SSL_PROTOCOL_ERROR
错误。如果协议设置为https
,并且尝试 HTTP 连接,则 Grafana 服务器会使用 "Client send a HTTP request to a HTTPS server" 信息响应。
9.5. 配置 PCP Redis
使用 PCP Redis 数据源:
- 查看数据存档
- 使用 pm series 语言查询时间序列
- 分析多个主机的数据
先决条件
- 配置了 PCP。如需更多信息,请参阅使用 pcp-zeroconf 设置 PCP。
-
grafana-server
被配置。如需更多信息,请参阅设置 grafana-server。 -
邮件传输代理(如
sendmail
或postfix
)已安装并配置。
步骤
安装
redis
软件包:# dnf install redis
启动并启用以下服务:
# systemctl start pmproxy redis # systemctl enable pmproxy redis
重启
grafana-server
:# systemctl restart grafana-server
验证
确保
pmproxy
和redis
正常工作:# pmseries disk.dev.read 2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
如果没有安装
redis
软件包,这个命令不会返回任何数据。
其他资源
-
您系统上的
pmseries (1)
man page
9.6. 为 PCP redis 配置安全连接
您可以在 performance co-pilot (PCP)、Grafana 和 PCP redis 之间建立安全连接。在这些组件之间建立安全连接有助于防止未授权方访问或修改正在收集和监控的数据。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
-
grafana-server
被配置。如需更多信息,请参阅设置 grafana-server。 - PCP redis 已安装。如需更多信息,请参阅配置 PCP Redis。
私有客户端密钥存储在
/etc/redis/client.key
文件中。如果您使用其他路径,请修改流程相应步骤中的路径。有关创建私钥和证书签名请求(CSR)的详细信息,以及如何从证书颁发机构(CA)请求证书,请参阅您的 CA 文档。
-
TLS 客户端证书存储在
/etc/redis/client.crt
文件中。如果您使用其他路径,请修改流程相应步骤中的路径。 -
TLS 服务器密钥存储在
/etc/redis/redis.key
文件中。如果您使用其他路径,请修改流程相应步骤中的路径。 -
TLS 服务器证书存储在
/etc/redis/redis.crt
文件中。如果您使用其他路径,请修改流程相应步骤中的路径。 -
CA 证书存储在
/etc/redis/ca.crt
文件中。如果您使用其他路径,请修改流程相应步骤中的路径。
另外,对于 pmproxy
守护进程:
-
私有服务器密钥存储在
/etc/pcp/tls/server.key
文件中。如果您使用其他路径,请修改流程相应步骤中的路径。
步骤
以 root 用户身份,打开
/etc/redis/redis.conf
文件,并调整 TLS/SSL 选项以反映以下属性:port 0 tls-port 6379 tls-cert-file /etc/redis/redis.crt tls-key-file /etc/redis/redis.key tls-client-key-file /etc/redis/client.key tls-client-cert-file /etc/redis/client.crt tls-ca-cert-file /etc/redis/ca.crt
确保
redis
可以访问 TLS 证书:# su redis -s /bin/bash -c \ 'ls -1 /etc/redis/ca.crt /etc/redis/redis.key /etc/redis/redis.crt' /etc/redis/ca.crt /etc/redis/redis.crt /etc/redis/redis.key
重启
redis
服务器以应用配置更改:# systemctl restart redis
验证
确认 TLS 配置可以正常工作:
# redis-cli --tls --cert /etc/redis/client.crt \ --key /etc/redis/client.key \ --cacert /etc/redis/ca.crt <<< "PING" PONG
不成功的 TLS 配置可能导致以下错误信息:
Could not negotiate a TLS connection: Invalid CA Certificate File/Directory
9.7. 在 PCP Redis 数据源中创建面板和警报
在添加了 PCP Redis 数据源后,您可以使用有用的指标概述控制面板,添加查询来视觉化负载图形,并创建可帮助您在系统发生后查看系统问题的警报。
先决条件
- PCP Redis 已配置。如需更多信息,请参阅配置 PCP Redis。
-
grafana-server
可以访问。如需更多信息,请参阅 访问 Grafana Web UI。
步骤
- 登录到 Grafana Web UI。
- 在 Grafana Home 页面中,点 Add your first data source。
- 在 Add data source 窗格中,在 Filter by name or type 文本框中键入 redis,然后点 PCP Redis。
在 Data Sources / PCP Redis 窗格中,执行以下操作:
-
在 URL 字段中添加
http://localhost:44322
,然后点 。 点
→ → 查看带有任何有用指标概述的仪表盘。图 9.2. PCP Redis: 主机概述
-
在 URL 字段中添加
添加新面板:
- 在菜单中,将鼠标悬停在 → → 来添加一个面板。
-
在 Query 选项卡中,从查询列表中选择 PCP Redis 而不是所选的默认选项,在 A 的文本字段中输入 metric,如
kernel.all.load
以视觉化内核负载图形。 - 可选:添加 Panel title 和 Description,更新来自 Settings 的选项。
- 点 Dashboard name。 以应用更改并保存仪表盘。添加
点
以应用更改并返回控制面板。图 9.3. PCP Redis 查询面板
创建警报规则:
- 在 PCP Redis 查询面板中,点 Alert,然后点 Create Alert。
- 编辑 Rule 中的 Name, Evaluate query 和 For 项,为您的警报指定 Conditions。
点
以应用更改并保存仪表盘。点 以应用更改并返回控制面板。图 9.4. 在 PCP Redis 面板中创建警报
- 可选:在同一面板中,向下滚动并点 图标以删除创建的规则。
可选:在菜单中点击 Alerting 图标查看创建的具有不同警报状态的警报规则,从Alert Rules 选项卡编辑警报规则,或者暂停现有规则。
要为创建的警报规则添加通知频道以接收来自 Grafana 的警报通知,请参阅为警报添加通知频道。
9.8. 为警报添加通知频道
通过添加通知频道,每当满足警报规则条件且系统需要进一步监控时,可以从 Grafana 接收警报通知。
在从支持的通知程序列表中选择任意一种类型后,您可以收到这些警报,其中包括 DingDing, Discord, Email, Google Hangouts Chat, HipChat, Kafka REST Proxy, LINE, Microsoft Teams, OpsGenie, PagerDuty, Prometheus Alertmanager, Pushover, Sensu, Slack, Telegram, Threema Gateway, VictorOps, 和 webhook。
先决条件
-
grafana-server
可以访问。如需更多信息,请参阅 访问 Grafana Web UI。 - 已创建一个警报规则。如需更多信息,请参阅在 PCP Redis 数据源中创建面板和警报。
配置 SMTP 并在
grafana/grafana.ini
文件中添加有效的发件人电子邮件地址:# vi /etc/grafana/grafana.ini [smtp] enabled = true from_address = abc@gmail.com
使用有效电子邮件地址替换 abc@gmail.com。
重启
grafana-server
# systemctl restart grafana-server.service
步骤
- 在菜单中,将鼠标悬停在 → → 。
在
New contact point
详情视图中,执行以下操作:- 在 Name 文本框中输入您的名称
-
选择 Contact point type,例如 Email ,并输入电子邮件地址。您可以使用
;
分隔符添加多个电子邮件地址。 - 可选:配置可选电子邮件设置和通知设置。
- 单击 。
在警报规则中选择通知频道:
- 在菜单中选择 Notification policies 图标,然后点 + New specific policy。
- 选择您刚才创建的 Contact point
- 点 Save policy 按钮
其他资源
9.9. 在 PCP 组件间设置身份验证
您可以使用 scram-sha-256
身份验证机制来设置身份验证,该机制可通过简单身份验证安全层 (SASL) 框架获得 PCP 支持的。
步骤
为
scram-sha-256
身份验证机制安装sasl
框架:# dnf install cyrus-sasl-scram cyrus-sasl-lib
在
pmcd.conf
文件中指定支持的身份验证机制和用户数据库路径:# vi /etc/sasl2/pmcd.conf mech_list: scram-sha-256 sasldb_path: /etc/pcp/passwd.db
创建一个新用户:
# useradd -r metrics
使用您的用户名替换 metrics。
在用户数据库中添加创建的用户:
# saslpasswd2 -a pmcd metrics Password: Again (for verification):
要添加创建的用户,您需要输入 指标 帐户密码。
设置用户数据库的权限:
# chown root:pcp /etc/pcp/passwd.db # chmod 640 /etc/pcp/passwd.db
重启
pmcd
服务:# systemctl restart pmcd
验证
验证
sasl
配置:# pminfo -f -h "pcp://127.0.0.1?username=metrics" disk.dev.read Password: disk.dev.read inst [0 or "sda"] value 19540
其他资源
-
saslauthd (8)
,pminfo (1)
, 和sha256
man page - 如何在 RHEL 8.2 中在 PCP 组件(如 PMDA 和 pmcd)之间设置身份验证?
9.10. 安装 PCP bpftrace
安装 PCP bpftrace
代理以内省系统,并从内核和用户空间追踪点收集指标。
bpftrace
代理使用 bpftrace 脚本来收集指标。bpftrace
脚本使用增强的 Berkeley Packet Filter (eBPF
) 。
这个步骤描述了如何安装 pcp bpftrace
。
先决条件
- 配置了 PCP。如需更多信息,请参阅使用 pcp-zeroconf 设置 PCP。
-
grafana-server
被配置。如需更多信息,请参阅设置 grafana-server。 -
scram-sha-256
身份验证机制被配置。如需更多信息,请参阅在 PCP 组件之间设置身份验证。
步骤
安装
pcp-pmda-bpftrace
软件包:# dnf install pcp-pmda-bpftrace
编辑
bpftrace.conf
文件并添加您在 {setting-up-authentication-b between-pcp-components} 中创建的用户:# vi /var/lib/pcp/pmdas/bpftrace/bpftrace.conf [dynamic_scripts] enabled = true auth_enabled = true allowed_users = root,metrics
使用您的用户名替换 metrics。
安装
bpftrace
PMDA:# cd /var/lib/pcp/pmdas/bpftrace/ # ./Install Updating the Performance Metrics Name Space (PMNS) ... Terminate PMDA if already installed ... Updating the PMCD control file, and notifying PMCD ... Check bpftrace metrics have appeared ... 7 metrics and 6 values
pmda-bpftrace
现已安装,只能在验证您的用户后使用。如需更多信息,请参阅 查看 PCP bpftrace System Analysis 仪表盘。
其他资源
-
系统上的
pmdabpftrace (1)
和bpftrace
man page
9.11. 查看 PCP bpftrace System Analysis 仪表盘
使用 PCP bpftrace 数据源,您可以从 pmlogger
或 archive 中不以普通数据提供的源访问实时数据
在 PCP bpftrace 数据源中,您可以使用有用的指标概述查看仪表盘。
先决条件
- 已安装 PCP bpftrace。如需更多信息,请参阅安装 PCP bpftrace。
-
grafana-server
可以访问。如需更多信息,请参阅 访问 Grafana Web UI。
步骤
- 登录到 Grafana Web UI。
- 在 Grafana Home 页面中,点 Add your first data source。
- 在 Add data source 窗格中,在 Filter by name or type 文本框中键入 bpftrace,然后点 PCP bpftrace。
在 Data Sources / PCP bpftrace 窗格中,执行以下操作:
-
在 URL 字段中添加
http://localhost:44322
。 - 切换 Basic Auth 选项,并在 User 和 Password 字段中添加创建的用户凭证。
点
。图 9.5. 在数据源中添加 PCP bpftrace
点
→ → 查看包含任何有用的指标概述的仪表盘。图 9.6. PCP bpftrace: 系统分析
-
在 URL 字段中添加
9.12. 安装 PCP 向量
这个步骤描述了如何安装 pcp 向量
。
先决条件
- 配置了 PCP。如需更多信息,请参阅使用 pcp-zeroconf 设置 PCP。
-
grafana-server
被配置。如需更多信息,请参阅设置 grafana-server。
步骤
安装
pcp-pmda-bcc
软件包:# dnf install pcp-pmda-bcc
安装
bcc
PMDA:# cd /var/lib/pcp/pmdas/bcc # ./Install [Wed Apr 1 00:27:48] pmdabcc(22341) Info: Initializing, currently in 'notready' state. [Wed Apr 1 00:27:48] pmdabcc(22341) Info: Enabled modules: [Wed Apr 1 00:27:48] pmdabcc(22341) Info: ['biolatency', 'sysfork', [...] Updating the Performance Metrics Name Space (PMNS) ... Terminate PMDA if already installed ... Updating the PMCD control file, and notifying PMCD ... Check bcc metrics have appeared ... 1 warnings, 1 metrics and 0 values
其他资源
-
系统中
pmdabcc (1)
man page
9.13. 查看 PCP 向量清单
PCP 向量数据源显示实时指标并使用 pcp
指标。它分析单个主机的数据。
在添加了 PCP 向量数据源后,您可以使用有用的指标概述来查看仪表盘,并查看清单中的相关故障排除或引用链接。
先决条件
- 已安装 PCP 向量。如需更多信息,请参阅安装 PCP 向量。
-
grafana-server
可以访问。如需更多信息,请参阅 访问 Grafana Web UI。
步骤
- 登录到 Grafana Web UI。
- 在 Grafana Home 页面中,点 Add your first data source。
- 在 Add data source 窗格中,在 Filter by name or type 文本框中键入 vector,然后点 PCP 向量。
在 Data Sources / PCP Vector 窗格中,执行以下操作:
-
在 URL 字段中添加
http://localhost:44322
,然后点 。 点
→ → 查看带有任何有用指标概述的仪表盘。图 9.7. PCP Vector:主机概述
-
在 URL 字段中添加
在菜单中,将鼠标悬停在 Performance Co-Pilot 插件上,然后单击 PCP Vector Checklist。
在 PCP 检查列表中,点 帮助或 警告图标查看相关的故障排除或参考链接。
图 9.8. Performance Co-Pilot / PCP 向量清单
9.14. 在 Grafana 中使用 heatmaps
您可以在 Grafana 中使用 heatmaps ,来查看数据随时间变化的直方图,识别数据中的趋势和模式,并查看它们如何随时间而变化。heatmap 中的每一列代表一个直方图,不同的颜色单元代表该直方图中给定值的不同的观察密度。
这个特定工作流用于 RHEL9 上 Grafana 版本 9.0.9 及更高版本中的 heatmaps。
先决条件
- PCP Redis 已配置。如需更多信息,请参阅 配置 PCP Redis。
-
grafana-server
可以访问。如需更多信息,请参阅 访问 Grafana Web UI。 - PCP Redis 数据源已配置。如需更多信息,请参阅 在 PCP Redis 数据源中创建面板和告警。
流程
- 将光标悬停在 Dashboards 选项卡 上,然后单击 + New dashboard。
- 在 Add 面板 菜单上,单击 Add a new panel。
在 Query 选项卡中:
- 从查询列表,而不是所选的默认选项中选择 PCP Redis。
-
在文本字段 A 中,输入指标,如
kernel.all.load
,来视觉化内核负载图。
- 单击视觉化下拉菜单,其默认被设为 Time series ,然后单击 Heatmap。
- 可选:在 Panel Options 下拉菜单中,添加 Panel Title 和 Description 。
在 Heatmap 下拉菜单中,在 Calculate from data 设置下,单击 Yes。
Heatmap
- 可选:在 Colors 下拉菜单中,将默认的 Orange 改为 Scheme,然后选择步骤数(色调)。
可选:在 Tooltip 下拉菜单中,在 Show histogram (Y Axis) 设置下,单击 toggle,以便在光标悬停在 heatmap 中的单元格上时,显示特定直方图中单元的位置。例如:
显示直方图(Y 轴)单元显示
9.15. Grafana 问题故障排除
有时有必要对 Grafana 问题进行故障排除,如 Grafana 不显示任何数据、仪表盘是黑的或类似的问题。
流程
通过执行以下命令,验证
pmlogger
服务是否已启动并正在运行:$ systemctl status pmlogger
运行以下命令,验证是否在磁盘中创建或修改了文件:
$ ls /var/log/pcp/pmlogger/$(hostname)/ -rlt total 4024 -rw-r--r--. 1 pcp pcp 45996 Oct 13 2019 20191013.20.07.meta.xz -rw-r--r--. 1 pcp pcp 412 Oct 13 2019 20191013.20.07.index -rw-r--r--. 1 pcp pcp 32188 Oct 13 2019 20191013.20.07.0.xz -rw-r--r--. 1 pcp pcp 44756 Oct 13 2019 20191013.20.30-00.meta.xz [..]
运行以下命令验证
pmproxy
服务是否正在运行:$ systemctl status pmproxy
通过查看
/var/log/pcp/pmproxy/pmproxy.log
文件确定其包括一些内容来验证pmproxy
是否正在运行、时间序列支持是否被启用以及到 Redis 的连接:pmproxy(1716) Info: Redis slots, command keys, schema version setup
在这里,1716 是 pmproxy 的 PID,对于每次调用
pmproxy
时,将有所不同。运行以下命令,验证 Redis 数据库是否包含任何密钥:
$ redis-cli dbsize (integer) 34837
通过执行以下命令,验证 Redis 数据库和
pmproxy
中的任何 PCP 指标是否能够访问它们:$ pmseries disk.dev.read 2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df $ pmseries "disk.dev.read[count:10]" 2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df [Mon Jul 26 12:21:10.085468000 2021] 117971 70e83e88d4e1857a3a31605c6d1333755f2dd17c [Mon Jul 26 12:21:00.087401000 2021] 117758 70e83e88d4e1857a3a31605c6d1333755f2dd17c [Mon Jul 26 12:20:50.085738000 2021] 116688 70e83e88d4e1857a3a31605c6d1333755f2dd17c [...]
$ redis-cli --scan --pattern "*$(pmseries 'disk.dev.read')" pcp:metric.name:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df pcp:values:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df pcp:desc:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df pcp:labelvalue:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df pcp:instances:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df pcp:labelflags:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
运行以下命令,验证 Grafana 日志中是否有错误:
$ journalctl -e -u grafana-server -- Logs begin at Mon 2021-07-26 11:55:10 IST, end at Mon 2021-07-26 12:30:15 IST. -- Jul 26 11:55:17 localhost.localdomain systemd[1]: Starting Grafana instance... Jul 26 11:55:17 localhost.localdomain grafana-server[1171]: t=2021-07-26T11:55:17+0530 lvl=info msg="Starting Grafana" logger=server version=7.3.6 c> Jul 26 11:55:17 localhost.localdomain grafana-server[1171]: t=2021-07-26T11:55:17+0530 lvl=info msg="Config loaded from" logger=settings file=/usr/s> Jul 26 11:55:17 localhost.localdomain grafana-server[1171]: t=2021-07-26T11:55:17+0530 lvl=info msg="Config loaded from" logger=settings file=/etc/g> [...]
第 10 章 使用 Web 控制台优化系统性能
了解如何在 RHEL web 控制台中设置性能配置集,以便为所选任务优化系统性能。
10.1. Web 控制台中的性能调优选项
Red Hat Enterprise Linux 9 提供几个根据以下任务优化系统的性能配置集:
- 使用桌面的系统
- 吞吐性能
- 延迟性能
- 网络性能
- 低电源消耗
- 虚拟机
TuneD
服务优化系统选项以匹配所选配置集。
在 Web 控制台中,您可以设置系统使用的哪个性能配置集。
其他资源
10.2. 在 Web 控制台中设置性能配置集
根据您要执行的任务,您可以使用 Web 控制台通过设置合适的性能配置集来优化系统性能。
先决条件
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
流程
登录到 RHEL 9 web 控制台。
详情请参阅 登录到 web 控制台。
- 点 Overview。
在 Configuration 部分中,点当前的性能配置文件。
在 Change Performance Profile 对话框中设置所需的配置文件。
- 点 。
验证
- Overview 选项卡现在在 Configuration 部分中显示所选性能配置文件。
10.3. 使用 Web 控制台监控本地系统的性能
Red Hat Enterprise Linux Web 控制台使用 Utilization Saturation and Errors (USE) 方法进行故障排除。新的性能指标页面带有最新数据,您可以对数据进行组织化的历史视图。
在 Metrics and history 页面中,您可以查看事件、错误和资源使用率和饱和度的图形表示。
先决条件
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
-
cockpit-pcp
软件包(其启用收集性能指标)已安装。 启用 Performance Co-Pilot (PCP)服务:
# systemctl enable --now pmlogger.service pmproxy.service
流程
登录到 RHEL 9 web 控制台。
详情请参阅 登录到 web 控制台。
- 点 Overview。
在 Usage 部分中,点 View metrics and history。
Metrics and history 部分打开:
- 当前系统配置和使用情况:
- 用户指定的时间间隔后,图形形式的性能指标:
10.4. 使用 Web 控制台和 Grafana 监控多个系统的性能
Grafana 使您可以一次从多个系统中收集数据,并查看其收集的 Performance Co-Pilot (PCP)指标的图形表示。您可以在 web 控制台界面中的多个系统设置性能指标监控和导出。
前提条件
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
-
您已安装了
cockpit-pcp
软件包。 您已启用了 PCP 服务:
# systemctl enable --now pmlogger.service pmproxy.service
- 您已设置了 Grafana 仪表盘。如需更多信息,请参阅设置 grafana-server。
您已安装了
redis
软件包。另外,您可以在稍后的流程中从 Web 控制台界面安装软件包。
流程
登录到 RHEL 9 web 控制台。
详情请参阅 登录到 web 控制台。
- 在 Overview 页面中,点 Usage 表中的 View metrics and history。
- 点 按钮。
将 Export to network 滑块移到活跃位置。
如果您没有安装
redis
软件包,Web 控制台会提示您安装它。-
要打开
pmproxy
服务,请从下拉列表中选择一个区,然后点 按钮。 - 点击 Save。
验证
- 点 Networking。
- 在 Firewall 表中,点 按钮。
-
在您选择的区域中搜索
pmproxy
。
在您要监视的所有系统中重复此步骤。
其他资源
第 11 章 设置磁盘调度程序
磁盘调度程序负责对提交至存储设备的 I/O 请求进行排序。
您可以通过几种不同方式配置调度程序:
- 使用 TuneD 设置调度程序,如使用 TuneD 设置磁盘调度程序中所述
-
使用
udev
规则设置调度程序,如使用 udev 规则设置磁盘调度程序中所述 - 在运行中的系统上临时更改调度程序,如临时 为特定磁盘设置调度程序
在 Red Hat Enterprise Linux 9 中,块设备只支持多队列调度。这可让块层性能针对使用快速固态驱动器(SSD)和多核系统进行正常扩展。
Red Hat Enterprise Linux 7 和更早的版本中的传统、单一队列调度程序已被删除。
11.1. 可用磁盘调度程序
Red Hat Enterprise Linux 9 中支持以下多队列磁盘调度程序:
none
- 实施第一出 (FIFO) 调度算法。它将请求合并到通用块层,并通过一个简单的最近缓存来合并。
mq-deadline
尝试为请求到达调度程序的时间点提供有保证的延迟。
mq-deadline
调度程序将排队的 I/O 请求分为读取或写入批处理,然后调度它们以增加逻辑块寻址 (LBA) 顺序执行。默认情况下,读取批处理的优先级高于写入批处理,因为应用程序更有可能阻止读 I/O 操作。在mq-deadline
批处理后,它会检查写操作在处理器时间耗尽的时间,并根据情况调度下一个读取或写入批处理。这个调度程序适用于大多数用例,特别是那些写入操作是异步的。
bfq
以桌面系统和互动任务为目标。
bfq
调度程序可确保任何单个应用程序都不会使用所有带宽。实际上,存储设备总是像它们处于闲置时一样进行响应。在其默认配置中,bfq
注重提供最低延迟,而不是达到最大吞吐量。BFQ
基于cfq
代码。它不会为每个进程授予固定时间片段,但会为进程分配一个扇区数衡量的 budget(预算)。在复制大型文件时,这个调度程序不适用。
kyber
调度程序调整自身,以通过计算提交到块 I/O 层的每个 I/O 请求的延迟来实现延迟目标。您可以为读取配置目标延迟,如 cache-misses 和同步写入请求。
此调度程序适用于快速设备,如 NVMe、SSD 或其他低延迟设备。
11.2. 不同用例的磁盘调度程序
根据系统执行的任务,建议在进行任何分析和调优任务前,将以下磁盘调度程序作为基准:
使用案例 | 磁盘调度程序 |
---|---|
传统的使用 SCSI 接口的 HDD |
使用 |
高性能 SSD 或具有快速存储的 CPU 绑定系统 |
使用 |
桌面或互动任务 |
使用 |
虚拟客户端 |
使用 |
11.3. 默认磁盘调度程序
块设备使用默认的磁盘调度程序,除非您指定了另一个调度程序。
具体来说,对于 非易失性内存 Express (NVMe)
块设备,默认调度程序为 none
,红帽建议不更改此设备。
内核会根据设备类型选择默认磁盘调度程序。自动选择调度程序通常是最佳设置。如果您需要不同的调度程序,红帽建议使用 udev
规则或 TuneD 应用程序来配置它。匹配所选设备并只为那些设备切换调度程序。
11.4. 确定活跃磁盘调度程序
此流程决定了哪个磁盘调度程序目前在给定块设备中活跃。
流程
读取
/sys/block/设备/queue/scheduler
文件的内容:# cat /sys/block/device/queue/scheduler [mq-deadline] kyber bfq none
在文件名中,将 device 替换为块设备名称,如
sdc
。活跃的调度程序列在方括号中 (
[ ]
) 。
11.5. 使用 TuneD 设置磁盘调度程序
此流程创建并启用 TuneD 配置集,该配置集为所选块设备设置给定磁盘调度程序。这个设置会在系统重启后保留。
在以下命令和配置中替换:
-
带有块设备名称的 device,如
sdf
-
带有您要为该设备设置的磁盘调度程序的 selected-scheduler,例如
bfq
先决条件
-
TuneD
服务已安装并启用。详情请参阅安装和启用 TuneD。
流程
可选:选择一个您的配置集将要基于的现有 Tuned 配置集。有关可用配置集列表,请参阅 RHEL 提供的 TuneD 配置集。
要查看哪个配置集当前处于活跃状态,请使用:
$ tuned-adm active
创建一个新目录来保存 TuneD 配置集:
# mkdir /etc/tuned/my-profile
查找所选块设备系统唯一标识符:
$ 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
注意本例中的命令将返回以 World Wide Name (WWN) 或与指定块设备关联的序列号的所有值。虽然最好使用 WWN,但给定设备始终不能使用 WWN,但 example 命令返回的任何值都可以接受用作 device system unique ID。
创建
/etc/tuned/my-profile/tuned.conf
配置文件。在该文件中设置以下选项:可选:包含现有配置集:
[main] include=existing-profile
为与 WWN 标识符匹配的设备设置所选磁盘调度程序:
[disk] devices_udev_regex=IDNAME=device system unique id elevator=selected-scheduler
在这里:
-
使用要使用的标识符的名称替换 IDNAME (如
ID_WWN
)。 将 device system unique id 替换为所选标识符的值(如
0x5002538d00000000
)。要匹配
devices_udev_regex
选项中的多个设备,将标识符放在括号中,并使用垂直栏来分离它们:devices_udev_regex=(ID_WWN=0x5002538d00000000)|(ID_WWN=0x1234567800000000)
-
使用要使用的标识符的名称替换 IDNAME (如
启用您的配置集:
# 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.
读取
/sys/block/设备/queue/scheduler
文件的内容:# cat /sys/block/device/queue/scheduler [mq-deadline] kyber bfq none
在文件名中,将 device 替换为块设备名称,如
sdc
。活跃的调度程序列在方括号中 (
[]
) 。
其他资源
11.6. 使用 udev 规则设置磁盘调度程序
此流程使用 udev
规则为特定块设备设置给定磁盘调度程序。这个设置会在系统重启后保留。
在以下命令和配置中替换:
-
带有块设备名称的 device,如
sdf
-
带有您要为该设备设置的磁盘调度程序的 selected-scheduler,例如
bfq
流程
查找块设备系统唯一标识符:
$ udevadm info --name=/dev/device | grep -E '(WWN|SERIAL)' E: ID_WWN=0x5002538d00000000 E: ID_SERIAL=Generic-_SD_MMC_20120501030900000-0:0 E: ID_SERIAL_SHORT=20120501030900000
注意本例中的命令将返回以 World Wide Name (WWN) 或与指定块设备关联的序列号的所有值。虽然最好使用 WWN,但给定设备始终不能使用 WWN,但 example 命令返回的任何值都可以接受用作 device system unique ID。
配置
udev
规则。使用以下内容创建/etc/udev/rules.d/99-scheduler.rules
文件:ACTION=="add|change", SUBSYSTEM=="block", ENV{IDNAME}=="device system unique id", ATTR{queue/scheduler}="selected-scheduler"
在这里:
-
使用要使用的标识符的名称替换 IDNAME (如
ID_WWN
)。 -
将 device system unique id 替换为所选标识符的值(如
0x5002538d00000000
)。
-
使用要使用的标识符的名称替换 IDNAME (如
重新载入
udev
规则:# udevadm control --reload-rules
应用调度程序配置:
# udevadm trigger --type=devices --action=change
验证
验证活跃的调度程序:
# cat /sys/block/device/queue/scheduler
11.7. 为特定磁盘临时设置调度程序
此流程为特定块设备设置给定磁盘调度程序。系统重启后该设置不会保留。
流程
将所选调度程序的名称写入
/sys/block/device/queue/scheduler
文件:# echo selected-scheduler > /sys/block/device/queue/scheduler
在文件名中,将 device 替换为块设备名称,如
sdc
。
验证
验证调度程序是否在该设备中活跃:
# cat /sys/block/device/queue/scheduler
第 12 章 调整 Samba 服务器的性能
了解在某些情况下,哪些设置可以提高 Samba 的性能,以及哪些设置可能会对性能造成负面影响。
本节的部分内容来自在 Samba Wiki 中发布的 Performance Tuning 文档。许可证: CC BY 4.0。作者和贡献者:请参阅 Wiki 页面上的历史选项卡。
先决条件
- Samba 被设置为文件或打印服务器
12.1. 设置 SMB 协议版本
每个新的 SMB 版本都添加了特性并提高了协议的性能。最新的 Windows 和 Windows 服务器操作系统始终支持最新的协议版本。如果 Samba 也使用最新的协议版本,那么连接到 Samba 的 Windows 客户端将从性能改进中受益。在 Samba 中,server max protocol的默认值被设置为最新支持的稳定的 SMB 协议版本。
要始终拥有最新的稳定的 SMB 协议版本,请不要设置 server max protocol
参数。如果手动设置参数,则需要修改 SMB 协议的每个新版本的设置,以便启用最新的协议版本。
以下流程解释了如何对 server max protocol
参数使用默认值。
流程
-
从
/etc/samba/smb.conf
文件的[global]
部分中删除server max protocol
参数。 重新载入 Samba 配置
# smbcontrol all reload-config
12.3. 可能会对性能造成负面影响的设置
默认情况下,Red Hat Enterprise Linux 中的内核会根据高网络性能进行了微调。例如,内核对缓冲区大小使用自动轮询机制。在 /etc/samba/smb.conf
文件中设置 socket options
参数会覆盖这些内核设置。因此,设置此参数会在大多数情况下降低 Samba 网络性能。
要使用内核的优化的设置,请从 /etc/samba/smb.conf
中的 [global]
部分删除 socket options
参数。
第 13 章 优化虚拟机性能
与主机相比,虚拟机的性能总会有所降低。以下小节解释了这个冲突的原因,并提供了有关如何在 RHEL 9 中最小化虚拟化性能影响的说明,以便您的硬件基础架构资源可以尽可能高效地使用。
13.1. 影响虚拟机性能的因素
虚拟机作为用户空间进程在主机上运行。因此管理程序需要转换主机的系统资源,以便虚拟机可使用它们。因此,部分资源会被转换消耗,因此虚拟机无法获得与主机相同的性能效率。
虚拟化对系统性能的影响
体虚拟机性能损失的原因包括:
- 虚拟 CPU(vCPU)是主机上的线,,由 Linux 调度程序处理。
- VM 不会自动继承主机内核的优化功能,比如 NUMA 或巨页。
- 主机的磁盘和网络 I/O 设置可能会对虚拟机有显著的性能影响。
- 网络流量通常通过基于软件的网桥到达虚拟机。
- 根据主机设备及其型号,特定硬件的模拟可能会产生大量的开销。
虚拟化对虚拟机性能影响的严重程度受到各种因素的影响,具体包括:
- 并行运行的虚拟机数量。
- 每个虚拟机使用的虚拟设备数量。
- 虚拟机使用的设备类型。
降低虚拟机性能损失
RHEL 9 提供了很多功能,可用于降低虚拟化的负面影响。值得注意的是:
调优虚拟机性能会对其他虚拟化功能造成负面影响。例如,它可以使迁移修改过的虚拟机更为困难。
13.2. 使用 TuneD 优化虚拟机性能
TuneD
工具是一种调优配置文件交付机制,能够让 RHEL 适应某些工作负载特性,如 CPU 密集型任务或存储网络吞吐量响应的需求。它提供很多预先配置的调优配置文件,以便在多个特定用例中增强性能并降低功耗。您可以编辑这些配置集,或创建新配置集来创建适合您的环境的性能解决方案,包括虚拟环境。
要针对虚拟化优化 RHEL 9,请使用以下配置集:
-
对于 RHEL 9 虚拟机,请使用 virtual-guest 配置集。它基于通常适用的
throughput-performance
配置集,但也会降低虚拟内存的交换性。 - 对于 RHEL 9 虚拟化主机,请使用 virtual-host 配置集。这可提高脏内存页面的主动回写,这有助于主机性能。
先决条件
-
TuneD
服务已安装并启用。
流程
启用特定的 TuneD
配置集:
列出可用的
TuneD
配置集。# tuned-adm list Available profiles: - balanced - General non-specialized TuneD profile - desktop - Optimize for the desktop use-case [...] - virtual-guest - Optimize for running inside a virtual guest - virtual-host - Optimize for running KVM guests Current active profile: balanced
可选:创建一个新的
TuneD
配置文件,或编辑现有的TuneD
配置文件。如需更多信息,请参阅自定义 TuneD 配置集。
激活
TuneD
配置集。# tuned-adm profile selected-profile
要优化虚拟化主机,请使用 virtual-host 配置集。
# tuned-adm profile virtual-host
在 RHEL 虚拟机操作系统中,使用 virtual-guest 配置集。
# tuned-adm profile virtual-guest
验证
显示
TuneD
的活动的配置文件。# tuned-adm active Current active profile: virtual-host
确保已在您的系统上应用了
TuneD
配置文件设置。# tuned-adm verify Verification succeeded, current system settings match the preset profile. See tuned log file ('/var/log/tuned/tuned.log') for details.
其他资源
13.3. 优化 libvirt 守护进程
libvirt
虚拟化套件作为 RHEL hypervisor 的管理层,libvirt
配置对您的虚拟化主机有很大影响。值得注意的是,RHEL 9 包含两种不同类型的 libvirt
守护进程,即单体或模块化,您使用的守护进程类型会影响您可以配置单独的虚拟化驱动程序。
13.3.1. libvirt 守护进程的类型
RHEL 9 支持以下 libvirt
守护进程类型:
- 单体 libvirt
传统的
libvirt
守护进程libvirtd
通过使用单个配置文件 -/etc/libvirt/libvirtd.conf
控制各种虚拟化驱动程序。因此,
libvirtd
允许使用集中的虚拟机监控程序配置,但可能会导致对系统资源的使用效率低。因此,libvirtd
在以后的 RHEL 主发行版本中将不被支持。但是,如果您从 RHEL 8 更新至 RHEL 9,您的主机仍然默认使用
libvirtd
。- 模块 libvirt
RHEL 9 中新引入的模块
libvirt
为各个虚拟化驱动程序提供一个特定的守护进程。其中包括:- virtqemud - hypervisor 管理的主要守护进程
- virtinterfaced - 用于主机 NIC 管理的辅助守护进程
- virtnetworkd - 用于虚拟网络管理的辅助守护进程
- virtnodedevd - 主机物理设备管理的辅助守护进程
- virtnwfilterd - 主机防火墙管理的辅助守护进程
- virtsecretd - 用于主机 secret 管理的辅助守护进程
- virtstoraged - 用于存储管理的辅助守护进程
每个守护进程都有单独的配置文件 - 例如
/etc/libvirt/virtqemud.conf
。因此,模块化的libvirt
守护进程可以为调优libvirt
资源管理提供更好的选项。如果您执行了全新的 RHEL 9 安装,则会默认配置模块化的
libvirt
。
后续步骤
-
如果您的 RHEL 9 使用
libvirtd
,红帽建议切换到模块化守护进程。具体步骤请参阅启用模块化 libvirt 守护进程。
13.3.2. 启用模块化 libvirt 守护进程
在 RHEL 9 中,libvirt
库使用 modular 守护进程来处理您主机上的单个虚拟化驱动程序集。例如,virtqemud
守护进程处理 QEMU 驱动程序。
如果您执行了 RHEL 9 主机的全新安装,您的虚拟机监控程序默认使用模块化 libvirt
守护进程。但是,如果您将主机从 RHEL 8 升级到 RHEL 9,您的管理程序将使用单体 libvirtd
守护进程,这是 RHEL 8 中的默认设置。
如果是这种情况,红帽建议改为启用模块 libvirt
守护进程,因为它们为微调 libvirt
资源管理提供了更好的选项。另外,libvirtd
在以后的 RHEL 主发行版本中将不被支持。
先决条件
您的管理程序使用单体的
libvirtd
服务。# systemctl is-active libvirtd.service active
如果这个命令显示
active
,则代表在使用libvirtd
。- 您的虚拟机已关闭。
流程
停止
libvirtd
及其套接字。$ systemctl stop libvirtd.service $ systemctl stop libvirtd{,-ro,-admin,-tcp,-tls}.socket
禁用
libvirtd
以防止它在引导时启动。$ systemctl disable libvirtd.service $ systemctl disable libvirtd{,-ro,-admin,-tcp,-tls}.socket
启用模块
libvirt
守护进程。# for drv in qemu interface network nodedev nwfilter secret storage; do systemctl unmask virt${drv}d.service; systemctl unmask virt${drv}d{,-ro,-admin}.socket; systemctl enable virt${drv}d.service; systemctl enable virt${drv}d{,-ro,-admin}.socket; done
启动模块守护进程的套接字。
# for drv in qemu network nodedev nwfilter secret storage; do systemctl start virt${drv}d{,-ro,-admin}.socket; done
可选:如果您需要从远程主机连接到主机,请启用并启动虚拟化代理守护进程。
检查
libvirtd-tls.socket
服务是否已在系统上启用了。# grep listen_tls /etc/libvirt/libvirtd.conf listen_tls = 0
如果
libvirtd-tls.socket
没启用(listen_tls = 0
),请激活virtproxyd
,如下所示:# systemctl unmask virtproxyd.service # systemctl unmask virtproxyd{,-ro,-admin}.socket # systemctl enable virtproxyd.service # systemctl enable virtproxyd{,-ro,-admin}.socket # systemctl start virtproxyd{,-ro,-admin}.socket
如果
libvirtd-tls.socket
启用了(listen_tls = 1
),请激活virtproxyd
,如下所示:# systemctl unmask virtproxyd.service # systemctl unmask virtproxyd{,-ro,-admin,-tls}.socket # systemctl enable virtproxyd.service # systemctl enable virtproxyd{,-ro,-admin,-tls}.socket # systemctl start virtproxyd{,-ro,-admin,-tls}.socket
要启用
virtproxyd
的 TLS 套接字,您的主机必须配置了 TLS 证书,以与libvirt
一起工作。如需更多信息,请参阅 上游 libvirt 文档。
验证
激活已启用的虚拟化守护进程。
# virsh uri qemu:///system
验证您的主机是否在使用
virtqemud
模块守护进程。# systemctl is-active virtqemud.service active
如果状态是
active
,则您已成功启用了模块libvirt
守护进程。
13.4. 配置虚拟机内存
要提高虚拟机 (VM) 的性能,您可以将额外的主机 RAM 分配给虚拟机。类似地,您可以减少分配给虚拟机的内存量,从而使主机内存可以分配给其他虚拟机或任务。
要执行这些操作,您可以使用 Web 控制台 或 命令行界面。
13.4.1. 使用 web 控制台添加和删除虚拟机内存
要提高虚拟机 (VM) 的性能或释放它使用的主机资源,您可以使用 Web 控制台来调整分配给虚拟机的内存量。
先决条件
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
客户端操作系统正在运行内存 balloon 驱动程序。请执行以下命令校验:
确保虚拟机的配置包含
memballoon
设备:# virsh dumpxml testguest | grep memballoon <memballoon model='virtio'> </memballoon>
如果此命令显示任何输出,并且型号未设置为
none
,则存在memballoon
设备。确保 balloon 驱动程序在客户机操作系统中运行。
-
在 Windows 客户机中,驱动程序作为
virtio-win
驱动程序软件包的一部分安装。具体步骤请参阅为 Windows 虚拟机安装半虚拟化 KVM 驱动程序。 -
在 Linux 客户机中,通常默认包含驱动程序,并在存在
memballoon
设备时激活。
-
在 Windows 客户机中,驱动程序作为
- Web 控制台 VM 插件 已安装在您的系统上。
流程
可选:获取有关虚拟机的最大内存和当前使用的内存的信息。这将作为您更改的基准,并进行验证。
# virsh dominfo testguest Max memory: 2097152 KiB Used memory: 2097152 KiB
登录到 RHEL 9 web 控制台。
详情请参阅 登录到 web 控制台。
在
界面中,点您要查看其信息的虚拟机。此时将打开一个新页面,其中包含关于所选虚拟机基本信息的概述部分,以及用于访问虚拟机的图形界面的控制台部分。
点概述窗格中
Memory
行旁边的 。此时将显示
Memory Adjustment
对话框。为所选的虚拟机配置虚拟内存。
最大分配 - 设置虚拟机可用于其进程的最大主机内存量。您可以在创建虚拟机时指定最大内存,或可以在以后增大。您可以将内存指定为 MiB 或 GiB 的倍数。
只有在关闭虚拟机上才能调整最大内存分配。
当前分配 - 设置分配给虚拟机的实际内存量。这个值可以小于最大分配量,但不能超过它。您可以调整值,来控制虚拟机的进程可使用的内存。您可以将内存指定为 MiB 或 GiB 的倍数。
如果没有指定这个值,则默认分配是 Maximum allocation 值。
点
。调整了虚拟机的内存分配。
13.4.2. 使用命令行界面添加和删除虚拟机内存
若要提高虚拟机 (VM) 的性能或释放其使用的主机资源,您可以使用 CLI 来调整分配给虚拟机的内存量。
先决条件
客户端操作系统正在运行内存 balloon 驱动程序。请执行以下命令校验:
确保虚拟机的配置包含
memballoon
设备:# virsh dumpxml testguest | grep memballoon <memballoon model='virtio'> </memballoon>
如果此命令显示任何输出,并且型号未设置为
none
,则存在memballoon
设备。确定 ballon 驱动程序正在客户端操作系统中运行。
-
在 Windows 客户机中,驱动程序作为
virtio-win
驱动程序软件包的一部分安装。具体步骤请参阅为 Windows 虚拟机安装半虚拟化 KVM 驱动程序。 -
在 Linux 客户机中,通常默认包含驱动程序,并在存在
memballoon
设备时激活。
-
在 Windows 客户机中,驱动程序作为
流程
可选:获取有关虚拟机的最大内存和当前使用的内存的信息。这将作为您更改的基准,并进行验证。
# virsh dominfo testguest Max memory: 2097152 KiB Used memory: 2097152 KiB
调整分配给虚拟机的最大内存。增加这个值可以提高虚拟机的性能风险,降低这个值会降低虚拟机在主机上的性能占用空间。请注意,此更改只能在关闭的虚拟机上执行,因此调整正在运行的虚拟机需要重新启动才能生效。
例如,将 testguest 虚拟机可以使用的最大内存更改为 4096 MiB:
# virt-xml testguest --edit --memory memory=4096,currentMemory=4096 Domain 'testguest' defined successfully. Changes will take effect after the domain is fully powered off.
要增加正在运行的虚拟机的最大内存,您可以将内存设备附加到虚拟机。这也被称为内存热插拔。详情请参阅将设备附加到虚拟机。
警告不支持从正在运行的虚拟机中删除内存设备(也称为内存热插拔),因此红帽强烈不鼓励这样做。
可选:您还可以调整虚拟机当前使用的内存,最多为最大分配量。这调整了虚拟机在主机上的内存负载,直到下一次重启为止,而不需要更改最大的虚拟机分配。
# virsh setmem testguest --current 2048
验证
确认虚拟机使用的内存已更新:
# virsh dominfo testguest Max memory: 4194304 KiB Used memory: 2097152 KiB
可选:如果您调整了当前虚拟机内存,您可以获取虚拟机的内存气球统计,以评估它如何有效地控制其内存使用。
# virsh domstats --balloon testguest Domain: 'testguest' balloon.current=365624 balloon.maximum=4194304 balloon.swap_in=0 balloon.swap_out=0 balloon.major_fault=306 balloon.minor_fault=156117 balloon.unused=3834448 balloon.available=4035008 balloon.usable=3746340 balloon.last-update=1587971682 balloon.disk_caches=75444 balloon.hugetlb_pgalloc=0 balloon.hugetlb_pgfail=0 balloon.rss=1005456
13.4.3. 使用 virtio-mem 添加和删除虚拟机内存
RHEL 9 提供 virtio-mem
半虚拟化内存设备。此设备可以在虚拟机(VM)中动态添加或删除主机内存。例如,您可以使用 virtio-mem
在运行的虚拟机之间移动内存资源,或者根据您当前的需求在云设置中调整虚拟机内存大小。
13.4.3.1. virtio-mem 概述
virtio-mem
是一个半虚拟化内存设备,可用于在虚拟机中动态添加或删除主机内存。例如,您可以使用这个设备在运行的虚拟机之间移动内存资源,或者根据您当前的要求在云设置中调整虚拟机内存大小。
通过使用 virtio-mem
,您可以将虚拟机的内存增加到超出其初始大小,并将其缩小回其原始大小,单位是 4 到几百兆(MiB)。但请注意,virtio-mem
也依赖于特定的客户机操作系统配置,特别是为了可靠地拔出内存。
virtio-mem 功能限制
virtio-mem
目前与以下功能不兼容:
- 对主机上的实时应用程序使用内存锁定
- 在主机上使用加密的虚拟化
-
在主机上将
virtio-mem
与memballoon
膨胀和收缩合并 -
在虚拟机中卸载或重新载入
virtio_mem
驱动程序 -
使用 vhost-user 设备,但
virtiofs
除外
13.4.3.2. 在虚拟机中配置内存在线
在使用 virtio-mem
将内存附加到正在运行的虚拟机(也称为内存热插拔)之前,您必须配置虚拟机(VM)操作系统,以便可将热插拔内存自动设置为在线状态。否则,客户端操作系统无法使用额外的内存。您可以从以下内存在线的配置中选择:
-
online_movable
-
online_kernel
-
auto-movable
要了解这些配置之间的区别,请参阅:内存在线配置的比较
RHEL 中默认内存在线是使用 udev 规则配置的。但是,在使用 virtio-mem
时,建议直接在内核中配置内存在线。
先决条件
- 主机具有 Intel 64 或 AMD64 CPU 架构。
- 主机使用 RHEL 9.4 或更高版本作为操作系统。
运行在主机上的虚拟机使用以下操作系统版本之一:
RHEL 8.10
重要从正在运行的虚拟机中拔出内存在 RHEL 8.10 虚拟机中默认被禁用。
- RHEL 9
流程
要在虚拟机中设置内存在线,以使用
online_movable
配置:将
memhp_default_state
内核命令行参数设置为online_movable
:# grubby --update-kernel=ALL --remove-args=memhp_default_state --args=memhp_default_state=online_movable
- 重启虚拟机。
要在虚拟机中设置内存在线,以使用
online_kernel
配置:将
memhp_default_state
内核命令行参数设置为online_kernel
:# grubby --update-kernel=ALL --remove-args=memhp_default_state --args=memhp_default_state=online_kernel
- 重启虚拟机。
要在虚拟机中使用
auto-movable
内存在线策略:将
memhp_default_state
内核命令行参数设置为online
:# grubby --update-kernel=ALL --remove-args=memhp_default_state --args=memhp_default_state=online
将
memory_hotplug.online_policy
内核命令行参数设置为auto-movable
:# grubby --update-kernel=ALL --remove-args="memory_hotplug.online_policy" --args=memory_hotplug.online_policy=auto-movable
可选:要进一步调优
auto-movable
在线策略,请更改memory_hotplug.auto_movable_ratio
和memory_hotplug.auto_movable_numa_aware
参数:# grubby --update-kernel=ALL --remove-args="memory_hotplug.auto_movable_ratio" --args=memory_hotplug.auto_movable_ratio=<percentage> # grubby --update-kernel=ALL --remove-args="memory_hotplug.memory_auto_movable_numa_aware" --args=memory_hotplug.auto_movable_numa_aware=<y/n>
-
与可用于任何分配的内存相比,
memory_hotplug.auto_movable_ratio 参数
设置仅可用于可移动分配的最大内存比率。比率以百分比表示,默认值为 301 (%),它是 3:1 的比率。 memory_hotplug.auto_movable_numa_aware
参数控制memory_hotplug.auto_movable_ratio
参数是否应用到跨所有可用 NUMA 节点的内存,或仅应用到单个 NUMA 节点上的内存。默认值为:y (yes)例如,如果最大比率设置为 301%,并且
memory_hotplug.auto_movable_numa_aware
设置为 y (yes),即使在附加了virtio-mem
设备的 NUMA 节点内也应用 3:1 比率。如果参数设置为 n (no),则最大 3:1 比率仅应用于整个 NUMA 节点。另外,如果没有超过比率,则新热插拔内存将只可用于可移动分配。否则,新热拔插内存将同时可用于可移动和不可移动分配。
-
与可用于任何分配的内存相比,
- 重启虚拟机。
验证
要查看
online_movable
配置是否已正确设置,请检查memhp_default_state
内核参数的当前值:# cat /sys/devices/system/memory/auto_online_blocks online_movable
要查看
online_kernel
配置是否已正确设置,请检查memhp_default_state
内核参数的当前值:# cat /sys/devices/system/memory/auto_online_blocks online_kernel
要查看
auto-movable
配置是否已正确设置,请检查以下内核参数:memhp_default_state
:# cat /sys/devices/system/memory/auto_online_blocks online
memory_hotplug.online_policy
:# cat /sys/module/memory_hotplug/parameters/online_policy auto-movable
memory_hotplug.auto_movable_ratio
:# cat /sys/module/memory_hotplug/parameters/auto_movable_ratio 301
memory_hotplug.auto_movable_numa_aware
:# cat /sys/module/memory_hotplug/parameters/auto_movable_numa_aware y
13.4.3.3. 将 virtio-mem 设备附加到虚拟机
要将额外内存附加到正在运行的虚拟机(也称为内存热插拔),之后能够调整热插拔内存的大小,您可以使用 virtio-mem
设备。特别是,您可以使用 libvirt XML 配置文件和 virsh
命令来定义并将 virtio-mem
设备附加到虚拟机(VM)。
先决条件
- 主机具有 Intel 64 或 AMD64 CPU 架构。
- 主机使用 RHEL 9.4 或更高版本作为操作系统。
运行在主机上的虚拟机使用以下操作系统版本之一:
RHEL 8.10
重要从正在运行的虚拟机中拔出内存在 RHEL 8.10 虚拟机中默认被禁用。
- RHEL 9
- 虚拟机配置了内存在线。具体说明,请参阅:在虚拟机中配置内存在线
流程
确保目标虚拟机的 XML 配置包含
maxMemory
参数:# virsh edit testguest1 <domain type='kvm'> <name>testguest1</name> ... <maxMemory unit='GiB'>128</maxMemory> ... </domain>
在本例中,
testguest1
虚拟机的 XML 配置定义了一个maxMemory
参数,其大小为 128 G(GiB)。maxMemory
大小指定虚拟机可以使用的最大内存,其包括初始内存和热插拔内存。创建并打开 XML 文件,来在主机上定义
virtio-mem
设备,例如:# vim virtio-mem-device.xml
在文件中添加
virtio-mem
设备的 XML 定义并保存:<memory model='virtio-mem'> <target> <size unit='GiB'>48</size> <node>0</node> <block unit='MiB'>2</block> <requested unit='GiB'>16</requested> <current unit='GiB'>16</current> </target> <alias name='ua-virtiomem0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </memory> <memory model='virtio-mem'> <target> <size unit='GiB'>48</size> <node>1</node> <block unit='MiB'>2</block> <requested unit='GiB'>0</requested> <current unit='GiB'>0</current> </target> <alias name='ua-virtiomem1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </memory>
在本例中,使用以下参数定义了两个
virtio-mem
设备:-
size
:这是设备的最大大小。在示例中,它是 48 GiB。size
必须是block
大小的倍数。 -
node
:这是为virtio-mem
设备分配的 vNUMA 节点。 -
block
:这是设备的块大小。它必须至少是 Transparent Huge Page (THP)的大小,在 Intel 64 或 AMD64 CPU 架构上它是 2 MiB。Intel 64 或 AMD64 架构上的 2 MiB 块大小通常是好的默认选择。当使用带有 虚拟功能 I/O(VFIO) 或 中介设备(mdev) 的virtio-mem
时,跨所有virtio-mem
设备的总块数不能大于 32768,否则 RAM 的插入可能会失败。 -
requested
:这是您附加到具有virtio-mem
设备的虚拟机的内存量。但是,它只对虚拟机的请求,可能无法成功解决,例如如果虚拟机没有正确配置。requested
大小必须是block
大小的倍数,且不能超过定义的size
最大值。 -
current
:这代表提供给虚拟机的当前virtio-mem
设备的大小。current
大小可能与requested
不同,例如当请求无法完成或重启虚拟机时。 alias
:这是一个可选d 用户定义的别名,您可用来指定预期的virtio-mem
设备,例如使用 libvirt 命令编辑设备时。libvirt 中所有用户定义的别名必须以 "ua-" 前缀开头。除了这些特定的参数外,
libvirt
像处理任何其他 PCI 设备一样处理virtio-mem
设备。
-
使用 XML 文件将定义的
virtio-mem
设备附加到虚拟机。例如,要将virtio-mem-device.xml
中定义的两个设备永久附加到正在运行的testguest1
虚拟机:# virsh attach-device testguest1 virtio-mem-device.xml --live --config
--live
选项仅将设备附加到正在运行的虚拟机,在引导间不持久。--config
选项使配置更改持久。您还可以将设备附加到没有--live
选项的关闭的虚拟机。可选:要动态更改附加到正在运行的虚拟机的
请求的
virtio-mem
设备的大小,请使用virsh update-memory-device
命令:# virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 4GiB
在本例中:
-
testguest1
是您要更新的虚拟机。 -
--alias ua-virtiomem0
是之前由定义的别名指定的virtio-mem
设备。 --requested-size 4GiB
将virtio-mem
设备的requested
大小更改为 4 GiB。警告通过减少
requested
大小,从正在运行的虚拟机中拔出内存可能不可靠。此过程是否成功取决于各种因素,如所使用的内存在线策略。在某些情况下,客户机操作系统无法成功完成请求,因为当时无法更改热插拔内存量。
另外,从正在运行的虚拟机中拔出内存在 RHEL 8.10 虚拟机中默认被禁用。
-
可选:要从关闭的虚拟机中拔出
virtio-mem
设备,请使用virsh detach-device
命令:# virsh detach-device testguest1 virtio-mem-device.xml
可选:要从正在运行的虚拟机中拔出
virtio-mem
设备:将
virtio-mem
设备的requested
大小改为 0,否则尝试从正在运行的虚拟机中拔出virtio-mem
设备将失败。# virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 0
从正在运行的虚拟机中拔出
virtio-mem
设备:# virsh detach-device testguest1 virtio-mem-device.xml
验证
在虚拟机中,检查可用的 RAM ,并查看总内存现在是否包含热插拔内存:
# free -h total used free shared buff/cache available Mem: 31Gi 5.5Gi 14Gi 1.3Gi 11Gi 23Gi Swap: 8.0Gi 0B 8.0Gi
# numactl -H available: 1 nodes (0) node 0 cpus: 0 1 2 3 4 5 6 7 node 0 size: 29564 MB node 0 free: 13351 MB node distances: node 0 0: 10
也可以通过显示正在运行的虚拟机的 XML 配置来查看主机上当前的插入的 RAM 量:
# virsh dumpxml testguest1 <domain type='kvm'> <name>testguest1</name> ... <currentMemory unit='GiB'>31</currentMemory> ... <memory model='virtio-mem'> <target> <size unit='GiB'>48</size> <node>0</node> <block unit='MiB'>2</block> <requested unit='GiB'>16</requested> <current unit='GiB'>16</current> </target> <alias name='ua-virtiomem0'/> <address type='pci' domain='0x0000' bus='0x08' slot='0x00' function='0x0'/> ... </domain>
在本例中:
-
<currentMemory unit='GiB'>31</currentMemory>
代表虚拟机中所有源的可用 RAM 总量。 -
<current unit='GiB'>16</current>
代表virtio-mem
设备提供的插入的 RAM 的当前大小。
-
其他资源
13.4.3.4. 内存在线配置的比较
将内存附加到正在运行的 RHEL 虚拟机(也称为内存热插拔)时,您必须在虚拟机(VM)操作系统中将热插拔内存设置为在线状态。否则,系统将无法使用内存。
下表总结了在可用内存在线配置间选择时的主要注意事项。
配置名称 | 从虚拟机中拔出内存 | 创建内存区不平衡的风险 | 一个潜在的用例 | 预期工作负载的内存要求 |
---|---|---|---|---|
| 热插内存可以可靠地拔出。 | 是 | 热插拔相对较少的内存 | 主要是用户空间内存 |
| 热插内存的可移动部分可以可靠地拔出。 | 最小 | 热插拔大量内存 | 主要是用户空间内存 |
| 热插拔内存无法可靠地拔出。 | 否 | 不可靠内存拔出是可以接受的。 | 用户空间或内核空间内存 |
区域不平衡 是某个 Linux 内存区域中缺少可用内存页。区域不平衡 会对系统性能造成负面影响。例如,如果内核用完了不可移动分配的可用内存,则内核可能会崩溃。通常,可移动分配主要包含用户空间内存页,不可移动分配主要包含内核空间内存页。
其他资源
13.4.4. 其他资源
- 将设备附加到虚拟机将设备附加到虚拟机。
13.5. 优化虚拟机 I/O 性能
虚拟机 (VM) 的输入和输出 (I/O) 能力可能会显著限制虚拟机的整体效率。要解决这个问题,您可以通过配置块 I/O 参数来优化虚拟机的 I/O。
13.5.1. 在虚拟机中调整块 I/O
当一个或多个虚拟机正在使用多个块设备时,可能需要通过修改虚拟设备的 I/O 优先级来调整虚拟设备的 I/O 权重。
增加设备的 I/O 权重会增加设备的 I/O 带宽的优先级,从而为它提供更多主机资源。同样的,降低设备的权重可使其消耗较少的主机资源。
每个设备的 weight
值必须在 100
到 1000
之间。或者,该值可以是 0
,它会从每个设备列表中删除该设备。
流程
显示和设置虚拟机的块 I/O 参数:
显示虚拟机当前的
<blkio>
参数:# virsh dumpxml VM-name
<domain> [...] <blkiotune> <weight>800</weight> <device> <path>/dev/sda</path> <weight>1000</weight> </device> <device> <path>/dev/sdb</path> <weight>500</weight> </device> </blkiotune> [...] </domain>
编辑指定设备的 I/O 加权:
# virsh blkiotune VM-name --device-weights device, I/O-weight
例如,以下命令将 testguest1 虚拟机中 /dev/sda 设备的权重改为 500。
# virsh blkiotune testguest1 --device-weights /dev/sda, 500
13.5.2. 虚拟机中的磁盘 I/O 节流
当多个虚拟机同时运行时,它们可能会使用过量的磁盘 I/O 而干扰系统性能。KVM 虚拟化中的磁盘 I/O 节流使得能够对从虚拟机发送到主机的磁盘 I/O 请求设定限制。这可以防止虚拟机过度使用共享资源并影响其他虚拟机的性能。
要启用磁盘 I/O 节流,请对从附加到虚拟机的每个块设备发送给主机的磁盘 I/O 请求设置限制。
流程
使用
virsh domblklist
命令列出指定虚拟机上所有磁盘设备的名称。# virsh domblklist rollin-coal Target Source ------------------------------------------------ vda /var/lib/libvirt/images/rollin-coal.qcow2 sda - sdb /home/horridly-demanding-processes.iso
找到您要节流的虚拟磁盘挂载的主机块设备。
例如,如果您想要从上一步中节流
sdb
虚拟磁盘,以下输出显示该磁盘挂载在/dev/nvme0n1p3
分区上。$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT zram0 252:0 0 4G 0 disk [SWAP] nvme0n1 259:0 0 238.5G 0 disk ├─nvme0n1p1 259:1 0 600M 0 part /boot/efi ├─nvme0n1p2 259:2 0 1G 0 part /boot └─nvme0n1p3 259:3 0 236.9G 0 part └─luks-a1123911-6f37-463c-b4eb-fxzy1ac12fea 253:0 0 236.9G 0 crypt /home
使用
virsh blkiotune
命令为块设备设置 I/O 限制。# virsh blkiotune VM-name --parameter device,limit
以下示例将
rollin-coal
上的sdb
磁盘节流为每秒 1000 个读写 I/O 操作,每秒的读写 I/O 操作吞吐量 50 MB。# virsh blkiotune rollin-coal --device-read-iops-sec /dev/nvme0n1p3,1000 --device-write-iops-sec /dev/nvme0n1p3,1000 --device-write-bytes-sec /dev/nvme0n1p3,52428800 --device-read-bytes-sec /dev/nvme0n1p3,52428800
附加信息
- 磁盘 I/O 节流可用于各种情况,例如,当属于不同客户的虚拟机在同一台主机上运行时,或者为不同的虚拟机提供服务质量保障时。磁盘 I/O 节流还可用来模拟较慢的磁盘。
- I/O 节流可以独立应用于附加到虚拟机的每个块设备,并支持对吞吐量和 I/O 操作的限制。
-
红帽不支持使用
virsh blkdeviotune
命令来在 VM 中配置 I/O 节流。有关使用 RHEL 9 作为虚拟机主机时不支持的功能的更多信息,请参阅 RHEL 9 虚拟化中不支持的功能。
13.5.3. 启用多队列 virtio-scsi
在虚拟机 (VM) 中使用 virtio-scsi
存储设备时,multi-queue virtio-scsi 特性可提高存储性能和可扩展性。它允许每个虚拟 CPU (vCPU) 使用单独的队列和中断,而不影响其他 vCPU。
流程
要为特定虚拟机启用 multi-queue virtio-scsi 支持,请在虚拟机的 XML 配置中添加以下内容,其中 N 是 vCPU 队列的总数:
<controller type='scsi' index='0' model='virtio-scsi'> <driver queues='N' /> </controller>
13.6. 优化虚拟机 CPU 性能
与主机中的物理 CPU 非常相似,vCPU 对虚拟机 (VM) 性能至关重要。因此,优化 vCPU 会对虚拟机的资源效率产生重大影响。优化 vCPU:
- 调整分配给虚拟机的主机 CPU 数。您可以使用 CLI 或 Web 控制台进行此操作。
确保 vCPU 模型与主机的 CPU 型号一致。例如,将 testguest1 虚拟机设置为使用主机的 CPU 型号:
# virt-xml testguest1 --edit --cpu host-model
在 ARM 64 系统上,请使用
--cpu host-passthrough
。- 管理内核相同的页面合并 (KSM) 。
如果您的主机使用非统一内存访问 (NUMA) ,您也可以为其虚拟机 配置 NUMA。这会尽可能将主机的 CPU 和内存进程映射到虚拟机的 CPU 和内存进程上。实际上,NUMA 调优为 vCPU 提供了对分配给虚拟机的系统内存更精简的访问,这可以提高 vCPU 的处理效率。
详情请参阅 在虚拟机中配置 NUMA 和 vCPU 性能调整场景示例 。
13.6.1. 使用命令行界面添加和删除虚拟 CPU
要提高或优化虚拟机 (VM) 的 CPU 性能,您可以添加或删除分配给虚拟机的虚拟 CPU (vCPU) 。
当在运行的虚拟机上执行时,这也被称为 vCPU 热插和热拔。但请注意,RHEL 9 不支持 vCPU 热拔,红帽不建议使用它。
先决条件
可选:查看目标虚拟机中 vCPU 的当前状态。例如,要显示 testguest 虚拟机上 vCPU 的数量:
# virsh vcpucount testguest maximum config 4 maximum live 2 current config 2 current live 1
此输出显示 testguest 目前使用 1 个 vCPU,另外 1 个 vCPu 可以热插入以提高虚拟机性能。但是,重新引导后,vCPU testguest 使用的数量会改为 2,而且能够热插 2 个 vCPU。
流程
调整可以附加到虚拟机的最大 vCPU 数量,其在虚拟机下次启动时生效。
例如,要将 testguest 虚拟机的最大 vCPU 数量增加到 8:
# virsh setvcpus testguest 8 --maximum --config
请注意,最大值可能会受 CPU 拓扑、主机硬件、hypervisor 和其他因素的限制。
将当前附加到虚拟机的 vCPU 数量调整到上一步中配置的最大值。例如:
将附加到正在运行的 testguest 虚拟机的 vCPU 数量增加到 4:
# virsh setvcpus testguest 4 --live
这会增加虚拟机的性能和主机的 testguest 负载占用,直到虚拟机下次引导为止。
将附加到 testguest 虚拟机的 vCPU 数量永久减少至 1:
# virsh setvcpus testguest 1 --config
这会降低虚拟机的性能和 testguest 的主机负载占用。但是,如果需要可热插入虚拟机以暂时提高性能。
验证
确认虚拟机的 vCPU 的当前状态反映了您的更改。
# virsh vcpucount testguest maximum config 8 maximum live 4 current config 1 current live 4
其他资源
13.6.2. 使用 Web 控制台管理虚拟 CPU
通过使用 RHEL 9 web 控制台,您可以查看并配置 web 控制台连接的虚拟机所使用的虚拟 CPU。
先决条件
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
- Web 控制台 VM 插件 已安装在您的系统上。
流程
登录到 RHEL 9 web 控制台。
详情请参阅 登录到 web 控制台。
在
界面中,点您要查看其信息的虚拟机。此时将打开一个新页面,其中包含关于所选虚拟机基本信息的概述部分,以及用于访问虚拟机的图形界面的控制台部分。
点概述窗格中 vCPU 数旁边的
。此时会出现 vCPU 详情对话框。
为所选虚拟机配置虚拟 CPU。
vCPU 数量 - 当前正在使用的 vCPU 数量。
注意vCPU 数量不能超过 vCPU 的最大值。
- vCPU 最大 - 可为虚拟机配置的最大虚拟 CPU 数。如果这个值大于 vCPU Count,可以为虚拟机附加额外的 vCPU。
- 插槽 - 向虚拟机公开的插槽数量。
- 每个插槽的内核数 - 向虚拟机公开的每个插槽的内核数。
每个内核的线程数 - 向虚拟机公开的每个内核的线程数。
请注意, 插槽、每个插槽的内核数和每个内核的线程数选项调整了虚拟机的 CPU 拓扑。这可能对 vCPU 性能有好处,但可能会影响客户机操作系统中某些软件的功能。如果您的部署不需要不同的设置,请保留默认值。
点
。配置了虚拟机的虚拟 CPU。
注意对虚拟 CPU 设置的更改仅在重启虚拟机后生效。
其他资源
13.6.3. 在虚拟机中配置 NUMA
以下方法可用于在 RHEL 9 主机上配置虚拟机 (VM) 的非一致性内存访问 (NUMA) 设置。
先决条件
主机是一个与 NUMA 兼容的机器。要检测是否是这种情况,请使用
virsh nodeinfo
命令,并查看NUMA cell (s)
行:# virsh nodeinfo CPU model: x86_64 CPU(s): 48 CPU frequency: 1200 MHz CPU socket(s): 1 Core(s) per socket: 12 Thread(s) per core: 2 NUMA cell(s): 2 Memory size: 67012964 KiB
如果行的值为 2 或更高,则主机与 NUMA 兼容。
流程
为便于使用,您可以使用自动化工具和服务设置虚拟机的 NUMA 配置。但是,手动 NUMA 设置可能会显著提高性能。
自动方法
将虚拟机的 NUMA 策略设为
Preferred
。例如,对于 testguest5 虚拟机要这样做:# virt-xml testguest5 --edit --vcpus placement=auto # virt-xml testguest5 --edit --numatune mode=preferred
在主机上启用自动 NUMA 均衡:
# echo 1 > /proc/sys/kernel/numa_balancing
启动
numad
服务,来自动将 VM CPU 与内存资源对齐。# systemctl start numad
手动方法
将特定 vCPU 线程固定到特定主机 CPU 或者 CPU 范围。在非 NUMA 主机和虚拟机上也可以这样做,我们推荐您使用一种安全的方法来提高 vCPU 性能。
例如,以下命令将 testguest6 虚拟机的 vCPU 线程 0 到 5 分别固定到主机 CPU 1、3、5、7、9 和 11:
# virsh vcpupin testguest6 0 1 # virsh vcpupin testguest6 1 3 # virsh vcpupin testguest6 2 5 # virsh vcpupin testguest6 3 7 # virsh vcpupin testguest6 4 9 # virsh vcpupin testguest6 5 11
之后,您可以验证操作是否成功:
# virsh vcpupin testguest6 VCPU CPU Affinity ---------------------- 0 1 1 3 2 5 3 7 4 9 5 11
固定 vCPU 线程后,您还可以将与指定虚拟机关联的 QEMU 进程线程固定到特定的主机 CPU 或 CPU 范围。例如:以下命令将 testguest6 的 QEMU 进程线程 固定到 CPU 13 和 15,确认成功:
# virsh emulatorpin testguest6 13,15 # virsh emulatorpin testguest6 emulator: CPU Affinity ---------------------------------- *: 13,15
最后,您也可以指定将哪些主机 NUMA 节点专门分配给某个虚拟机。这可提高虚拟机 vCPU 的主机内存用量。例如,以下命令将 testguest6 设置为使用主机 NUMA 节点 3 到 5,确认成功:
# virsh numatune testguest6 --nodeset 3-5 # virsh numatune testguest6
为了获得最佳性能,建议使用以上列出的所有手动调优方法
其他资源
- vCPU 性能调整场景示例
-
使用
numastat
程序查看系统的当前 NUMA 配置
13.6.4. vCPU 性能调整场景示例
要获得最佳 vCPU 性能,红帽建议同时使用手动 vcpupin
、emulatorpin
和 numatune
设置,例如在以下场景中。
起始场景
您的主机有以下与硬件相关的信息:
- 2 个 NUMA 节点
- 每个节点上的 3 个 CPU 内核
- 每个内核有 2 个线程
此类机器的
virsh nodeinfo
输出类似于:# virsh nodeinfo CPU model: x86_64 CPU(s): 12 CPU frequency: 3661 MHz CPU socket(s): 2 Core(s) per socket: 3 Thread(s) per core: 2 NUMA cell(s): 2 Memory size: 31248692 KiB
您打算将现有的虚拟机修改为有 8 个 vCPU,这意味着单个 NUMA 节点无法容纳它。
因此,您应该在每个 NUMA 节点上分发 4 个 vCPU,并使 vCPU 拓扑尽可能接近主机拓扑。这意味着,作为给定物理 CPU 的同级线程运行的 vCPU 应该固定到同一核上的主机线程。详情请查看以下解决方案:
解决方案
获取有关主机拓扑的信息:
# virsh capabilities
输出应包含类似如下的部分:
<topology> <cells num="2"> <cell id="0"> <memory unit="KiB">15624346</memory> <pages unit="KiB" size="4">3906086</pages> <pages unit="KiB" size="2048">0</pages> <pages unit="KiB" size="1048576">0</pages> <distances> <sibling id="0" value="10" /> <sibling id="1" value="21" /> </distances> <cpus num="6"> <cpu id="0" socket_id="0" core_id="0" siblings="0,3" /> <cpu id="1" socket_id="0" core_id="1" siblings="1,4" /> <cpu id="2" socket_id="0" core_id="2" siblings="2,5" /> <cpu id="3" socket_id="0" core_id="0" siblings="0,3" /> <cpu id="4" socket_id="0" core_id="1" siblings="1,4" /> <cpu id="5" socket_id="0" core_id="2" siblings="2,5" /> </cpus> </cell> <cell id="1"> <memory unit="KiB">15624346</memory> <pages unit="KiB" size="4">3906086</pages> <pages unit="KiB" size="2048">0</pages> <pages unit="KiB" size="1048576">0</pages> <distances> <sibling id="0" value="21" /> <sibling id="1" value="10" /> </distances> <cpus num="6"> <cpu id="6" socket_id="1" core_id="3" siblings="6,9" /> <cpu id="7" socket_id="1" core_id="4" siblings="7,10" /> <cpu id="8" socket_id="1" core_id="5" siblings="8,11" /> <cpu id="9" socket_id="1" core_id="3" siblings="6,9" /> <cpu id="10" socket_id="1" core_id="4" siblings="7,10" /> <cpu id="11" socket_id="1" core_id="5" siblings="8,11" /> </cpus> </cell> </cells> </topology>
- 可选:使用 适用的工具 测试虚拟机的性能。
在主机上设置并挂载 1 GiB 巨页:
注意1 GiB 巨页可能在某些架构和配置上不提供,如 ARM 64 主机。
在主机的内核命令行中添加以下行:
default_hugepagesz=1G hugepagesz=1G
使用以下内容创建
/etc/systemd/system/hugetlb-gigantic-pages.service
文件:[Unit] Description=HugeTLB Gigantic Pages Reservation DefaultDependencies=no Before=dev-hugepages.mount ConditionPathExists=/sys/devices/system/node ConditionKernelCommandLine=hugepagesz=1G [Service] Type=oneshot RemainAfterExit=yes ExecStart=/etc/systemd/hugetlb-reserve-pages.sh [Install] WantedBy=sysinit.target
使用以下内容创建
/etc/systemd/hugetlb-reserve-pages.sh
文件:#!/bin/sh nodes_path=/sys/devices/system/node/ if [ ! -d $nodes_path ]; then echo "ERROR: $nodes_path does not exist" exit 1 fi reserve_pages() { echo $1 > $nodes_path/$2/hugepages/hugepages-1048576kB/nr_hugepages } reserve_pages 4 node1 reserve_pages 4 node2
这会从 node1 保留 4 个 1GiB 巨页,并在 node2 中保留 4 个 1GiB 巨页。
使在上一步中创建的脚本可执行:
# chmod +x /etc/systemd/hugetlb-reserve-pages.sh
在引导时启用巨页保留:
# systemctl enable hugetlb-gigantic-pages
使用
virsh edit
命令编辑您要优化的虚拟机的 XML 配置,在本例中为 super-VM :# virsh edit super-vm
用以下方法调整虚拟机的 XML 配置:
-
将虚拟机设置为使用 8 个静态 vCPU。使用
<vcpu/>
元素来执行此操作。 将每个 vCPU 线程固定到拓扑中镜像的对应主机 CPU 线程。为此,请在
<cputune>
部分中使用<vcpupin/>
元素。请注意,如上面
virsh capabilities
工具所示,主机 CPU 线程在各自的内核中不是按顺序排序的。此外,vCPU 线程应固定到同一 NUMA 节点上最多可用的主机核集合。有关表图,请查看以下 示例拓扑 部分。步骤 a. 和 b. 的 XML 配置类似:
<cputune> <vcpupin vcpu='0' cpuset='1'/> <vcpupin vcpu='1' cpuset='4'/> <vcpupin vcpu='2' cpuset='2'/> <vcpupin vcpu='3' cpuset='5'/> <vcpupin vcpu='4' cpuset='7'/> <vcpupin vcpu='5' cpuset='10'/> <vcpupin vcpu='6' cpuset='8'/> <vcpupin vcpu='7' cpuset='11'/> <emulatorpin cpuset='6,9'/> </cputune>
将虚拟机设置为使用 1 GiB 巨页:
<memoryBacking> <hugepages> <page size='1' unit='GiB'/> </hugepages> </memoryBacking>
配置虚拟机的 NUMA 节点,使其使用主机上对应的 NUMA 节点的内存。要做到这一点,请在
<numatune/>
部分中使用<memnode/>
元素:<numatune> <memory mode="preferred" nodeset="1"/> <memnode cellid="0" mode="strict" nodeset="0"/> <memnode cellid="1" mode="strict" nodeset="1"/> </numatune>
确保 CPU 模式设为
host-passthrough
,且 CPU 在passthrough
模式下使用缓存:<cpu mode="host-passthrough"> <topology sockets="2" cores="2" threads="2"/> <cache mode="passthrough"/>
在 ARM 64 系统上,省略
<cache mode="passthrough"/>
行。
-
将虚拟机设置为使用 8 个静态 vCPU。使用
验证
确认生成的虚拟机 XML 配置包含类似如下内容:
[...] <memoryBacking> <hugepages> <page size='1' unit='GiB'/> </hugepages> </memoryBacking> <vcpu placement='static'>8</vcpu> <cputune> <vcpupin vcpu='0' cpuset='1'/> <vcpupin vcpu='1' cpuset='4'/> <vcpupin vcpu='2' cpuset='2'/> <vcpupin vcpu='3' cpuset='5'/> <vcpupin vcpu='4' cpuset='7'/> <vcpupin vcpu='5' cpuset='10'/> <vcpupin vcpu='6' cpuset='8'/> <vcpupin vcpu='7' cpuset='11'/> <emulatorpin cpuset='6,9'/> </cputune> <numatune> <memory mode="preferred" nodeset="1"/> <memnode cellid="0" mode="strict" nodeset="0"/> <memnode cellid="1" mode="strict" nodeset="1"/> </numatune> <cpu mode="host-passthrough"> <topology sockets="2" cores="2" threads="2"/> <cache mode="passthrough"/> <numa> <cell id="0" cpus="0-3" memory="2" unit="GiB"> <distances> <sibling id="0" value="10"/> <sibling id="1" value="21"/> </distances> </cell> <cell id="1" cpus="4-7" memory="2" unit="GiB"> <distances> <sibling id="0" value="21"/> <sibling id="1" value="10"/> </distances> </cell> </numa> </cpu> </domain>
- 可选:使用 适用的工具和 测试虚拟机的性能,以评估虚拟机优化的影响。
拓扑示例
下表演示了 vCPU 和主机 CPU 之间的连接:
表 13.2. 主机拓扑 CPU 线程
0
3
1
4
2
5
6
9
7
10
8
11
内核
0
1
2
3
4
5
插槽
0
1
NUMA 节点
0
1
表 13.3. VM 拓扑 vCPU 线程
0
1
2
3
4
5
6
7
内核
0
1
2
3
插槽
0
1
NUMA 节点
0
1
表 13.4. 合并主机和虚拟机拓扑 vCPU 线程
0
1
2
3
4
5
6
7
主机 CPU 线程
0
3
1
4
2
5
6
9
7
10
8
11
内核
0
1
2
3
4
5
插槽
0
1
NUMA 节点
0
1
在这种情况下,有 2 个 NUMA 节点和 8 个 vCPU。因此,应该为每个节点固定 4 个 vCPU 线程。
另外,红帽建议在每个节点上至少保留一个 CPU 线程用于主机系统操作。
因为在这个示例中,每个 NUMA 节点都有 3 个核,每个核都有 2 个主机 CPU 线程,节点 0 的设置转换如下:
<vcpupin vcpu='0' cpuset='1'/> <vcpupin vcpu='1' cpuset='4'/> <vcpupin vcpu='2' cpuset='2'/> <vcpupin vcpu='3' cpuset='5'/>
13.6.5. 管理内核相同的页面合并
内核同页合并 (KSM) 通过在虚拟机 (VM) 间共享相同的内存页面来提高内存密度。但是,启用 KSM 会增加 CPU 使用率,并可能会根据工作负载对整体性能造成负面影响。
根据具体要求,您可以为单个会话启用或禁用 KSM,或者永久禁用 KSM。
在 RHEL 9 及更高版本中,默认禁用 KSM。
先决条件
- 对主机系统有根访问权限。
流程
禁用 KSM:
要对单个会话停用 KSM,请使用
systemctl
工具停止ksm
和ksmtuned
服务。# systemctl stop ksm # systemctl stop ksmtuned
要永久停用 KSM,请使用
systemctl
工具来禁用ksm
和ksmtuned
服务。# systemctl disable ksm Removed /etc/systemd/system/multi-user.target.wants/ksm.service. # systemctl disable ksmtuned Removed /etc/systemd/system/multi-user.target.wants/ksmtuned.service.
取消激活 KSM 前在虚拟机间共享的内存页将保持共享。要停止共享,请使用以下命令删除系统中的所有 PageKSM
页:
# echo 2 > /sys/kernel/mm/ksm/run
匿名页面替换了 KSM 页面后,khugepaged
内核服务将在虚拟机物理内存中重建透明的大页面。
- 启用 KSM:
启用 KSM 会增加 CPU 使用率并影响整体 CPU 性能。
安装
ksmtuned
服务:# dnf install ksmtuned
启动服务:
要为单个会话启用 KSM,请使用
systemctl
程序启动ksm
和ksmtuned
服务。# systemctl start ksm # systemctl start ksmtuned
要永久启用 KSM,请使用
systemctl
程序启用ksm
和ksmtuned
服务。# systemctl enable ksm Created symlink /etc/systemd/system/multi-user.target.wants/ksm.service → /usr/lib/systemd/system/ksm.service # systemctl enable ksmtuned Created symlink /etc/systemd/system/multi-user.target.wants/ksmtuned.service → /usr/lib/systemd/system/ksmtuned.service
13.7. 优化虚拟机网络性能
由于虚拟机的网络接口卡 (NIC) 的虚拟性质,虚拟机会丢失其分配的主机网络带宽的一部分,这可以降低虚拟机的整体工作负载效率。以下提示可最大程度降低虚拟化对虚拟 NIC (vNIC) 吞吐量的负面影响。
流程
使用以下任一方法并观察它是否对虚拟机网络性能有帮助:
- 启用 vhost_net 模块
在主机上,确保启用了
vhost_net
内核特性:# lsmod | grep vhost vhost_net 32768 1 vhost 53248 1 vhost_net tap 24576 1 vhost_net tun 57344 6 vhost_net
如果这个命令的输出为空,请启用
vhost_net
内核模块:# modprobe vhost_net
- 设置 multi-queue virtio-net
要为虚拟机设置 multi-queue virtio-net 特性,请使用
virsh edit
命令来编辑虚拟机的 XML 配置。在 XML 中,将以下内容添加到<devices>
部分,并将N
替换为虚拟机中的 vCPU 个数,最多 16 个:<interface type='network'> <source network='default'/> <model type='virtio'/> <driver name='vhost' queues='N'/> </interface>
如果虚拟机正在运行,重启它以使更改生效。
- 批量网络数据包
在具有长传输路径的 Linux VM 配置中,在将数据包提交给内核之前对其进行批处理可以提高缓存利用率。要设置数据包批处理,请在主机上使用以下命令,并将 tap0 替换为虚拟机使用的网络接口的名称:
# ethtool -C tap0 rx-frames 64
- SR-IOV
- 如果您的主机 NIC 支持 SR-IOV,请为您的 vNIC 使用 SR-IOV 设备分配。如需更多信息,请参阅管理 SR-IOV 设备。
其他资源
13.8. 虚拟机性能监控工具
要确定什么消耗了最多的 VM 资源,以及虚拟机性能的哪方面需要优化,可以使用性能诊断工具,包括通用的和特定于虚拟机的。
默认操作系统性能监控工具
对于标准性能评估,您可以使用主机和虚拟机操作系统默认提供的实用程序:
在 RHEL 9 主机上,以 root 用户身份使用
top
实用程序或 系统监控 应用程序,并在输出中查找qemu
和virt
。这显示了您的虚拟机消耗的主机系统资源量。-
如果监控工具显示任何
qemu
或virt
进程消耗了大量的主机 CPU 或内存量,请使用perf
工具进行调查。详情请查看以下信息。 -
另外,如果
vhost_net
线程进程(如 vhost_net-1234 )被显示为消耗大量主机 CPU 容量,请考虑使用 虚拟网络优化功能,如multi-queue virtio-net
。
-
如果监控工具显示任何
在客户机操作系统上,使用系统上可用的性能工具和应用程序来评估哪些进程消耗了最多的系统资源。
-
在 Linux 系统上,您可以使用
top
工具。 - 在 Windows 系统中,您可以使用 Task Manager 应用程序。
-
在 Linux 系统上,您可以使用
perf kvm
您可以使用 perf
实用程序收集有关 RHEL 9 主机性能的特定虚拟化统计。要做到这一点:
在主机上安装 perf 软件包:
# dnf install perf
使用
perf kvm stat
命令之一来显示您的虚拟化主机的 perf 统计信息:-
若要实时监控 hypervisor ,请使用
perf kvm stat live
命令。 -
要记录一段时间内 hypervisor 的 perf 数据,请使用
perf kvm stat record
命令激活日志记录。在命令被取消或中断后,数据保存在perf.data.guest
文件中,可以使用perf kvm stat report
命令进行分析。
-
若要实时监控 hypervisor ,请使用
分析
VM-EXIT
事件类型及其分发的perf
输出。例如,PAUSE_INSTRUCTION
事件应当不常发生,但在以下输出中,此事件的频繁发生表明主机 CPU 没有很好地处理正在运行的 vCPU。在这种场景下,请考虑关闭某些处于活动状态的虚拟机,从这些虚拟机中删除 vCPU,或者 调优 vCPU 的性能。# perf kvm stat report Analyze events for all VMs, all VCPUs: VM-EXIT Samples Samples% Time% Min Time Max Time Avg time EXTERNAL_INTERRUPT 365634 31.59% 18.04% 0.42us 58780.59us 204.08us ( +- 0.99% ) MSR_WRITE 293428 25.35% 0.13% 0.59us 17873.02us 1.80us ( +- 4.63% ) PREEMPTION_TIMER 276162 23.86% 0.23% 0.51us 21396.03us 3.38us ( +- 5.19% ) PAUSE_INSTRUCTION 189375 16.36% 11.75% 0.72us 29655.25us 256.77us ( +- 0.70% ) HLT 20440 1.77% 69.83% 0.62us 79319.41us 14134.56us ( +- 0.79% ) VMCALL 12426 1.07% 0.03% 1.02us 5416.25us 8.77us ( +- 7.36% ) EXCEPTION_NMI 27 0.00% 0.00% 0.69us 1.34us 0.98us ( +- 3.50% ) EPT_MISCONFIG 5 0.00% 0.00% 5.15us 10.85us 7.88us ( +- 11.67% ) Total Samples:1157497, Total events handled time:413728274.66us.
perf kvm stat
输出中表明有问题的其它事件类型包括:-
INSN_EMULATION
- 建议次优化的 虚拟机 I/O 配置 。
-
有关使用 perf
监控虚拟化性能的更多信息,请参阅您系统上的 perf-kvm
手册页。
numastat
要查看系统当前的 NUMA 配置,您可以使用 numastat
工具,该工具通过安装 numactl 软件包来提供。
以下显示了一个有 4 个运行虚拟机的主机,各自从多个 NUMA 节点获取内存。这不是 vCPU 性能的最佳方案,并保证调整:
# numastat -c qemu-kvm
Per-node process memory usage (in MBs)
PID Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total
--------------- ------ ------ ------ ------ ------ ------ ------ ------ -----
51722 (qemu-kvm) 68 16 357 6936 2 3 147 598 8128
51747 (qemu-kvm) 245 11 5 18 5172 2532 1 92 8076
53736 (qemu-kvm) 62 432 1661 506 4851 136 22 445 8116
53773 (qemu-kvm) 1393 3 1 2 12 0 0 6702 8114
--------------- ------ ------ ------ ------ ------ ------ ------ ------ -----
Total 1769 463 2024 7462 10037 2672 169 7837 32434
相反,以下显示单个节点为每个虚拟机提供内存,这效率显著提高。
# numastat -c qemu-kvm
Per-node process memory usage (in MBs)
PID Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total
--------------- ------ ------ ------ ------ ------ ------ ------ ------ -----
51747 (qemu-kvm) 0 0 7 0 8072 0 1 0 8080
53736 (qemu-kvm) 0 0 7 0 0 0 8113 0 8120
53773 (qemu-kvm) 0 0 7 0 0 0 1 8110 8118
59065 (qemu-kvm) 0 0 8050 0 0 0 0 0 8051
--------------- ------ ------ ------ ------ ------ ------ ------ ------ -----
Total 0 0 8072 0 8072 0 8114 8110 32368
第 14 章 电源管理的重要性
降低计算机系统的整体功耗有助于节省成本。有效地优化每个系统组件的能源消耗包括研究系统执行的不同任务,并配置各个组件以确保其在该作业的性能正确。降低特定组件或整个系统的功耗,可以降低产生的热量并可能会降低性能。
正确的电源管理结果包括:
- 服务器和计算中心的发热的缩减
- 降低辅助成本,包括冷却、空间、电缆、发电机和不间断电源 (UPS)
- 延长笔记本电脑的电池寿命
- 降低二氧化碳的输出
- 满足与绿色 IT 相关的政府法规或法律要求,例如,节能星级
- 使新系统满足公司的要求
这部分论述了有关 Red Hat Enterprise Linux 系统的电源管理的信息。
14.1. 电源管理基础
有效电源管理基于以下原则构建:
闲置 CPU 应该在需要时唤醒
从 Red Hat Enterprise Linux 6 开始,内核以
tickless
方式运行,这意味着,以前使用的定期计时器中断已被按需中断替代。因此,空闲的 CPU 可以在新任务排队进行处理前保持闲置状态,并且已处于较低电源状态的 CPU 可以保持这个状态更长时间。但是,如果您的系统中存在会创建不必要的计时器事件的应用程序时,此功能的好处可能会减少。轮询事件(如检查卷更改或鼠标移动)是此类事件的示例。Red Hat Enterprise Linux 包括您可以使用的工具,您可以根据自己的 CPU 使用量识别和审核应用程序。有关更多信息,请参见审计和分析概述和工具以进行审计。
应该完全禁用未使用的硬件和设备
- 对于存在移动部分的设备(如硬盘)也是如此。除此之外,一些应用程序可能会留下未使用但已启用的设备"打开";当发生这种情况时,内核会假定设备处于使用状态,这样可防止设备进入节能状态。
较少的活动应转代表低的电源消耗
然而,在很多情况下,这取决于现代的硬件以及正确的 BIOS 配置,或在现代系统中使用 UEFI,包括非 x86 架构。确保您的系统使用了最新的官方固件,且在 BIOS 的电源管理或设备配置部分中启用了电源管理功能。要查找的一些功能包括:
- 对 ARM64 的 Collaborative Processor Performance Controls (CPPC) 支持
- IBM Power 系统的 PowerNV 支持
- SpeedStep
- PowerNow!
- Cool’n’Quiet
- ACPI (C-state)
Smart
如果您的硬件对这些功能的支持,且在 BIOS 中启用了它们,Red Hat Enterprise Linux 默认使用它们。
不同的 CPU 状态形式及其影响
现代 CPU 与高级配置和电源接口 (ACPI) 结合会提供不同的电源状态。三个不同的状态是:
- Sleep (C-states)
- Frequency and voltage (P-states)
Heat output (T-states or thermal states)
在以最低的睡眠(sleep)状态中运行的 CPU 会消耗最小的电能,但在需要时也会花费大量时间从该状态唤醒。在非常罕见的情形中,这可能会导致 CPU 在每次将要进入睡眠状态时被立即唤醒。这种情况会导致 CPU 一直处于忙碌状态,并在已使用另一个状态时丧失一些潜在的节能好处。
关闭的机器使用最少电能
- 省电功能的最佳方法是关闭系统。例如,您的公司可以开发一个企业文化,专注于"绿色 IT"感知,例如在午餐休息或下班后关闭机器。您还可以将多个物理服务器整合为一个较大的服务器,并使用 Red Hat Enterprise Linux 提供的虚拟化技术虚拟化它们。
14.2. 审计和分析概述
通常,单个系统的详细手动审计、分析和调优是例外,因为通常要做的时间和成本远远超过了从这些最后一部分系统调节中获得的好处。
但是,对于相似的、可以在所有系统中重复使用相同设置的大量系统,一次执行这些任务可能会非常有用。例如,部署数千台桌面系统,或部署由几乎相同的机器组成的 HPC 集群。进行审核和分析的另一种原因是,您可以创建一个基础,用于在以后比较环境变化造成的影响。对于需要定期更新硬件、BIOS 或软件的环境,此分析结果会非常有帮助,可以帮助避免出现与功耗相关的任何意外情况。通常,全面的审计和分析让您可以更好地了解特定系统中发生的情况。
对于电源消耗,审计和分析系统相对来说比较困难,即使对于大多数现代系统也是如此。大多数系统并不会提供通过软件测量电源使用情况的方法。然而,会存在一些例外:
- Hewlett Packard 服务器系统的 iLO 管理控制台具有一个电源管理模块,您可以通过 Web 访问。
- IBM 在其 BladeCenter 电源管理模块中提供类似的解决方案。
- 在一些 Dell 系统中,IT Assistant 也提供了电源监控功能。
其他供应商可能会为其服务器平台提供类似的功能,但并没有一个统一的解决方案用于所有厂商。通常,通过直接测量功耗来进行节能只会尽力而为。
14.3. 用于审计的工具
Red Hat Enterprise Linux 8 提供用于执行系统审核和分析的工具。如果您想要验证已经发现的内容或需要某些部分的更深入的信息,则它们中的大多数都可以用作补充的信息源。
其中许多工具也用于性能调优,其中包括:
powertop
-
它可识别频繁绕过 CPU 的内核和用户空间应用程序的特定组件。以 root 用户身份使用
powertop
命令启动 PowerTop 工具和powertop --calibrate
来布线电源估算引擎。有关 PowerTop 的更多信息,请参阅 使用 PowerTOP 管理功耗。 Diskdevstat 和 netdevstat
它们是 SystemTap 工具,可收集有关系统中所有应用程序的磁盘活动和网络活动的详细信息。使用这些工具收集的统计数据,您可以识别与许多小 I/O 操作(而非更小且更大型的操作)的强大应用程序。以 root 用户身份使用
dnf install tuned-utils-systemtap kernel-debuginfo
命令,安装diskdevstat
和netdevstat
工具。要查看磁盘和网络活动的详细信息,请使用:
# diskdevstat PID UID DEV WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG READ_CNT READ_MIN READ_MAX READ_AVG COMMAND 3575 1000 dm-2 59 0.000 0.365 0.006 5 0.000 0.000 0.000 mozStorage #5 3575 1000 dm-2 7 0.000 0.000 0.000 0 0.000 0.000 0.000 localStorage DB [...] # netdevstat PID UID DEV XMIT_CNT XMIT_MIN XMIT_MAX XMIT_AVG RECV_CNT RECV_MIN RECV_MAX RECV_AVG COMMAND 3572 991 enp0s31f6 40 0.000 0.882 0.108 0 0.000 0.000 0.000 openvpn 3575 1000 enp0s31f6 27 0.000 1.363 0.160 0 0.000 0.000 0.000 Socket Thread [...]
使用这些命令,您可以指定三个参数:
update_interval
、total_duration
和display_histogram
。TuneD
-
它是一个基于配置集的系统调整工具,它使用
udev
设备管理器监控连接的设备,并支持系统设置的静态和动态调优。您可以使用tuned-adm recommend
命令确定红帽推荐的配置集作为最适合特定产品的配置集。如需有关 TuneD 的更多信息,请参阅 开始使用 TuneD 和 自定义 TuneD 配置文件。使用powertop2tuned 实用程序
,您可以从PowerTOP
推荐创建自定义 TuneD 配置集。有关powertop2tuned
工具的详情,请参考 优化功耗。 虚拟内存统计信息 (vmstat)
它由
procps-ng
软件包提供。使用这个工具,您可以查看进程、内存、分页、块 I/O、陷阱和 CPU 活动的详细信息。要查看此信息,请使用:
$ vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 5805576 380856 4852848 0 0 119 73 814 640 2 2 96 0 0
使用
vmstat -a
命令,可以显示活动和不活跃的内存。有关其他vmstat
选项的更多信息,请参阅系统中的vmstat
手册页。iostat
它由
sysstat
软件包提供。此工具与vmstat
类似,但只适用于监控块设备上的 I/O。它还提供了更详细的输出和统计数据。要监控系统 I/O,请使用:
$ iostat avg-cpu: %user %nice %system %iowait %steal %idle 2.05 0.46 1.55 0.26 0.00 95.67 Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn nvme0n1 53.54 899.48 616.99 3445229 2363196 dm-0 42.84 753.72 238.71 2886921 914296 dm-1 0.03 0.60 0.00 2292 0 dm-2 24.15 143.12 379.80 548193 1454712
blktrace
它提供有关在 I/O 子系统中花费时间的详细信息。
要以人类可读格式查看此信息,请使用:
# blktrace -d /dev/dm-0 -o - | blkparse -i - 253,0 1 1 0.000000000 17694 Q W 76423384 + 8 [kworker/u16:1] 253,0 2 1 0.001926913 0 C W 76423384 + 8 [0] [...]
第一列 253,0 是设备主和次的元组。第二列 1 提供了有关 CPU 的信息,后跟用于发出 IO 进程的进程的时间戳和 PID 的列。
第六个列 Q 显示事件类型,第 7 列,W 代表写入操作,第 8 列为 76423384,是块号,+ 8 是请求的块的数量。
最后一个字段 [kworker/u16:1] 是进程名称。
默认情况下,
blktrace
命令会永久运行,直到进程被明确终止。使用-w
选项指定运行时持续时间。turbostat
它由
kernel-tools
软件包提供。它报告了 x86-64 处理器上的处理器拓扑、频率、空闲的电源状态统计、温度和功耗。要查看此摘要,请使用:
# turbostat CPUID(0): GenuineIntel 0x16 CPUID levels; 0x80000008 xlevels; family:model:stepping 0x6:8e:a (6:142:10) CPUID(1): SSE3 MONITOR SMX EIST TM2 TSC MSR ACPI-TM HT TM CPUID(6): APERF, TURBO, DTS, PTM, HWP, HWPnotify, HWPwindow, HWPepp, No-HWPpkg, EPB [...]
默认情况下,
turbostat
显示整个屏幕的计数器结果摘要,每 5 秒显示计数器结果。使用-i
选项指定计数器结果之间的不同周期,例如,执行turbostat -i 10
会每 10 秒打印结果。Turbostat 在识别电源使用或空闲时间方面效率低下的服务器也很有用。它还有助于识别系统中发生的系统管理中断 (SMI) 的速度。它还可用于验证电源管理调整的影响。
cpupower
IT 是用于检查和调优处理器相关功能的工具集合。在
cpupower
命令中使用frequency-info
,frequency-set
,idle-info
,idle-set
,set
,info
, 和monitor
选项来显示和设置处理器相关的值。例如,要查看可用的 cpufreq 管理器,请使用:
$ cpupower frequency-info --governors analyzing CPU 0: available cpufreq governors: performance powersave
有关
cpupower
的更多信息,请参阅查看 CPU 相关信息。GNOME Power Manager
- 它是作为 GNOME 桌面环境的一部分安装的守护进程。GNOME Power Manager 通知您系统的电源状态变化,例如,从电池改为 AC 电源。它还会报告电池状态,并在电池电源较低时提醒您。
其他资源
-
powertop (1)
,diskdevstat (8)
,netdevstat (8)
,tuned (8)
,vmstat (8)
,iostat (1)
,blktrace (8)
,blkparse (8)
, 和turbostat (8)
man page -
cpupower (1)
,cpupower-set (1)
,cpupower-info (1)
,cpupower-idle (1)
,cpupower-frequency-set (1)
,cpupower-frequency-info (1)
, 和cpupower-monitor (1)
手册页
第 15 章 使用 PowerTOP 管理能耗
作为系统管理员,您可以使用 PowerTOP 工具来分析和管理功耗。
15.1. PowerTOP 的目的
PowerTOP 是一个诊断与功耗相关的问题的程序,并提供如何延长生动生命周期的建议。
PowerTOP 工具可提供系统总功耗和各个进程、设备、内核工作器、计时器和中断处理器的功耗。工具还可识别频繁绕过 CPU 的内核和用户空间应用程序的特定组件。
Red Hat Enterprise Linux 9 使用 PowerTOP 版本 2.x。
15.2. 使用 PowerTOP
先决条件
为了可以使用 PowerTOP,请确定在您的系统中已安装了
powertop
软件包:# dnf install powertop
15.2.1. 启动 PowerTOP
流程
要运行 PowerTOP,请使用以下命令:
# powertop
笔记本电脑应在运行 powertop
命令时以电能量运行。
15.2.2. 校准 PowerTOP
流程
在笔记本电脑中,您可以通过运行以下命令来布放节能引擎:
# powertop --calibrate
让校准完成,而不会在此过程中与机器交互。
校准需要一些时间,因为进程执行各种测试,整个测试通过强度级别和交换机设备进行循环。
在完成校准过程后,PowerTOP 会正常启动。让它运行大约一小时以收集数据。
收集足够数据后,输出表的第一列中将显示节能数据。
请注意,powertop --calibrate
仅适用于笔记本电脑。
15.2.3. 设置测量间隔
默认情况下,PowerTOP 将测量间隔为 20 秒。
如果要更改此测量频率,请使用以下步骤:
流程
使用
--time
选项运行powertop
命令:# powertop --time=time in seconds
15.3. powertop 统计
在运行期间,PowerTOP 会从系统收集统计信息。
powertop的输出提供多个标签:
-
概述
-
idle stats
-
频率统计
-
设备统计
-
Tunables
-
WakeUp
您可以使用 Tab
和 Shift+Tab
键通过这些选项卡进行循环。
15.3.1. Overview 选项卡
在 Overview
选项卡中,您可以查看将 wakeups 发送到 CPU 最频繁或消耗最多功能的组件列表。Overview
选项卡中的项目(包括进程、中断、设备和其他资源)会根据它们的使用情况进行排序。
Overview
选项卡中的 adjacent 列提供以下信息:
- 使用
- 详细估算资源的使用情况。
- Events/s
- 每秒的 Wakeups 数。每秒唤醒的时间数代表如何高效地执行内核的设备和驱动程序。较少的 wakeups 表示消耗较少电源。组件按照可进一步优化的电源使用量排序。
- 类别
- 组件的类别,如进程、设备或计时器。
- 描述
- 组件的描述。
如果正确校准,则会显示第一列中每个列出的项目的功耗估算。
除此之外,Overview
选项卡还包含包含摘要统计的行,例如:
- 电源消耗总数
- 剩余限制生命周期(仅在适用的情况下)
- 每秒的 GPU 操作总数(每秒为 GPU 操作)和每秒虚拟文件系统操作
15.3.2. Idle stats 标签页
Idle stats
选项卡显示所有处理器和内核的使用 C-states,而 Frequency stats
选项卡显示 P-states 的使用,包括 Turbo 模式(若适用)所有处理器和内核。C- 或 P-states 的持续时间代表 CPU 用量的优化程度。CPU 使用率更长的 CPU 处于更高的 C- 或 P-states(例如,C4 大于 C3),CPU 使用量优化越好。理想情况下,当系统闲置时,驻留的最高 C- 或 P-state 应该为 90% 或更高。
15.3.3. Device stats 标签页
Device stats
选项卡中提供与 Overview
选项卡类似的信息,但只适用于设备。
15.3.4. Tunables 选项卡
Tunables
选项卡包含 PowerTOP的建议,以优化系统以降低功耗。
使用 up
和 down
键移动建议,使用 enter
键打开或关闭建议。
15.3.5. WakeUp 选项卡
WakeUp
选项卡显示设备 wakeup 设置,供用户根据需要更改。
使用 up
和 down
键通过可用的设置移动,并使用 enter
键启用或禁用设置。
图 15.1. PowerTOP 输出
其他资源
有关 PowerTOP 的详情,请参阅 PowerTOP 主页。
15.4. 为什么 Powertop 不会在一些实例中显示 Frequency stats 值
在使用 Intel P-State 驱动程序时,如果驱动程序处于被动模式,PowerTOP 仅显示 Frequency Stats
选项卡中的值。但在这种情况下,这些值可能不完整。
总而言,Intel P-State 驱动程序有三种可能模式:
- 使用硬件 P-States (HWP) 的活跃模式
- 没有 HWP 的活跃模式
- 被动模式
切换到 ACPI CPUfreq 驱动程序会导致 PowerTOP 显示的完整信息。但是,建议将您的系统保留在默认设置中。
要查看载入哪些驱动程序以及在什么模式下运行:
# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
-
如果 Intel P-State 驱动程序被加载且处于活跃模式,则返回
intel_pstate
。 -
如果 Intel P-State 驱动程序被加载且处于被动模式,则返回
intel_cpufreq
。 -
如果载入 ACPI CPUfreq 驱动程序,则返回
acpi-cpufreq
。
在使用 Intel P-State 驱动程序时,在内核命令行中添加以下参数,以强制驱动程序在被动模式下运行:
intel_pstate=passive
要禁用 Intel P-State 驱动程序并使用,而是使用 ACPI CPUfreq 驱动程序,在内核引导命令行中添加以下参数:
intel_pstate=disable
15.5. 生成 HTML 输出
除了终端中的 powertop
输出外,您还可以生成 HTML 报告。
流程
使用
--html
选项运行powertop
命令:# powertop --html=htmlfile.html
将
htmlfile.html
参数替换为输出文件所需名称。
15.6. 优化功耗
要优化功耗,您可以使用 powertop
服务或 powertop2tuned
程序。
15.6.1. 使用 powertop 服务优化功耗
您可以使用 powertop
服务,从引导时的 Tunables
选项卡中自动启用所有 PowerTOP 的建议:
流程
启用
powertop
服务:# systemctl enable powertop
15.6.2. powertop2tuned 工具
powertop2tuned
程序允许您从 PowerTOP 建议创建自定义 TuneD 配置集。
默认情况下,powertop2tuned
在 /etc/tuned/
目录中创建配置集,并在当前选择的 TuneD 配置集中基础配置集。为安全起见,所有 PowerTOP 调优最初在新配置集中被禁用。
要启用调整,您可以:
-
在
/etc/tuned/profile_name/tuned.conf 文件中
取消注释。 使用
--enable
或-e
选项生成新的配置集,启用 PowerTOP 建议的大部分调优。某些潜在的调整(如 USB 自动暂停)在默认情况下被禁用,需要手动取消注释。
15.6.3. 使用 powertop2tuned 程序优化电源消耗
先决条件
powertop2tuned
程序已安装在系统上:# dnf install tuned-utils
流程
创建自定义配置集:
# powertop2tuned new_profile_name
激活新配置集:
# tuned-adm profile new_profile_name
附加信息
要获得
powertop2tuned
支持的选项列表,请使用:$ powertop2tuned --help
15.6.4. powertop.service 和 powertop2tuned 的比较
和 powertop.service
相比,对于优化能耗应首选 powertop2tuned
,理由如下:
-
powertop2tuned
实用程序代表将 PowerTOP 集成到 TuneD 中,这能够带来这两个工具的优势。 -
powertop2tuned
实用程序允许对已启用的调优进行精细的控制。 -
使用
powertop2tuned
时,可能无法自动启用潜在的危险调整。 -
通过
powertop2tuned
,可以在不重启的情况下进行回滚。
第 16 章 perf 入门
作为系统管理员,您可以使用 perf
工具来收集和分析系统的性能数据。
16.1. perf 简介
与基于内核的子系统 Performance Counters for Linux (PCL) 的 perf
用户空间工具接口。perf
是一个强大的工具,它使用性能监控单元 (PMU) 测量、记录和监控各种硬件和软件事件。perf
还支持追踪点、kprobes 和 uprobes。
16.2. 安装 perf
此流程安装 perf
用户空间工具。
流程
安装
perf
工具:# dnf install perf
16.3. 常见 perf 命令
perf stat
- 此命令提供常见性能事件的总体统计信息,包括执行的指令和消耗的时钟周期。选项可用于选择默认测量事件以外的事件。
perf 记录
-
此命令将性能数据记录到文件
perf.data
中,稍后可以使用perf report
命令进行分析。 perf 报告
-
此命令从 perf
记录
创建的perf.data
文件中读取和显示性能数据。 perf list
- 此命令列出特定计算机上可用的事件。这些事件将根据系统的性能监控硬件和软件配置而有所不同。
perf top
-
此命令执行与
top
实用程序类似的功能。它生成并实时显示性能计数器配置集。 perf trace
-
此命令执行与
strace
工具类似的函数。它监控指定线程或进程使用的系统调用,以及该应用收到的所有信号。 perf help
-
此命令显示
perf
命令的完整列表。
其他资源
-
在 子命令中添加
--help
选项以打开 man page。
第 17 章 使用 perf top 实时分析 CPU 使用量
您可以使用 perf top
命令来实时测量不同功能的 CPU 使用量。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
17.1. perf top 的目的
perf top
命令用于实时系统分析,功能类似于 top
实用程序。但是,当 top
实用工具通常会显示给定进程或线程使用的 CPU 时间,perf top
则显示每个特定功能使用的 CPU 时间。在其默认状态下,perf top
告知您在用户空间和内核空间中的所有 CPU 之间使用的功能。要使用 perf,
您需要 root 访问权限。
17.2. 使用 perf top 分析 CPU 使用量
此流程实时激活 perf top
和实时 profile CPU 用量。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。 - 有 root 访问权限
流程
启动
perf top
监控接口:# perf top
监控接口类似如下:
Samples: 8K of event 'cycles', 2000 Hz, Event count (approx.): 4579432780 lost: 0/0 drop: 0/0 Overhead Shared Object Symbol 2.20% [kernel] [k] do_syscall_64 2.17% [kernel] [k] module_get_kallsym 1.49% [kernel] [k] copy_user_enhanced_fast_string 1.37% libpthread-2.29.so [.] pthread_mutex_lock 1.31% [unknown] [.] 0000000000000000 1.07% [kernel] [k] psi_task_change 1.04% [kernel] [k] switch_mm_irqs_off 0.94% [kernel] [k] fget 0.74% [kernel] [k] entry_SYSCALL_64 0.69% [kernel] [k] syscall_return_via_sysret 0.69% libxul.so [.] 0x000000000113f9b0 0.67% [kernel] [k] kallsyms_expand_symbol.constprop.0 0.65% firefox [.] moz_xmalloc 0.65% libpthread-2.29.so [.] __pthread_mutex_unlock_usercnt 0.60% firefox [.] free 0.60% libxul.so [.] 0x000000000241d1cd 0.60% [kernel] [k] do_sys_poll 0.58% [kernel] [k] menu_select 0.56% [kernel] [k] _raw_spin_lock_irqsave 0.55% perf [.] 0x00000000002ae0f3
在这个示例中,内核功能
do_syscall_64
使用最多的 CPU 时间。
其他资源
-
系统中的
perf-top (1)
手册页
17.3. perf output 输出的解释
perf output
监控接口在多个列中显示数据:
- "Overhead" 列
- 显示特点功能使用的 CPU 百分比。
- "Shared Object" 列
- 显示使用函数的程序或库的名称。
- "Symbol" 列
-
显示功能名称或符号。在内核空间中执行的功能由
[k]
标识,在用户空间中执行的功能由[.]
标识。
17.4. 为什么 perf 会显示一些功能名称作为原始功能地址
对于内核功能,perf
使用 /proc/kallsyms
文件中的信息将示例映射到其相应的功能名称或符号。对于用户空间中执行的功能,您可能会看到原始功能地址,因为二进制文件被剥离。
必须安装可执行文件的 debuginfo
软件包;如果可执行文件是本地开发的应用程序,则必须通过打开的调试信息(GCC 中的 -g
选项)编译,以显示这样的情形中的功能名称或符号。
安装与可执行文件关联的 debuginfo
后,不需要重新运行 perf record
命令。只需重新运行 perf report
命令。
其它资源
17.5. 启用调试和源存储库
Red Hat Enterprise Linux 的标准安装并不会启用 debug 和 source 软件仓库。这些仓库包含调试系统组件并测量其性能所需的信息。
流程
启用源并调试信息软件包通道:
# subscription-manager repos --enable rhel-9-for-$(uname -i)-baseos-debug-rpms # subscription-manager repos --enable rhel-9-for-$(uname -i)-baseos-source-rpms # subscription-manager repos --enable rhel-9-for-$(uname -i)-appstream-debug-rpms # subscription-manager repos --enable rhel-9-for-$(uname -i)-appstream-source-rpms
$(uname -i)
部分会自动替换为您系统构架的匹配值:架构名称 Value 64 位 Intel 和 AMD
x86_64
64-bit ARM
aarch64
IBM POWER
ppc64le
64-bit IBM Z
s390x
17.6. 使用 GDB 获取应用程序或库的 debuginfo 软件包
调试代码需要调试信息。对于从软件包安装的代码,GNU Debugger (GDB) 会自动识别缺少的调试信息,解析软件包名称,并提供了有关如何获取软件包的建议。
先决条件
流程
启动附加到您要调试的应用程序或库的 GDB。GDB 会自动识别缺少的调试信息并建议一个命令运行。
$ gdb -q /bin/ls Reading symbols from /bin/ls...Reading symbols from .gnu_debugdata for /usr/bin/ls...(no debugging symbols found)...done. (no debugging symbols found)...done. Missing separate debuginfos, use: dnf debuginfo-install coreutils-8.30-6.el8.x86_64 (gdb)
退出 GDB:键入 q,使用 Enter 进行确认。
(gdb) q
运行 GDB 建议的命令来安装所需的
debuginfo
软件包:# dnf debuginfo-install coreutils-8.30-6.el8.x86_64
dnf
软件包管理工具提供了更改摘要,要求确认,一旦被您确认后会下载和安装所有需要的文件。-
如果 GDB 无法建议
debuginfo
软件包,请按照 手动应用程序或库获取 debuginfo 软件包中所述的步骤操作。
其他资源
- 如何为 RHEL 系统下载或安装 debuginfo 软件包? - 红帽知识库解决方案
第 18 章 使用 perf stat 在进程执行过程中计算事件
您可以使用 perf stat
命令在进程执行期间计算硬件和软件事件。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
18.1. perf stat 的目的
perf stat
命令执行指定的命令,在命令执行过程中保留运行次数和软件事件,并生成这些计数的统计信息。如果您没有指定任何事件,则 perf stat
会计算一组通用的硬件和软件事件。
18.2. 使用 perf stat 计数事件
您可以使用 perf stat
计算命令执行过程中出现的硬件和软件事件,并生成这些计数的统计信息。默认情况下,perf stat
以针对每个线程的模式运行。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
流程
计算事件数。
在没有 root 访问权限的情况下运行
perf stat
命令只会计算在用户空间中出现的事件:$ perf stat ls
例 18.1. perf stat 的输出在没有 root 访问权限的情况下运行
Desktop Documents Downloads Music Pictures Public Templates Videos Performance counter stats for 'ls': 1.28 msec task-clock:u # 0.165 CPUs utilized 0 context-switches:u # 0.000 M/sec 0 cpu-migrations:u # 0.000 K/sec 104 page-faults:u # 0.081 M/sec 1,054,302 cycles:u # 0.823 GHz 1,136,989 instructions:u # 1.08 insn per cycle 228,531 branches:u # 178.447 M/sec 11,331 branch-misses:u # 4.96% of all branches 0.007754312 seconds time elapsed 0.000000000 seconds user 0.007717000 seconds sys
如上例中所示,如果
perf stat
运行没有 root 访问权限,则事件名称会加上:u
,表示这些事件只在用户空间中计算出来。要计算用户空间和内核空间事件,在运行
perf stat
时必须具有 root 访问权限:# perf stat ls
例 18.2. 使用 root 访问权限运行 perf stat 的输出
Desktop Documents Downloads Music Pictures Public Templates Videos Performance counter stats for 'ls': 3.09 msec task-clock # 0.119 CPUs utilized 18 context-switches # 0.006 M/sec 3 cpu-migrations # 0.969 K/sec 108 page-faults # 0.035 M/sec 6,576,004 cycles # 2.125 GHz 5,694,223 instructions # 0.87 insn per cycle 1,092,372 branches # 352.960 M/sec 31,515 branch-misses # 2.89% of all branches 0.026020043 seconds time elapsed 0.000000000 seconds user 0.014061000 seconds sys
默认情况下,
perf stat
以针对每个线程的模式运行。要更改为 CPU 范围事件计数,请将-a
选项传递给perf stat
。要计算 CPU 范围内的事件,您需要 root 访问权限:# perf stat -a ls
其他资源
-
系统中的
perf-stat (1)
手册页
18.3. perf stat 输出的解释
perf stat
在命令执行期间执行指定命令并计数发生事件,并在三列中显示这些计数的统计信息:
- 给定事件的发生次数
- 被计算的事件的名称
当相关的指标可用时,右列中的 hash 符号 (
#
) 会显示比例或百分比。例如,当以默认模式运行时,
perf stat
会计算周期和说明,因此计算并在最接近列中显示每个周期的说明。对于缺失的分支(占所有分支的百分比),您可以看到类似行为,因为默认情况下这两个事件都会被计算。
18.4. 将 perf stat 附加到正在运行的进程
您可以将 perf stat
附加到正在运行的进程。这将指示 perf stat
在执行命令期间仅在指定进程中发生事件。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
流程
将
perf stat
附加到正在运行的进程中:$ perf stat -p ID1,ID2 sleep seconds
前面的例子计算进程
ID1
和ID2
的事件,这些事件的时间单位是sleep
命令使用的秒
数。
其他资源
-
系统中的
perf-stat (1)
手册页
第 19 章 使用 perf 记录和分析性能配置集
perf
工具允许您记录性能数据并在以后对其进行分析。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
19.1. perf record 的目的
perf record
命令对性能数据进行样本,并将其存储在文件 perf.data
中,可以使用其他 perf
命令来读取和视觉化。perf.data
在当前目录中生成,并可以在以后访问,可能在不同计算机上。
如果您没有为 perf record
指定命令,它将持续进行记录,直到您通过按 Ctrl+C
手动停止进程为止。您可以通过传递 -p
选项后跟一个或多个进程 ID,将 perf record
附加到特定进程。但是,您可以在没有 root 访问权限的情况下运行 perf record
,因此只有用户空间中的性能数据示例。在默认模式中,perf record
使用 CPU 周期作为抽样事件,并在每个线程模式下运行,并启用了继承模式。
19.2. 在没有 root 访问权限的情况下记录性能配置集
您可以在没有 root 访问权限的情况下使用 perf record
来记录用户空间中的性能数据。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
流程
记录性能数据示例:
$ perf record command
使用您要其期间对其进行抽样的命令替换
command
。如果没有指定命令,则perf record
将持续对数据进行抽样,直到手动按 Ctrl+C 来为止。
其他资源
-
系统中的
perf-record (1)
手册页
19.3. 使用 root 访问权限记录性能配置集
您可以使用带有 root 访问权限的 perf record
来同时在用户空间和内核空间中记录性能数据。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。 - 有 root 访问权限。
流程
记录性能数据示例:
# perf record command
使用您要其期间对其进行抽样的命令替换
command
。如果没有指定命令,则perf record
将持续对数据进行抽样,直到手动按 Ctrl+C 来为止。
其他资源
-
系统中的
perf-record (1)
手册页
19.4. 以针对每个 CPU 的模式记录性能档案
您可以使用针对每个 CPU 的模式运行 perf record
来抽样和记录在一个被监测的 CPU 中的所有线程的用户空间和内核空间的性能数据。默认情况下,CPU 模式会监控所有在线 CPU。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
流程
记录性能数据示例:
# perf record -a command
使用您要其期间对其进行抽样的命令替换
command
。如果没有指定命令,则perf record
将持续对数据进行抽样,直到手动按 Ctrl+C 来为止。
其他资源
-
系统中的
perf-record (1)
手册页
19.5. 使用 perf record 捕获调用图形数据
您可以配置 perf record
工具,以便其记录在性能配置集中调用其他功能的功能。如果多个进程调用相同功能,这有助于识别瓶颈。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
流程
使用
--call-graph
选项记录性能数据示例:$ perf record --call-graph method command
-
使用您要其期间对其进行抽样的命令替换
command
。如果没有指定命令,则perf record
将持续对数据进行抽样,直到手动按 Ctrl+C 来为止。 使用以下 unwinding 的方法之一替换 method:
fp
-
使用帧指针方法。根据编译器优化,如使用 GCC 选项
--fomit-frame-pointer
构建的二进制文件,这可能无法取消验证堆栈。 dwarf
- 使用 DWARF Call Frame 信息来 unwind 堆栈。
lbr
- 使用 Intel 处理器上的最后分支记录硬件。
-
使用您要其期间对其进行抽样的命令替换
其他资源
-
系统中的
perf-record (1)
手册页
19.6. 使用 perf report 分析 perf.data
您可以使用 perf report
来显示和分析 perf.data
文件。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。 -
当前目录中有一个
perf.data
文件。 -
如果
perf.data
文件是使用 root 访问权限创建的,则需要使用 root 访问权限运行perf report
。
流程
显示
perf.data
文件的内容,以进一步分析:# perf report
这个命令显示类似如下的输出:
Samples: 2K of event 'cycles', Event count (approx.): 235462960 Overhead Command Shared Object Symbol 2.36% kswapd0 [kernel.kallsyms] [k] page_vma_mapped_walk 2.13% sssd_kcm libc-2.28.so [.] memset_avx2_erms 2.13% perf [kernel.kallsyms] [k] smp_call_function_single 1.53% gnome-shell libc-2.28.so [.] strcmp_avx2 1.17% gnome-shell libglib-2.0.so.0.5600.4 [.] g_hash_table_lookup 0.93% Xorg libc-2.28.so [.] memmove_avx_unaligned_erms 0.89% gnome-shell libgobject-2.0.so.0.5600.4 [.] g_object_unref 0.87% kswapd0 [kernel.kallsyms] [k] page_referenced_one 0.86% gnome-shell libc-2.28.so [.] memmove_avx_unaligned_erms 0.83% Xorg [kernel.kallsyms] [k] alloc_vmap_area 0.63% gnome-shell libglib-2.0.so.0.5600.4 [.] g_slice_alloc 0.53% gnome-shell libgirepository-1.0.so.1.0.0 [.] g_base_info_unref 0.53% gnome-shell ld-2.28.so [.] _dl_find_dso_for_object 0.49% kswapd0 [kernel.kallsyms] [k] vma_interval_tree_iter_next 0.48% gnome-shell libpthread-2.28.so [.] pthread_getspecific 0.47% gnome-shell libgirepository-1.0.so.1.0.0 [.] 0x0000000000013b1d 0.45% gnome-shell libglib-2.0.so.0.5600.4 [.] g_slice_free1 0.45% gnome-shell libgobject-2.0.so.0.5600.4 [.] g_type_check_instance_is_fundamentally_a 0.44% gnome-shell libc-2.28.so [.] malloc 0.41% swapper [kernel.kallsyms] [k] apic_timer_interrupt 0.40% gnome-shell ld-2.28.so [.] _dl_lookup_symbol_x 0.39% kswapd0 [kernel.kallsyms] [k] raw_callee_save___pv_queued_spin_unlock
其他资源
-
系统中的
perf-report (1)
手册页
19.7. perf 报告输出的解释
运行 perf report
命令显示的表会将数据排序为几列:
- 'Overhead' 列
- 指明在该特定功能中收集的整体样本的百分比。
- 'Command' 列
- 告诉您从哪个进程收集样本。
- 'Shared Object' 列
- 显示示例来自内核的 ELF 镜像的名称(当样本来自内核时使用名称 [kernel.kallsyms])。
- 'Symbol' 列
- 显示功能名称或符号。
在默认模式中,功能按照降序排列,首先显示最高的开销。
19.8. 生成可在不同设备上读取的 perf.data 文件
您可以使用 perf
工具将性能数据记录到 perf.data
文件中,以便在不同的设备上分析。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。 -
已安装内核
debuginfo
软件包。如需更多信息,请参阅使用 GDB 来获取应用程序或库的 debuginfo 软件包。
流程
捕获您需要进一步调查的性能数据:
# perf record -a --call-graph fp sleep seconds
这个示例会在整个系统中生成一个
perf.data
,其包括的时间是使用sleep
命令指定的seconds
秒数。它还将使用数据框架指针方法捕获调用图形数据。生成包含记录数据的 debug 符号的归档文件:
# perf archive
验证
验证存档文件是否已在您的当前活跃目录中生成:
# ls perf.data*
输出中将显示以
perf.data
开头的每个文件。归档文件将命名为:perf.data.tar.gz
或者
perf.data.tar.bz2
19.9. 分析在不同设备中创建的 perf.data 文件
您可以使用 perf
工具分析在不同设备上生成的 perf.data
文件。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。 -
使用的
perf.data
文件和相关存档文件存在于不同的设备上。
流程
-
将
perf.data
文件和存档文件复制到您当前的活跃目录中。 将存档文件提取到
~/.debug
中:# mkdir -p ~/.debug # tar xf perf.data.tar.bz2 -C ~/.debug
注意归档文件可能也命名为
perf.data.tar.gz
。打开
perf.data
文件以进一步分析:# perf report
19.10. 为什么 perf 会显示一些功能名称作为原始功能地址
对于内核功能,perf
使用 /proc/kallsyms
文件中的信息将示例映射到其相应的功能名称或符号。对于用户空间中执行的功能,您可能会看到原始功能地址,因为二进制文件被剥离。
必须安装可执行文件的 debuginfo
软件包;如果可执行文件是本地开发的应用程序,则必须通过打开的调试信息(GCC 中的 -g
选项)编译,以显示这样的情形中的功能名称或符号。
安装与可执行文件关联的 debuginfo
后,不需要重新运行 perf record
命令。只需重新运行 perf report
命令。
其它资源
19.11. 启用调试和源存储库
Red Hat Enterprise Linux 的标准安装并不会启用 debug 和 source 软件仓库。这些仓库包含调试系统组件并测量其性能所需的信息。
流程
启用源并调试信息软件包通道:
# subscription-manager repos --enable rhel-9-for-$(uname -i)-baseos-debug-rpms # subscription-manager repos --enable rhel-9-for-$(uname -i)-baseos-source-rpms # subscription-manager repos --enable rhel-9-for-$(uname -i)-appstream-debug-rpms # subscription-manager repos --enable rhel-9-for-$(uname -i)-appstream-source-rpms
$(uname -i)
部分会自动替换为您系统构架的匹配值:架构名称 Value 64 位 Intel 和 AMD
x86_64
64-bit ARM
aarch64
IBM POWER
ppc64le
64-bit IBM Z
s390x
19.12. 使用 GDB 获取应用程序或库的 debuginfo 软件包
调试代码需要调试信息。对于从软件包安装的代码,GNU Debugger (GDB) 会自动识别缺少的调试信息,解析软件包名称,并提供了有关如何获取软件包的建议。
先决条件
流程
启动附加到您要调试的应用程序或库的 GDB。GDB 会自动识别缺少的调试信息并建议一个命令运行。
$ gdb -q /bin/ls Reading symbols from /bin/ls...Reading symbols from .gnu_debugdata for /usr/bin/ls...(no debugging symbols found)...done. (no debugging symbols found)...done. Missing separate debuginfos, use: dnf debuginfo-install coreutils-8.30-6.el8.x86_64 (gdb)
退出 GDB:键入 q,使用 Enter 进行确认。
(gdb) q
运行 GDB 建议的命令来安装所需的
debuginfo
软件包:# dnf debuginfo-install coreutils-8.30-6.el8.x86_64
dnf
软件包管理工具提供了更改摘要,要求确认,一旦被您确认后会下载和安装所有需要的文件。-
如果 GDB 无法建议
debuginfo
软件包,请按照 手动应用程序或库获取 debuginfo 软件包中所述的步骤操作。
其他资源
- 如何为 RHEL 系统下载或安装 debuginfo 软件包? - 红帽知识库解决方案
第 20 章 使用 perf 调查繁忙的 CPU
在调查系统上的性能问题时,您可以使用 perf
工具来识别和监控总线 CPU,以便专注于您的努力。
20.1. 显示使用 perf stat 时会计算哪些 CPU 事件
您可以使用 perf stat
来显示因为禁用 CPU 计数聚而被计算的 CPU 事件。您必须使用 -a
标志来计算系统范围的事件,才能使用此功能。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
流程
计算禁用 CPU 数聚合的事件:
# perf stat -a -A sleep seconds
前面的例子显示了一组默认的硬件和软件事件,覆盖的时间是
sleep
命令中指定的seconds
的秒数,针对每个 CPU(从CPU0
开始以升序进行排序)。因此,它可以用于指定一个事件(如周期):# perf stat -a -A -e cycles sleep seconds
20.2. 显示使用 perf report 要使用哪些 CPU 样本
perf record
命令对性能数据进行样本,并将其存储在文件 perf.data
中,您可以使用 perf report
命令来读取这个文件。perf record
命令会记录要使用哪些 CPU 样本。您可以配置 perf report
来显示此信息。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。 -
在当前的目录中有一个使用
perf record
创建的perf.data
文件。如果perf.data
文件是使用 root 访问权限创建的,则需要使用 root 访问权限运行perf report
。
流程
显示
perf.data
文件的内容用于进一步分析,按 CPU 排序:# perf report --sort cpu
您可以按 CPU 和命令排序,以显示消耗的 CPU 时间的更多详细信息:
# perf report --sort cpu,comm
本示例将按开销使用量降序列出所有受监控 CPU 的命令,并标识从中执行命令的 CPU。
其他资源
20.3. 使用 perf top 在性能分析期间显示特定 CPU
您可以在实时分析系统时,配置 perf top
来显示特定的 CPU 及其相对使用量。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
流程
启动
perf top
接口,按 CPU 排序:# perf top --sort cpu
这个示例将实时列出 CPU 及其对应开销,以降序排列。
您可以按 CPU 和命令排序,以了解 CPU 时间被消耗在什么地方:
# perf top --sort cpu,comm
本示例将按消耗使用量降序列出命令,并确定命令实时在哪个 CPU 上执行。
20.4. 使用 perf record 和 perf report 监控特定 CPU
您可以将 perf record
配置为仅针对目标的特定 CPU 样本,并使用 perf report
分析生成的 perf.data
文件以进一步分析。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
流程
对特定 CPU 进行抽样并记录性能数据,生成
perf.data
文件:使用以逗号分隔的 CPU 列表:
# perf record -C 0,1 sleep seconds
以上示例抽样并记录 CPU 0 和 1 中的数据,覆盖的时间为
sleep
命令指定的seconds
秒数。使用一系列 CPU:
# perf record -C 0-2 sleep seconds
以上示例对 CPU 0 到 2 的所有 CPU 进行抽样并记录数据,覆盖时间为
sleep
命令中使用的seconds
指定的秒数。
显示
perf.data
文件的内容,以进一步分析:# perf report
本例将显示
perf.data
的内容。如果您在监控多个 CPU 并想了解哪些 CPU 数据被抽样,请参阅使用 perf report 显示哪些 CPU 样本。
第 21 章 使用 perf 监控应用程序性能
您可以使用 perf
工具来监控和分析应用程序性能。
21.1. 将 perf 记录附加到正在运行的进程
您可以将 perf record
附加到正在运行的进程。这将指示 perf record
只对于特定的进程进行抽样并记录性能数据。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
流程
将
perf record
附加到正在运行的进程中:$ perf record -p ID1,ID2 sleep seconds
前面的示例抽样并记录 ID 为
ID1
和ID2
的进程,覆盖的时间范围为sleep
命令指定的seconds
秒数。您还可以配置perf
来记录特定线程中的事件:$ perf record -t ID1,ID2 sleep seconds
注意当使用
-t
标志和处理线程 ID 时,perf
会默认禁用继承功能。您可以通过添加--inherit
选项来启用继承性。
21.2. 使用 perf record 捕获调用图形数据
您可以配置 perf record
工具,以便其记录在性能配置集中调用其他功能的功能。如果多个进程调用相同功能,这有助于识别瓶颈。
先决条件
-
已安装
perf
用户空间工具,如安装 perf 所述。
流程
使用
--call-graph
选项记录性能数据示例:$ perf record --call-graph method command