监控和管理系统状态和性能
优化系统吞吐量、延迟和电源消耗
摘要
对红帽文档提供反馈 复制链接链接已复制到粘贴板!
我们感谢您对我们文档的反馈。让我们了解如何改进它。
通过 Jira 提交反馈(需要帐户)
- 登录到 Jira 网站。
- 在顶部导航栏中点 Create
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 点对话框底部的 Create。
第 1 章 性能监控选项概述 复制链接链接已复制到粘贴板!
您可以使用以下工具来监控和优化 Red Hat Enterprise Linux 系统的性能:
- Performance Co-Pilot (pcp)是一组用于监控、可视化、存储和分析系统级性能测量的工具。它允许监控和管理实时数据,以及记录和检索历史数据。
RHEL 提供多个命令行工具来监控运行级别 5 之外的系统。以下是内置命令行工具:
procps-ng软件包提供以下工具:-
top实用程序提供运行中系统中的进程的动态视图。它显示各种信息,包括系统摘要和当前由 Linux 内核管理的任务列表。 -
ps实用程序捕获所选活跃进程组的快照。默认情况下,检查组仅限于当前用户拥有的进程,并与执行ps命令的终端关联。 -
虚拟内存统计信息(
vmstat)实用程序提供系统中进程、内存、分页、块输入/输出、中断和 CPU 活动的即时报告。
-
-
sysstat软件包提供系统活动报告器(sar)实用程序,用于收集和报告当天的系统活动信息。
-
perf使用硬件性能计数器和内核追踪点来跟踪系统中的其他命令和应用程序的影响。 -
bcc-tools,一组在 Berkeley Packet Filter (BPF)编译器集合(BCC)之上构建的性能分析工具。它提供超过 100 个扩展的 BPF (eBPF)脚本来监控内核活动。有关这个工具的每一个脚本的更多信息,请参阅描述如何使用它以及其执行哪些功能的手册页。 -
kernel-tools软件包提供turbostat工具,它报告了处理器拓扑、频率、空闲的电源状态统计、温度和功耗。 -
sysstat软件包提供iostat实用程序,它监控和报告系统 I/O 设备的加载,以帮助管理员决定如何平衡物理磁盘之间的 I/O 负载。 -
irqbalance实用程序在处理器之间分发硬件中断,以提高系统性能。 -
numactl软件包提供numastat实用程序。默认情况下,numastat显示每个节点 Non-Uniform Memory Access (NUMA)命中并丢失了内核内存分配器的系统统计信息。高numa_hit值和低numa_miss值表示最佳性能。 -
numad是一个自动 NUMA 关联性管理守护进程。它监控系统中的 NUMA 拓扑和资源使用情况,以便动态改进 NUMA 资源分配、管理以及因此系统性能。 -
SystemTap是可编程的追踪/代理/调试系统,用于内核和用户空间,包含许多简短脚本。 -
Valgrind在超级部运行未检测的用户空间程序,以查找内存错误、分配统计信息、并发违反情况。 -
intel-cmt-cat软件包提供pqos工具,用于监控和控制最近 Intel 处理器上的 CPU 缓存和内存带宽。
第 2 章 使用 TuneD 优化系统性能 复制链接链接已复制到粘贴板!
TuneD 是一个系统调优服务,旨在通过使用预定义的或自定义配置集优化系统性能和功耗。它包括适用于不同工作负载的预定义配置集,如高吞吐量、低延迟和节能。
2.1. RHEL 提供的调优配置文件 复制链接链接已复制到粘贴板!
在安装过程中,TuneD 会自动根据系统类型选择最合适的配置集。例如,为计算节点选择了 throughput-performance,为虚拟机选择了 virtual-guest,并为常规系统选择 balanced,确保环境的性能最佳。配置集主要分为两类:
- 节能配置集,以降低性能影响的功耗,以及
- 性能提升配置集,用于优化系统资源,以加快速度和响应速度。
以下是 RHEL 提供的显著配置集列表,以根据系统负载进行选择:
balanced- 它是默认的节能配置集,应该在性能和功耗之间有妥协。在可能的情况下尽可能使用自动扩展和自动调整。
powersave它是最大节能性能的配置集,可以限制性能,以最大程度降低实际功耗。它为 SATA 主机适配器启用了 USB 自动暂停、Wi-Fi 节能和主动链路电源管理(ALPM)节能,并为具有低折率的系统调度多核节能,并激活
ondemand调控器。它启用了 AC97 音频节能,或根据您的系统,HDA-Intel 节能时间为 10 秒。如果您的系统包含启用了 KMS 支持的 Radeon 图形卡,配置文件会将其配置为自动节能。它将energy_performance_preference属性改为powersave或power energy设置。它还会将scaling_governor策略属性更改为ondemand或powersaveCPU 调控器。注意在某些情况下,balanced 配置集比 powersave 更高效。对于视频转码等任务,以全屏方式运行可以更快地完成作业,从而让计算机闲置并更迅速切换到高效的节能模式。节流机器可减少任务中的电源,但扩展了其持续时间,这可能会增加整体能源使用。因此,balanced 配置文件通常是更好的选择。
throughput-performance-
针对高吞吐量优化的服务器配置文件,禁用节能机制并启用
sysctl设置,以提高磁盘和网络 IO 的吞吐量性能。 accelerator-performance-
包含与
throughput-performance配置集相同的调整的配置集。另外,它会将 CPU 锁定为低 C 状态,以便使延迟小于 100us。这提高了某些加速器的性能,如 GPU。 latency-performance-
为低延迟优化的服务器配置文件,并禁用节能机制并启用可改进延迟的
sysctl设置。CPU 调控器被设置为 performance,CPU 被锁定到低 C 状态(按 PM QoS)。 network-latency-
低延迟网络调整的配置文件。它基于
latency-performance配置文件。它还禁用透明大内存页和 NUMA 平衡,并调整其他几个与网络相关的 sysctl 参数。 hpc-compute-
针对高性能计算而优化的配置文件。它基于
latency-performance配置文件。 network-throughput-
用于吞吐量网络调优的配置文件。它基于
throughput-performance配置文件。此外,它还增加了内核网络缓冲区。 virtual-guest-
为 Red Hat Enterprise Linux 虚拟机和 VMWare 虚拟机设计的配置集基于
throughput-performance配置集(除其他任务)减少了虚拟内存的交换性并增加磁盘预读值。它不会禁用磁盘障碍。 virtual-host-
基于
throughput-performance配置文件(除其他任务)为虚拟主机设计的配置文件降低了虚拟内存交换,增加磁盘预读值,并启用更主动的脏页面回写值。 oracle-
根据
throughput-performance配置集,为 Oracle 数据库负载进行了优化的配置集。它还禁用透明大内存页,并修改其他与性能相关的内核参数。这个配置集由 tuned-profiles-oracle 软件包提供。 desktop-
根据
balanced配置文件,为桌面进行了优化的配置文件。此外,它还启用了调度程序自动组以更好地响应交互式应用程序。 optimize-serial-console通过减少 printk 值,将 I/O 活动微调到串行控制台的配置文件。这应该使串行控制台更快响应。此配置文件用作其他配置文件的覆盖。例如:
# tuned-adm profile throughput-performance optimize-serial-consolemssql-
为 Microsoft SQL Server 提供的配置文件。它基于
throughput-performance配置文件。 intel-sst为带有用户定义的 Intel Speed Select Technology 配置的系统优化的配置集。此配置文件用作其他配置文件的覆盖。例如:
# tuned-adm profile cpu-partitioning intel-sstaws为 AWS EC2 实例优化的配置集。它基于
throughput-performance配置文件。有关这些配置集的详情,请查看系统中的
tuned-profiles手册页。
2.2. RHEL 提供的实时 TuneD 配置文件 复制链接链接已复制到粘贴板!
RHEL 提供了一些专门用于运行实时内核的系统的配置文件。如果没有特殊的内核构建,则不会将系统配置为实时。在 RHEL 中,配置集可用于额外的软件仓库。
realtime-
在裸机实时系统上使用。这由
tuned-profiles-realtime软件包提供,该软件包可从 RT 或 NFV 存储库中获得。 realtime-virtual-host-
在为实时配置的虚拟化主机中使用。这由
tuned-profiles-nfv-host软件包提供,该软件包可通过 NFV 存储库获取。 realtime-virtual-guest-
在为实时配置的虚拟化客户端中使用。这由
tuned-profiles-nfv-guest软件包提供,该软件包可通过 NFV 存储库获取。
2.3. 安装并启用 TuneD 复制链接链接已复制到粘贴板!
作为系统管理员,您可以使用 TuneD 守护进程来针对各种用例优化系统的性能配置集。您必须安装并启用 TuneD 才能开始使用它。
安装后,/usr/lib/tuned/profiles 目录会存储特定于分发的配置文件。每个配置集存储在其自己的子目录中。该配置集包括名为 tuned.conf 的配置集配置文件,以及其他文件,如帮助程序脚本。另外,要自定义配置集,请将配置集目录复制到 /etc/tuned/profiles 中,它将存储与自定义配置集相关的文件。如果存在具有相同名称的配置集,则位于 /etc/tuned/profiles 中的自定义配置集会具有优先权。
先决条件
- 您有管理特权。
流程
安装 TuneD 软件包:
# dnf install tuned启用并启动 TuneD 服务:
# systemctl enable --now tuned可选:为实时系统安装 TuneD 配置集:
对于实时系统的 TuneD 配置集,启用
rhel-10存储库。# subscription-manager repos --enable=rhel-10-for-x86_64-nfv-beta-rpms # dnf install tuned-profiles-realtime tuned-profiles-nfv
验证
验证配置集是否活跃并应用:
$ tuned-adm active Current active profile: throughput-performance $ tuned-adm verify Verification succeeded, current system settings match the preset profile. See tuned log file ('/var/log/tuned/tuned.log') for details.
2.4. 管理 TuneD 配置集 复制链接链接已复制到粘贴板!
您可以在 Red Hat Enterprise Linux 系统中管理 TuneD 配置集,包括列出可用配置集、设置特定配置集以及根据需要禁用 TuneD。正确管理配置集可优化特定工作负载的系统性能,如将 cpu-partitioning 配置集用于低延迟应用程序。
先决条件
- 已安装并启用了 TuneD。
- 您有管理特权。
流程
列出所有可用的预定义的 TuneD 配置集:
$ tuned-adm list可选: 要让 TuneD 为您的系统推荐最合适的配置集,请使用以下命令:
# tuned-adm recommend throughput-performance激活配置文件:
# tuned-adm profile selected-profile另外,您可以激活多个配置文件的组合:
# tuned-adm profile selected-profile1 selected-profile2查看系统中的当前活跃的 TuneD 配置集:
# tuned-adm active Current active profile: selected-profile临时禁用所有调整:
# tuned-adm off The tunings are applied again after the TuneD service restarts.可选:永久停止并禁用 TuneD 服务:
# systemctl disable --now tuned
2.5. 配置集继承和变量用于配置集自定义 复制链接链接已复制到粘贴板!
TuneD 支持配置集继承、变量使用和内置功能来有效地创建新或修改现有配置集。
预安装和自定义配置集位于以下目录中:
-
预安装的配置文件:包括在
/usr/lib/tuned/profiles/中 自定义配置集:在
/etc/tuned/profiles/中创建- 配置文件继承
调优配置集可以使用 [main] 部分中的 include 选项继承其他配置集的设置。配置集继承意味着子配置集继承其父级中的所有设置,但可以根据自定义要求覆盖或添加新参数。例如,要基于 balanced 配置集创建一个配置集,它还会将 ALPM 设置为 min_power 而不是 medium_power,它最初由 balanced 配置集设置,请使用:
[main] include=balanced [scsi_host] alpm=min_power- 在自定义配置集时使用变量
您可以在自定义配置集时定义变量。通过减少重复定义,变量有助于简化配置。您可以通过在配置集中创建
[variables]部分来定义您自己的变量:[variables] variable_name=value要扩展配置集中的变量的值,请使用:
${variable_name}您还可以通过将 filepath 添加到 变量文件,并在自定义配置文件时使用这些变量。例如,您可以在配置文件中添加以下行,以考虑独立文件中的变量:
tuned.conf: [variables] include=/etc/tuned/my-variables.conf [bootloader] cmdline=isolcpus=${isolated_cores}其中
isolated_cores=1,2在 my-variable.conf 文件中添加,如下所示:
my-variable.conf: isolated_cores=1,2
2.6. 用于配置集自定义的内置功能 复制链接链接已复制到粘贴板!
您可以在激活配置集时,使用 TuneD 配置集中的内置功能在运行时动态扩展。将内置函数与 TuneD 变量一起使用,在配置集中动态修改和处理值。另外,您可以通过创建自定义功能来扩展 TuneD,方法是创建并集成自定义 Python 功能作为插件。
- 启动内置功能的语法
${f:function_name:argument_1:argument_2}另外,要检索配置集和 tuned.conf 文件所在的目录路径,请使用
PROFILE_DIR变量,这需要以下语法:${i:PROFILE_DIR}- 使用内置功能隔离 CPU 内核的示例
[variables] non_isolated_cores=0,3-5 [bootloader] cmdline=isolcpus=${f:cpulist_invert:${non_isolated_cores}}在本例中,
${non_isolated_cores}变量扩展至0,3-5。cpulist_invert函数反转 CPU 列表。在有 6 个 CPU 的系统上,03-5反转为1,2,导致内核通过isolcpus=1,2选项引导。
| 功能名称 | 描述 |
|---|---|
| assertion | 比较两个参数。如果不匹配,函数会记录来自第一个参数的文本,并中止配置集加载。 |
| assertion_non_equal | 比较两个参数。如果匹配,函数会记录来自第一个参数的文本,并中止配置集加载。 |
| calc_isolated_cores | 计算并返回隔离内核。参数指定要为内务保留的每个插槽的内核数。如果没有指定,则每个插槽保留一个核心用于内务,其余则被隔离。 |
| check_net_queue_count | 检查用户是否已为网络设备指定队列计数。如果没有,它将返回内务 CPU 的数量。 |
| cpuinfo_check | 根据 /proc/cpuinfo 检查正则表达式。接受形式的参数:REGEX1, STR1, REGEX2, STR2, …[, STR_FALLBACK]。如果 REGEX1 匹配 /proc/cpuinfo 中的内容,它将扩展至 STR1;如果 REGEX2 匹配,则会扩展到 STR2。它将停止第一个匹配项。如果没有匹配正则表达式,它将扩展至 STR_FALLBACK 或空字符串(如果没有提供回退)。 |
| cpulist2devs | 将 CPU 列表转换为设备字符串。 |
| cpulist2hex | 将 CPU 列表转换为十六进制 CPU 掩码。 |
| cpulist2hex_invert | 将 CPU 列表转换为十六进制 CPU 掩码并进行反转。 |
| cpulist_invert | 颠倒 CPU 列表,使其补充。例如,在有 4 个 CPU (0-3)的系统中,列表 0,2,3 的 inversion 为 1。 |
| cpulist_online | 检查列表中的 CPU 是否在线。返回仅包含在线 CPU 的列表。 |
| cpulist_pack | 将 CPU 列表打包为 1,2,3,5 到 1-3,5。 |
| cpulist_present | 检查列表中是否存在 CPU。返回只包含当前 CPU 的列表。 |
| cpulist_unpack | 解包 CPU 列表,格式为 1-3,4 到 1,2,3,4。 |
| exec | 执行进程并返回其输出。 |
| hex2cpulist | 将十六进制 CPU 掩码转换为 CPU 列表。 |
| intel_recommended_pstate |
检查处理器代码名称,并返回推荐的 |
| iscpu_check |
根据 的输出检查 |
| package2cpus | 提供软件包(套接字)的 CPU 设备列表。 |
| package2uncores | 为软件包(套接字)提供非核心设备列表。 |
| regex_search_ternary |
Ternary 正则表达式运算符。采用以下格式的参数:STR1、REGEX、STR2、STR3。如果 REGEX 匹配 STR1 (使用了 |
| log | 扩展至参数串联并记录结果,有助于调试。 |
| kb2s | 将 KB 转换为磁盘扇区。 |
| s2kb | 将磁盘扇区转换为 KB。 |
| strip | 从所有传递的参数创建字符串,并删除前导和尾随空格。 |
| virt_check | 检查 TuneD 是否在虚拟机(VM)或裸机中运行。在虚拟机内部,函数返回第一个参数。在裸机上,函数返回第二个参数,即使出现错误。 |
2.7. TuneD 插件 复制链接链接已复制到粘贴板!
调优配置集使用插件来监控或优化系统上的不同设备。TuneD 使用两种类型的插件:
- 监控插件
- 用于收集系统数据,如 CPU 负载、磁盘 I/O 和网络流量。通过调优插件进行动态调优,可以使用监控插件的输出。当任何已启用的调优插件需要指标数据时,监控插件会自动实例化。可用的监控插件有:
disk- 每个设备获取磁盘负载(IO 操作数)和测量间隔。
net- 每个网卡获取网络负载(传输数据包的数量)和测量间隔。
load- 获取每个 CPU 的 CPU 负载和测量间隔。
- 调优插件
- 每个调优插件调整单个子系统,并获取从 TuneD 配置集填充的多个参数。每个子系统可以有多个设备,如多个 CPU 或网卡,由各个调优插件实例处理。还支持单个设备的具体设置。可用的调优插件有:
acpi-
配置 ACPI 驱动程序。使用
platform_profile选项设置 ACPI 平台配置集sysfs属性。它是用于其他驱动程序的通用电源/性能首选项 API。可以指定多个配置集,用|分隔。选择了第一个可用的配置文件。 audio-
将音频 codecs 的 autosuspend timeout 设置为 timeout 选项指定的值。目前,支持
snd_hda_intel和snd_ac97_codeccodec。值 0 表示禁用自动暂停。您还可以通过将 布尔值选项 reset_controller 设置为true来强制控制器重置。 bootloader-
在内核命令行中添加选项。这个插件只支持 GRUB 引导装载程序。
grub2_cfg_file选项可以指定 GRUB 配置文件的自定义非标准位置。内核选项会添加到当前 GRUB 配置及其模板中。需要重新引导系统才能使内核选项生效。 cpu- 通过将 CPU 调控器设置为 governor 选项指定的值,并根据 CPU 负载动态更改电源管理服务质量(PM QoS) CPU Direct Memory Access (DMA)延迟来管理 CPU 调控器和电源设置。
disk-
管理磁盘设置,如
apm,scheduler_quantum,readahead,readahead_multiply,spindown。 eeepc_she- 根据 CPU 负载动态设置前端总线 (FSB) 速度。
irq-
可以定义单独的中断请求(IRQ)作为设备,并且可以定义多个插件实例,每个插件实例都处理不同的设备或 irqs。插件使用的设备名称是
irq<n>,其中 <n> 是 IRQ 号。特殊设备DEFAULT控制写入/proc/irq/default_smp_affinity的值,它适用于所有非主动 IRQ。 irqbalance-
管理
irqbalance的设置。该插件配置 CPU,应在/etc/sysconfig/irqbalance中重新平衡 IRQ 时跳过。然后,只有在之前运行时才重启 irqbalance。 modules-
应用自定义内核模块选项。它可以将参数设置为内核模块并创建
/etc/modprobe.d/tuned.conf文件。语法是module=option1=value1 选项2=value2…,其中module是模块名称,而optionx=valuex是可能存在的模块选项。 mounts- 为挂载的文件系统启用或禁用障碍。
net- 使用与 ethtool 工具相同的语法配置 Wake-on-LAN 和接口速度。另外,根据接口利用率动态更改接口速度。
rtentsk- 避免启用或禁用静态密钥导致的处理器中断。它没有选项。包含后,TuneD 会保留一个启用时间戳的打开套接字,从而保持静态密钥。
selinux-
调优 SELinux 选项。SELinux 决策(如允许或拒绝访问)会被缓存。这个缓存被称为 Access Vector Cache(AVC)。通过使用这些缓存的决定,可以较少对 SELinux 策略规则的检查,这会提高性能。
avc_cache_threshold选项允许调整 AVC 条目的最大数量。 systemd-
调优 systemd 选项。
cpu_affinity选项允许在/etc/systemd/system.conf中设置 CPUAffinity。这会为服务管理器配置 CPU 关联性,以及所有 fork 关闭进程的默认 CPU 关联性。添加以逗号分隔的 CPU 列表,它带有由减号(-)指定的可选 CPU 范围。 scsi_host-
调优 SCSI 主机设置(例如
ALPM)。 scheduler- 提供用于调度优先级的调优、CPU 核隔离和进程、线程以及 IRQ 关联性的各种选项。
script- 在载入或卸载配置集时运行外部脚本或二进制脚本。
service- 处理由插件选项指定的各种 sysvinit、sysv-rc、openrc 和 systemd 服务。支持的服务处理命令包括 start、stop、enable 和 disable。
sysctl-
修改内核参数。只有在您要更改 TuneD 中其他插件未涵盖的系统设置时,才使用这个插件。语法为 name=value,其中 name 与
sysctl实用程序提供的名称相同。 sysfs-
设置由插件选项指定的各种
sysfs设置。语法为 name=value,其中 name 是要使用的sysfs路径。 usb-
调整 USB 自动暂停超时。值
0表示禁用自动暂停。 Uncore-
限制最大和最小非核心频率。选项
max_freq_khz,min_freq_khz对应于由 Intel uncore 频率驱动程序公开的sysfs文件。其值可以在 kHz 中指定,也可以将其值指定为其可配置范围的百分比。 video-
在视频卡中设置各种电源保存级别。目前,只支持
Radeon卡。可以使用radeon_选项指定节能级别。支持的值有, default, auto, low, mid, high, dynpm, dpm-battery, dpm-balanced, 和 dpm-perfomance。powersave vm-
启用或禁用透明大内存页。transparent_hugepages 选项的有效值为:
always, never, madvise。
2.8. 创建新的 TuneD 配置集 复制链接链接已复制到粘贴板!
您可以创建一个新的 TuneD 配置集来自定义性能优化的要求。
先决条件
- TuneD 服务正在运行。详情请参阅安装和启用 TuneD。
流程
在 /etc/tuned/profiles 目录中,创建一个名为您要创建的配置集的新目录:
# mkdir /etc/tuned/profiles/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-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.
2.9. 修改现有 TuneD 配置集 复制链接链接已复制到粘贴板!
您可以修改现有配置集的参数以符合您的自定义要求。可以根据现有的 TuneD 配置集创建修改后的子配置集。
先决条件
- TuneD 服务正在运行。详情请参阅 安装和启用 TuneD。
流程
在
/etc/tuned/profiles目录中,创建一个名为您要创建的配置集的新目录:# mkdir /etc/tuned/profiles/modified-profile在新目录中,创建一个名为
tuned.conf的文件,并将 [main] 部分设置为如下:[main] include=parent-profile使用您要修改的配置集的名称替换 parent-profile,例如:
throughput-performance包括您的配置文件修改。例如,要在
throughput-performance配置集中降低 swappiness,将vm.swappiness的值改为5,而不是默认的10,请使用:[main] include=throughput-performance [sysctl] vm.swappiness=5激活配置文件。
# tuned-adm profile modified-profile
验证
查看配置集处于活跃状态并应用:
$ tuned-adm active Current active profile: modified-profile $ tuned-adm verify Verification succeeded, current system settings match the preset profile. See tuned log file ('/var/log/tuned/tuned.log') for details.
2.10. 启用 TuneD no-daemon 模式 复制链接链接已复制到粘贴板!
TuneD 可以在 no-daemon 模式下运行,它不需要任何常驻内存。在这个模式中,TuneD 应用设置,然后退出。但请注意,此模式禁用某些功能,包括用于设置的 D-Bus 支持、热插拔支持和回滚功能。
先决条件
- 您有 root 权限或适当的权限来修改系统配置。
流程
使用以下更改编辑
/etc/tuned/tuned-main.conf文件:sudo vi /etc/tuned/tuned-main.conf daemon = 0- 保存并关闭该文件。
重启 tuned 服务或重新应用或切换配置集:
# systemctl restart tuned # tuned-adm profile <tuned_profile>验证 tuned 状态:
# tuned-adm active It seems that tuned daemon is not running, preset profile is not activated. Preset profile: <tuned_profile>
第 3 章 设置磁盘调度程序 复制链接链接已复制到粘贴板!
磁盘调度程序负责对提交至存储设备的 I/O 请求进行排序。您可以通过几种不同方式配置调度程序:
- 使用 TuneD 设置调度程序,如使用 TuneD 设置磁盘调度程序 中所述。
-
使用
udev规则设置调度程序,如使用udev规则设置磁盘调度程序 中所述。 - 在运行中的系统上临时更改调度程序,如临时性 为特定磁盘 设置调度程序 中所述。
在 Red Hat Enterprise Linux 中,块设备只支持多队列调度。这可让块层性能针对使用快速固态驱动器(SSD)和多核系统进行正常扩展。
3.1. 可用磁盘调度程序 复制链接链接已复制到粘贴板!
Red Hat Enterprise Linux 支持以下多队列磁盘调度程序:
none- 实施第一出 (FIFO) 调度算法。它将请求合并到通用块层,并通过一个简单的最近缓存来合并。
mq-deadline尝试为请求到达调度程序的时间点提供有保证的延迟。mq-deadline 调度程序将排队的 I/O 请求分为读取或写入批处理,然后调度它们以增加逻辑块寻址(LBA)顺序执行。默认情况下,读取批处理的优先级高于写入批处理,因为应用程序更有可能阻止读 I/O 操作。在 mq-deadline 批处理后,它会检查写操作在处理器时间耗尽的时间,并根据情况调度下一个读取或写入批处理。
这个调度程序适用于大多数用例,特别是那些写入操作是异步的。
bfq以桌面系统和互动任务为目标。
bfq调度程序可确保任何单个应用程序都不会使用所有带宽。实际上,存储设备总是像它们处于空闲时一样进行响应。在其默认配置中,bfq注重提供最低延迟,而不是达到最大吞吐量。BFQ基于cfq代码。它不会为每个进程授予固定时间片段,而是为进程分配一个以扇区数衡量的预算。在复制大型文件时,这个调度程序不适用。kyber- 调度程序调整自身,以通过计算提交到块 I/O 层的每个 I/O 请求的延迟来实现延迟目标。您可以为读取配置目标延迟,如 cache-misses 和同步写入请求。此调度程序适用于快速设备,如 NVMe、SSD 或其他低延迟设备。
- 默认磁盘调度程序
- 块设备使用默认的磁盘调度程序,除非您指定了另一个调度程序。
具体来说,对于非易失性内存 Express (NVMe)块设备,默认调度程序为 none,红帽建议不更改它。
内核会根据设备类型选择默认磁盘调度程序。自动选择调度程序通常是最佳设置。如果您需要不同的调度程序,请使用 udev 规则或 TuneD 应用程序来配置它。匹配所选设备并只为那些设备切换调度程序。
3.2. 不同用例的磁盘调度程序 复制链接链接已复制到粘贴板!
根据系统执行的任务,在任何分析和调整任务前,使用以下磁盘调度程序作为基准:
| 使用案例 | 磁盘调度程序 |
|---|---|
| 传统的使用 SCSI 接口的 HDD |
使用 |
| 高性能 SSD 或具有快速存储的 CPU 绑定系统 |
使用 |
| 桌面或互动任务 |
使用 |
| 虚拟客户端 |
使用 |
3.3. 确定活跃磁盘调度程序 复制链接链接已复制到粘贴板!
您可以查看当前在给定块设备中活跃的磁盘调度程序。
流程
读取
/sys/block/device/queue/scheduler文件的内容:# cat /sys/block/device/queue/scheduler [mq-deadline] kyber bfq none在文件名中,将 device 替换为块设备名称,如
sdc。活跃的调度程序列在方括号中 ([ ]) 。
3.4. 使用 TuneD 设置磁盘调度程序 复制链接链接已复制到粘贴板!
您可以创建并启用 TuneD 配置集,为所选块设备设置给定磁盘调度程序。这个设置会在系统重启后保留。在以下命令和配置中替换:
-
带有块设备名称的 device,如
sdf和 - 带有您要为设备设置的磁盘调度程序的 selected-scheduler,如 bfq。
先决条件
- TuneD 服务已安装并启用。详情请参阅安装和启用 TuneD。
流程
- 可选:选择一个您的配置集将基于的现有 TuneD 配置集。有关可用配置集列表,请参阅 RHEL 提供的 TuneD 配置集。
要查看哪个配置文件当前处于活跃状态,请使用:
# tuned-adm active创建一个新目录来保存 TuneD 配置集:
# mkdir /etc/tuned/<new-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 命令返回的任何值都可以接受用作设备系统的唯一 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)
启用您的配置文件:
# tuned-adm profile <new-profile>
验证
验证 TuneD 配置文件是否活跃并应用:
$ tuned-adm active Current active profile: <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/device/queue/scheduler文件的内容:$ cat /sys/block/device/queue/scheduler [mq-deadline] kyber bfq none在文件名中,将 device 替换为块设备名称,如 sdc。活跃的调度程序列在方括号中 (
[]) 。
3.5. 使用 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 命令返回的任何值都可以接受用作设备系统的唯一 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
3.6. 为特定磁盘临时设置调度程序 复制链接链接已复制到粘贴板!
您可以为特定块设备设置给定磁盘调度程序。系统重启后该设置不会保留。
流程
将所选调度程序的名称写入
/sys/block/device/queue/scheduler文件:# echo selected-scheduler > /sys/block/device/queue/scheduler在文件名中,将 device 替换为块设备名称,如 sdc。
验证
验证调度程序是否在设备上活跃。
# cat /sys/block/device/queue/scheduler
第 4 章 设置 PCP 复制链接链接已复制到粘贴板!
Performance Co-Pilot (PCP) 是用于监控、视觉化、存储和分析系统级性能测量的工具、服务和库集。您可以使用 Python、Perl、C 和 C 接口添加性能指标。分析工具可以直接使用 Python、C、C 客户端 API,丰富的 Web 应用程序可以使用 JSON 界面探索所有可用的性能数据。您可以通过将实时结果与存档数据进行比较来分析数据模型。
- PCP 的功能
- 在复杂系统的集中式分析过程中,轻量级分布式架构非常有用。
- 监控和管理实时数据的能力。
- 能够记录和检索历史数据。
- PCP 具有以下组件
- Performance Metric Collector Daemon (pmcd)从已安装的性能指标域代理(PMDA)收集性能数据。PMDA 可以单独加载或卸载在系统上,并由同一主机上的 PMCD 控制。
-
pminfo或pmstat等各种客户端工具可以检索、显示、存档和处理同一主机或网络上的此数据。 -
pcp和pcp-system-tools软件包提供了命令行工具和核心功能。 -
pcp-gui软件包提供了图形应用程序 pmchart。 -
grafana-pcp软件包通过 Grafana 提供强大的基于 Web 的可视化和警报。
4.1. 安装并启用 PCP 复制链接链接已复制到粘贴板!
安装所需的软件包,并启用 PCP 监控服务开始使用它。您还可以使用 pcp-zeroconf 软件包自动执行 PCP 安装。有关使用 pcp-zeroconf 安装 PCP 的更多信息,请参阅使用 pcp-zeroconf 设置 PCP。
流程
安装 pcp 软件包:
# dnf install pcp在主机机器上启用并启动 pmcd 服务:
# systemctl enable pmcd # systemctl start pmcd
验证
验证 PMCD 进程是否在主机上运行:
# pcp Performance Co-Pilot configuration on arm10.local: platform: Linux arm10.local 6.12.0-55.13.1.el10_0.aarch64 #1 SMP PREEMPT_DYNAMIC Mon May 19 07:29:57 UTC 2025 aarch64 hardware: 4 cpus, 1 disk, 1 node, 3579MB RAM timezone: JST-9 services: pmcd pmcd: Version 6.3.7-1, 12 agents, 6 clients pmda: root pmcd proc pmproxy xfs linux nfsclient mmv kvm jbd2 dm openmetrics
4.2. 部署最小 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- 执行所需的操作来记录性能数据。
保存输出并将其保存到根据主机名和当前日期和时间命名的 tar.gz 文件中:
# cd /var/log/pcp/pmlogger/ # tar -czf $(hostname).$(date +%F-%Hh%M).pcp.tar.gz $(hostname)- 使用 PCP 工具提取此文件并分析数据。
4.3. 系统服务和使用 PCP 分发的工具 复制链接链接已复制到粘贴板!
基本软件包 pcp 包括系统服务和基本工具。您可以安装由 pcp-system-tools、pcp-gui 和 pcp-devel 软件包提供的其他工具。
PCP 分发的系统服务的角色
pmcd- Performance Metric Collector Daemon.
pmie- 性能指标对引擎.
pmlogger- 性能指标日志记录器。
pmproxy- 实时和历史性能指标代理、时间序列查询和 REST API 服务。
使用基本 PCP 软件包分发的工具
+ PCP :: 显示 Performance Co-Pilot 安装的当前状态。
pcp-check-
激活或取消激活核心和可选组件,如
pmcd、pmpmlogger、pmproxy和 PMDA。 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 归档文件的标签。
pmlogsummary- 计算 Performance Co-Pilot 归档文件中存储性能指标的统计信息。
pmprobe- 决定性能指标的可用性。
pmsocks- 允许访问通过防火墙托管的 Performance Co-Pilot。
pmstat- 定期显示系统性能的简短摘要。
pmstore- 修改性能指标的值。
pmseries- 使用 PCP 功能和分布式键值数据存储(如 Valkey )的快速、可扩展的时间序列查询。
pmtrace- 提供一个命令行界面来跟踪 PMDA 。
pmval- 更新显示任何性能指标的当前值。
与单独安装的 pcp-system-tools 软件包一起分发的工具
pcp-atop- 从性能角度显示最重要的硬件资源的系统级别:CPU、内存、磁盘和网络。
pcp-atopsar- 在各种系统资源使用率上生成系统级活动报告。这个报告从之前使用 pmlogger 或 pcp-atop 的 -w 选项记录的原始日志文件生成。
pcp-dmcache- 显示有关配置的设备映射缓存目标的信息,例如:设备 IOP、缓存和元数据设备利用率,以及在每次缓存设备的读写率和比率。
pcp-dstat- 一次显示一个系统的指标。要显示多个系统的指标,请使用 --host 选项。
pcp-free- 报告系统中的空闲和已用内存。
pcp-htop- 以类似于 top 命令的方式显示系统上运行的所有进程及其命令行参数,但允许您使用鼠标进行垂直和水平滚动。您还可以以树形格式查看进程,并同时对多个进程选择和实施。
pcp-ipcs- 显示调用进程具有读访问权限的进程间通信(IPC)工具的信息。
pcp-mpstat- 报告 CPU 和与中断相关的统计信息。
pcp-numastat- 显示内核内存分配器的 NUMA 分配统计信息。
pcp-pidstat- 显示系统上运行的各个任务或进程的信息,如 CPU 百分比、内存和堆栈使用率、调度和优先级。报告默认情况下本地主机的实时数据。
pcp-shping- 对通过 pmdashping 性能指标域代理(PMDA)导出的 shell 生成服务指标进行抽样并报告。
pcp-ss- 显示 pmdasockets PMDA 收集的套接字统计信息。
pcp-tapestat- 报告磁带设备的 I/O 统计信息。
pcp-uptime- 显示系统正在运行的时长,当前登录的用户数量,以及过去 1、5 和 15 分钟的系统负载平均值。
pcp-verify- 检查 Performance Co-Pilot 收集器安装的各个方面,并报告是否为某些操作模式正确配置了。
pcp-iostat- 报告 SCSI 设备的 I/O 统计信息(默认为 )或设备映射器设备(使用 -x device-mapper 选项)。
pmrep- 报告选定、易于自定义、性能指标值。
与单独安装的 pcp-gui 软件包一起分发的工具
pmchart- 通过 PCP 的工具绘制性能指标值。
pmdumptext- 输出从 PCP 归档收集的性能指标值。
与单独安装的 pcp-devel 软件包一起分发的工具
pmclient- 使用性能指标应用程序编程接口 (PMAPI) 显示高级系统性能指标。
pmdbg- 显示可用的 Performance Co-Pilot 调试控制标记及其值。
pmerr- 显示可用的 Performance Co-Pilot 错误代码及其对应的错误消息。
pcp-xsos- 使用从 PCP 归档或来自该系统的实时指标值获取的单一示例为系统提供一个快速摘要报告。
作为单独的软件包分发的其他工具
pcp-geolocate- 发现收集器系统地理标签。
pcp2openmetrics- 自定义性能指标导出器工具从 PCP 到 Open Metrics 格式。您可以使用命令行参数或配置文件选择任何可用的性能指标、实时或存档、系统和应用程序来导出。
4.4. PCP 部署架构 复制链接链接已复制到粘贴板!
PCP 根据 PCP 部署规模支持多个部署架构,并提供许多选项来完成高级设置。可用的扩展部署设置变体(根据调整因素和配置选项决定),包括:
- Localhost
- 每个服务在被监控的机器上本地运行。在没有任何配置更改的情况下启动服务会导致 localhost 上的默认独立部署。此设置不支持在单一节点之外进行扩展。但是,Valkey 也可以以高可用性和可扩展的集群模式运行,其中数据在多个主机间共享。您还可以在云中部署 Valkey 集群,或使用云供应商的受管 Valkey 集群。
- Decentralized
- localhost 和分散设置之间的唯一区别是集中式 Valkey 服务。在此模型中,主机在每个被监控的主机上执行 pmlogger 服务,并从本地 pmcd 实例检索指标。然后本地 pmproxy 服务将性能指标导出到中央 Valkey 实例。
图 4.1. 分散日志记录
- 集中式日志记录 - pmlogger 场
- 当被监控主机的资源使用情况受限时,另一个部署选项是一个 pmlogger 场,也称为集中式日志记录。在此设置中,单个日志记录器主机执行多个 pmlogger 进程,各自配置为从不同的远程 pmcd 主机检索性能指标。集中式日志记录器主机也配置为执行 pmproxy 服务,该服务可发现生成的 PCP 归档日志并将指标数据加载到 Valkey 实例中。
图 4.2. 集中式日志记录 - pmlogger 场
- 联邦 - 多个 pmlogger farms
- 对于大规模部署,以联邦方式部署多个 pmlogger farm。例如,每个机架或数据中心一个 pmlogger farm。每个 pmlogger farm 将指标加载到中央 Valkey 实例中。
图 4.3. 联邦 - 多个 pmlogger farms
默认情况下,Valkey 的部署设置是单机的 localhost。但是,Valkey 可以选择性地以高可用性和高度可扩展的集群方式执行,其中数据在多个主机之间共享。另一个可行选项是在云中部署 Valkey 集群,或者使用云供应商提供的受管 Valkey 集群。
4.5. 影响 PCP 日志记录中扩展的因素 复制链接链接已复制到粘贴板!
影响 Performance Co-Pilot (PCP)日志记录的关键因素是硬件资源、记录的指标、日志记录间隔和升级后归档管理。
- 远程系统大小
-
远程系统的硬件配置(如 CPU、磁盘和网络接口的数量)直接影响中央日志记录主机上每个
pmlogger实例收集的数据卷。 - 日志记录的指标
-
日志记录的指标的数量和类型对存储要求有很大影响。特别是,
per-process procaws 指标需要大量的磁盘空间,例如,标准 pcp-zeroconf 设置,10s 日志记录间隔,11 MB,但没有 proc 指标,但增加到 155 MB,启用了 proc 指标。此外,每个指标的实例数量,如 CPU、块设备和网络接口的数量也会影响存储容量需求。 - 日志记录间隔
-
指标日志记录的频率决定了存储使用量。每个
pmlogger实例的预期每日 PCP 归档文件大小记录在pmlogger.log文件中。这些估计代表未压缩数据,但由于 PCP 存档通常达到 10:1 的压缩率,因此可以相应地计算长期磁盘空间要求。 - 使用 pmlogrewrite 管理归档更新
- 在每个 PCP 升级后,如果在不同版本之间的指标元数据中检测到更改,则 pmlogrewrite 工具会更新现有的存档。这个过程所需的时间随着存储的存档数量线性扩展。
第 5 章 配置 pmda-openmetrics 复制链接链接已复制到粘贴板!
Performance Co-Pilot (PCP)是一个灵活且可扩展的系统,用于监控和管理系统性能。它包括几个内置代理,称为 Performance Metric Domain Agents (PMDA),用于从常用的应用程序和服务(如 PostgreSQL、Apache HTTPD 和 KVM 虚拟机)收集指标。
5.1. pmda-openmetrics 概述 复制链接链接已复制到粘贴板!
您可以运行红帽仓库中没有开箱即用的 PMDA 的自定义或不太常见的应用程序。在这种情况下,pmda-openmetrics 代理有助于缩小差距。pmda-openmetrics PMDA 通过将 OpenMetrics 风格的文本文件转换为与 PCP 兼容的指标,从任意应用程序公开性能指标。OpenMetrics 是 Prometheus 和其他监控工具使用的广泛采用的格式,可简化集成。
您可以运行 pmda-openmetrics 来执行以下任务:
- 监控现有 PMDA 未涵盖的自定义应用程序。
-
将现有的 OpenMetrics 或
Prometheus 导出的指标集成到 PCP 框架中。 - 创建快速模型或测试指标,用于诊断或演示目的。
5.2. 安装和配置 pmda-openmetrics 复制链接链接已复制到粘贴板!
您必须先安装并配置 pmda-openmetrics,然后才能开始使用它。以下示例演示了如何使用 pmda-openmetrics 将文本文件中的单个数字值公开为 PCP 指标。
先决条件
-
PCP 已安装,
pmcd正在运行。如需更多信息,请参阅使用 pcp-zeroconf 设置 PCP。
流程
安装
pmda-openmetricsPMDA。# dnf -y install pcp-pmda-openmetrics # cd /var/lib/pcp/pmdas/openmetrics/ # ./Install创建一个示例 OpenMetrics 文件。
# echo 'var1 {var2="var3"} 42' > /tmp/example.txt将 示例.txt 替换为所需的文件名。
验证该文件是否已正确创建。
# cat /tmp/example.txt使用 OpenMetrics 代理注册指标文件路径。
# echo "file:///tmp/example.txt" > /etc/pcp/openmetrics/example.url验证配置是否已正确创建。
# cat /etc/pcp/openmetrics/example.url配置
systemd-xetex 以创建必要的符号链接。# echo 'L+ /var/lib/pcp/pmdas/openmetrics/config.d/example.url - - - - ../../../../../../etc/pcp/openmetrics/example.url' \ > /usr/lib/tmpfiles.d/pcp-pmda-openmetrics-cust.conf验证符号链接是否已正确配置。
# cat /usr/lib/tmpfiles.d/pcp-pmda-openmetrics-cust.conf通过应用 NVME 配置来创建符号链接。
# systemd-tmpfiles --create --remove /usr/lib/tmpfiles.d/pcp-pmda-openmetrics-cust.conf验证符号链接是否已正确创建。
# ls -al /var/lib/pcp/pmdas/openmetrics/config.d/验证指标是否已正确报告。
# pminfo -f openmetrics.example.var1 inst [0 or "0 var2:var3"] value 42
验证
-
运行
pcp并确认列出了openmetrics。 -
运行
systemd-analyze cat-config mtc.d,并确认输出中的示例.url。 -
使用
pminfo确认指标的存在和值。
第 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 -r /var/lib/pcp/config/pmlogger/config.default Group: per logical block device activity Log this group? [y] Logging interval? [default]
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;
6.3. 启用 pmlogger 服务 复制链接链接已复制到粘贴板!
必须启动并启用 pmlogger 服务,以记录本地计算机上的指标值。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
流程
启动并启用
pmlogger服务:# systemctl start pmlogger # systemctl enable pmlogger
验证
验证
pmlogger服务是否已启用:# pcp platform: Linux arm10.local 6.12.0-55.13.1.el10_0.aarch64 #1 SMP PREEMPT_DYNAMIC Mon May 19 07:29:57 UTC 2025 aarch64 hardware: 4 cpus, 1 disk, 1 node, 3579MB RAM timezone: JST-9 services: pmcd pmcd: Version 6.3.7-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/arm10.local/20250529.15.49 pmie: primary engine: /var/log/pcp/pmie/arm10.local/pmie.log如需更多信息,请参阅
/var/lib/pcp/config/pmlogger/config.default文件。
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。配置防火墙以永久添加公共区:
# 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))
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使用客户端 IP 地址替换 192.168.4.13、192.168.4.14 和 192.168.4.62。
启用 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/目录中的存档文件可用于进一步分析和显示。
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 .service 单元本身所需的pmlogger_farm_check.timerpmlogger_farm.service单元要求。
这些服务通过一系列正依赖项进行管理,这意味着它们在激活主 pmlogger 实例时都启用。请注意,虽然 pmlogger_daily.service 默认被禁用,但 pmlogger_daily.timer 通过 pmlogger.service 的依赖项被激活将触发 pmlogger_daily.service 运行。
pmlogger_daily 也与 pmlogrewrite 集成,以便在合并前自动重写存档。这有助于确保元数据在更改生产环境和 PMDA 时的一致性。例如,如果在日志间隔期间更新一个监控的主机上的 pmcd,则主机上一些指标的语义可能会被更新,从而使新存档与该主机上之前记录的存档不兼容。如需更多信息,请参阅系统中的 pmlogrewrite (1) 手册页。
6.7. 管理 pmlogger 触发的 systemd 服务 复制链接链接已复制到粘贴板!
您可以使用控制文件为 pmlogger 实例收集的数据创建一个自动自定义归档管理系统。
主 pmlogger 实例必须与它连接的 pmcd 运行在同一主机上。您不需要有一个主实例,如果一个中央主机在连接到远程主机上运行的 pmcd 实例的多个 pmlogger 实例上收集数据,则您可能不需要它。
流程
执行以下操作之一:
-
对于主 pmlogger 实例,请使用
/etc/pcp/pmlogger/control.d/local 对于远程主机,请使用
/etc/pcp/pmlogger/control.d/remote将 remote 替换为您需要的文件名。
文件应为要记录的每个主机包含一行。自动创建的主记录器实例的默认格式类似如下:
# === 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协议通过 firewall、y 或 not 连接到pmcd。 - directory
- 与此行关联的所有存档都会在此目录中创建。
- args
-
传递给
pmlogger的参数。args字段的默认值有: - -r
- 报告存档大小和增长率。
- T24h10m
-
指定每天何时结束记录日志。这通常是
pmlogger_daily.service运行时的时间。默认值24h10m表示日志记录最迟应当在开始后 24 小时 10 分钟结束。 - -c config.default
- 指定要使用哪个配置文件。这实际上定义了要记录哪个指标。
- -v 100Mb
-
指定一个数据卷被填充和另一个数据被创建的大小。切换到新存档后,之前记录的存档将被
pmlogger_daily或pmlogger_check压缩。
-
对于主 pmlogger 实例,请使用
6.8. 使用 pmrep 重现 PCP 日志存档 复制链接链接已复制到粘贴板!
记录指标数据后,您可以重新执行 PCP 日志存档。要将日志导出到文本文件并将其导入到电子表格中,请使用 pcp2csv、pcp2xml、pmrep 或 pmlogsummary 等。通过使用 pmrep 工具,您可以:
- 查看日志文件。
- 解析所选 PCP 日志存档,并将值导出到 ASCII 表中。
- 通过在命令行中指定单个指标,从日志中提取整个存档日志或仅从日志中选择指标值。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
-
pmlogger服务已启用。如需更多信息,请参阅启用 pmlogger 服务。 已安装
pcp-gui软件包。# 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这个示例
以逗号分隔的值格式显示存档中收集到的disk.dev.write指标中的数据。将此示例中的 20211128 替换为包含您要显示数据的pmlogger存档的文件名。
第 7 章 使用 Performance Co-Pilot 监控性能 复制链接链接已复制到粘贴板!
Performance Co-Pilot (PCP) 是用于监控、视觉化、存储和分析系统级性能测量的工具、服务和库集。作为系统管理员,您可以使用 Red Hat Enterprise Linux 中的 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 Verify the available metrics: # pminfo postfix postfix.received postfix.sent postfix.queues.incoming postfix.queues.maildrop postfix.queues.hold postfix.queues.deferred postfix.queues.active
7.2. 使用 PCP Charts 应用程序可视化追踪 PCP 日志存档 复制链接链接已复制到粘贴板!
记录指标数据后,您可以作为图形重新执行 PCP 日志存档。指标来源于一个或多个实时主机,可通过替代选项将 PCP 日志存档中的指标数据用作历史数据的来源。要自定义 PCP Charts 应用程序接口来显示性能指标中的数据,您可以使用行图表、栏图或利用率图形。
通过使用 PCP Charts 应用程序,您可以:
- 重播 PCP 图表应用程序中的数据,并使用图形来视觉化重新检查数据以及系统的实时数据。
- 将性能指标值图表到图表中。
- 同时显示多个 chart。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
-
使用
pmlogger记录性能数据。如需更多信息,请参阅使用 pmlogger 的日志记录性能数据。 已安装
pcp-gui软件包。# dnf install pcp-gui
流程
从命令行启动 PCP Charts 应用程序:
# pmchartpmtime服务器设置位于底部。通过 start 和 pause 按钮,您可以控制:- PCP 轮询指标数据的时间间隔
- 历史数据指标的日期和时间
- 点 File 然后点 New Chart,通过指定主机名或地址来选择来自本地机器和远程机器的指标。高级配置选项包括手动设置图表值的功能,以及手动选择图表颜色。
记录 PCP Charts 应用程序中创建的视图:
以下是获取镜像或记录 PCP Charts 应用程序中创建的视图的选项:
- 点 File,然后点 Export 以保存当前视图的镜像。
- 点 Record,然后 Start 启动记录。
- 点 Record,然后 Stop 停止记录。停止记录后,会存档记录的指标,以便稍后查看。
- 可选:在 PCP Charts 应用程序中,主配置文件称为 view,允许保存与一个或多个 chart 关联的元数据。此元数据描述了所有图表,包括所使用的指标和图表列。
可选:点 File 保存自定义视图配置,然后保存 View,稍后载入 view 配置。
以下 PCP Charts 应用程序视图配置文件示例描述了一个堆栈图表图,显示了读取和写入到给定 XFS 文件系统
loop1的字节数:# pmchart 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
7.3. 使用 PCP 从 SQL 服务器收集数据 复制链接链接已复制到粘贴板!
PCP 中的 SQL Server 代理可帮助您监控和分析数据库性能问题。您可以通过系统中的 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 gcc-c++ python3-devel unixODBC-devel # 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 帐户 username 和 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 应用程序和
pcp (1)、pminfo (1)、pmval (1)、pmchart (1)和pmdamssql (1)man page 的 Visual tracing PCP 日志存档。
第 8 章 设置 PCP 指标的图形表示 复制链接链接已复制到粘贴板!
使用 pcp、grafana、valkey、pcp bpftrace 和 pcp vector 的组合提供 PCP 收集的实时数据或数据的图形化表示。
8.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
8.2. 设置 grafana-server 复制链接链接已复制到粘贴板!
Grafana 生成可从浏览器访问的图形。grafana-server 是 Grafana 仪表盘的后端服务器。默认情况下,它监听所有接口,并提供通过 Web 浏览器访问的 Web 服务。grafana-pcp 插件与后端中的 pmproxy 守护进程进行交互。
先决条件
- 配置了 PCP。如需更多信息,请参阅使用 pcp-zeroconf 设置 PCP。
流程
安装以下软件包:
# dnf install grafana grafana-pcp重启并启用
grafana-server:# 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 @ 5.2.2
8.3. 配置 valkey 复制链接链接已复制到粘贴板!
您可以使用 valkey 数据源:
- 查看数据存档
- 使用 pm series 语言查询时间序列
- 分析多个主机的数据
先决条件
- 配置了 PCP。如需更多信息,请参阅使用 pcp-zeroconf 设置 PCP。
-
grafana-server被配置。如需更多信息,请参阅设置 grafana-server。 -
邮件传输代理(例如
postfix)已安装并配置。
流程
安装
valkey软件包:# dnf install valkey启动并启用
pmproxy和valkey服务:# systemctl start pmproxy valkey # systemctl enable pmproxy valkey重启
grafana-server:# systemctl restart grafana-server
验证
确保
pmproxy和valkey正常工作:# pmseries disk.dev.read 2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df如果没有安装 valkey 软件包,此命令不会返回任何数据。
如需更多信息,请参阅系统中的
pmseries (1)手册页。
8.4. 访问 Grafana Web UI 复制链接链接已复制到粘贴板!
您可以访问 Grafana Web 界面。使用 Grafana Web 界面,您可以:
- 添加 Valkey、PCP bpftrace 和 PCP 向量数据源
- 创建仪表板
- 查看任何有用的指标的概述
- 在 Valkey 中创建警报
先决条件
- 配置了 PCP。如需更多信息,请参阅使用 pcp-zeroconf 设置 PCP。
-
grafana-server被配置。如需更多信息,请参阅设置 grafana-server。
流程
在客户端系统中,打开浏览器并使用 http://192.0.2.0:3000 链接在端口 3000 上访问
grafana-server。当从远程机器访问 Grafana web UI 时,将 192.0.2.0 替换为机器 IP,或者在本地访问 web UI 时替换为 localhost。
- 首次登录时,在 Email 或 username 和 Password 字段中输入 admin。
- Grafana 提示设置 新密码 以创建安全帐户。如果要稍后设置,请点 Skip。
- 在左上角的 hamburger 图标(swig)中,点 Administration > Plugins。
- 在 Plugins 选项卡中,在 Search by name or type 文本框中键入 performance co-pilot,然后单击 Performance Co-Pilot (PCP) 插件。
- 在 Plugins / Performance Co-Pilot 窗格中,点 Enable。
点 Grafana 图标。Grafana Home 页会被 显示。
图 8.1. 仪表盘主页
注意屏幕右上角有一个 Settings 图标,但它控制常规 仪表板设置。
在 Grafana Home 页面中,点 Add your first data source 添加 Valkey、PCP bpftrace 和 PCP Vector 数据源。
- 要添加 PCP valkey 数据源,查看默认仪表板、创建面板和警报规则,请参阅在 PCP valkey 数据源中创建面板和警报。
- 要添加 pcp bpftrace 数据源并查看默认仪表板,请参阅 PCP bpftrace System Analysis 仪表板。
- 要添加 pcp向量数据源,查看默认仪表板并查看向量清单,请参阅 查看 PCP 向量 检查列表。
可选:在菜单中,将鼠标悬停在 admin 配置集图标上,更改 "首选项",包括 编辑配置文件、更改密码或 注销。
如需更多信息,请参阅系统中的
grafana-cli和grafana-serverman page。
8.5. 为 Valkey 和 PCP 配置安全连接 复制链接链接已复制到粘贴板!
您可以在 Performance Co-Pilot (PCP)、Grafana 和 Valkey 之间建立安全连接。在这些组件之间建立安全连接有助于防止未授权方访问或修改正在收集和监控的数据。
先决条件
- 已安装 PCP。如需更多信息,请参阅安装并启用 PCP。
- Grafana 服务器已配置。如需更多信息,请参阅设置 grafana-server。
- Valkey 已安装。如需更多信息,请参阅配置 Valkey。
-
私钥存储在
/etc/valkey/client.key文件中。如果您使用其他路径,请修改流程相应步骤中的路径。有关创建私钥和证书签名请求(CSR)的详细信息,以及如何从证书颁发机构(CA)请求证书,请参阅您的 CA 文档。 -
TLS 客户端证书存储在
/etc/valkey/client.crt文件中。如果您使用其他路径,请修改流程相应步骤中的路径。 -
TLS 服务器密钥存储在
/etc/valkey/valkey.key文件中。如果您使用其他路径,请修改流程相应步骤中的路径。 -
TLS 服务器证书存储在
/etc/valkey/valkey.crt文件中。如果您使用其他路径,请修改流程相应步骤中的路径。 -
CA 证书存储在
/etc/valkey/ca.crt文件中。如果您使用其他路径,请修改流程相应步骤中的路径。 -
对于
pmproxy守护进程,私有服务器密钥存储在/etc/pcp/tls/server.key文件中。如果您使用其他路径,请修改流程相应步骤中的路径。
流程
作为 root 用户,打开
/etc/valkey/valkey.conf文件并调整 TLS/SSL 选项以反映以下属性:port 0 tls-port 6379 tls-cert-file /etc/valkey/valkey.crt tls-key-file /etc/valkey/valkey.key tls-client-key-file /etc/valkey/client.key tls-client-cert-file /etc/valkey/client.crt tls-ca-cert-file /etc/valkey/ca.crt确保 valkey 可以访问 TLS 证书:
# su valkey -s /bin/bash -c \ 'ls -1 /etc/valkey/ca.crt /etc/valkey/valkey.key /etc/valkey/valkey.crt' /etc/valkey/ca.crt /etc/valkey/valkey.crt /etc/valkey/valkey.key重启 valkey 服务器以应用配置更改:
# systemctl restart valkey
验证
确认 TLS 配置可以正常工作:
# valkey-cli --tls --cert /etc/valkey/client.crt \ --key /etc/valkey/client.key \ --cacert /etc/valkey/ca.crt <<< "PING" PONG Unsuccessful TLS configuration might result in the following error message: Could not negotiate a TLS connection: Invalid CA Certificate File/Directory
8.6. 在 PCP Valkey 数据源中创建面板和警报 复制链接链接已复制到粘贴板!
添加 PCP Valkey 数据源后,您可以使用有用的指标概述来查看仪表板,添加查询来视觉化负载图形,并创建可帮助您在系统发生后查看系统问题的警报。
先决条件
- Valkey 被配置。如需更多信息,请参阅配置 Valkey。
-
grafana-server可以访问。如需更多信息,请参阅 访问 Grafana Web UI。
流程
- 登录到 Grafana Web UI。
- 在 Grafana Home 页面中,点 Add your first data source。
- 在 Add data source 窗格中,在 Filter by name or type 文本框中键入 valkey,然后单击 Valkey。
在 Data Sources / Valkey 窗格中,执行以下操作:
- 在 URL 字段中添加 http://localhost:44322,然后点 Save & Test。
点 Dashboards tab > Import > Valkey: Host Overview 查看带有任何有用指标概述的仪表板。
图 8.2. Valkey: 主机概述
添加新面板:
- 在菜单中,将鼠标悬停在 Create icon > Dashboard > Add new panel 图标上来添加面板。
-
在 Query 选项卡中,从查询列表中选择 Valkey,而不是所选的 默认选项,并在 A 的文本字段中输入 metric,例如
kernel.all.load以视觉化内核负载图形。 - 可选:添加 Panel title 和 Description,更新来自 Settings 的选项。
- 点击 Save 以应用更改并保存仪表板。添加Dashboard name。
点击 Apply 以应用更改并返回控制面板。
图 8.3. Valkey 查询面板
创建警报规则:
- 在 Valkey 查询面板中,单击 Alert,然后单击 Create Alert。
- 编辑 Rule 中的 Name, Evaluate query 和 For 项,为您的警报指定 Conditions。
点击 Save 以应用更改并保存仪表板。点击 Apply 以应用更改并返回控制面板。
图 8.4. 在 Valkey 面板中创建警报
- 可选:在同一面板中,向下滚动并点 Delete 图标删除创建的规则。
- 可选: 在菜单中,点击 Alerting 图标查看具有不同警报状态的创建的警报规则,以编辑警报规则,或者从 Alert Rules 选项卡中暂停现有规则。要为创建的警报规则添加通知频道以接收来自 Grafana 的警报通知,请参阅为警报添加通知频道。
8.7. 为警报添加通知频道 复制链接链接已复制到粘贴板!
通过添加通知频道,每当满足警报规则条件且系统需要进一步监控时,可以从 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 valkey 数据源中创建面板和警报。
配置 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
流程
- 在菜单中,将鼠标悬停在 Alerting 图标 > 点 Notification channels > Add channel。
在 Add notification 频道详情窗格中执行以下操作:
- 在 Name 文本框中输入您的名称。
-
选择通信 类型,例如 Email 并输入电子邮件地址。您可以使用
;分隔符添加多个电子邮件地址。 - 可选: 配置可选电子邮件 设置和 通知设置。
- 点击 Save。
在警报规则中选择通知频道:
- 在菜单中,将鼠标悬停在 Alerting 图标上,然后单击 Alert rules。
- 在 Alert Rules 选项卡中点创建的警报规则。
- 在 通知 选项卡上,从 Send to 选项中选择您的通知频道名称,然后添加警报消息。
- 点应用。
8.8. 在 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
8.9. 安装 PCP bpftrace 复制链接链接已复制到粘贴板!
您可以安装 PCP bpftrace 代理来内省系统,并从内核和用户空间追踪点收集指标。bpftrace 代理使用 bpftrace 脚本来收集指标。bpftrace 脚本使用增强的 Berkeley Packet Filter (eBPF)。
先决条件
- 配置了 PCP。如需更多信息,请参阅使用 pcp-zeroconf 设置 PCP。
-
grafana-server被配置。如需更多信息,请参阅设置 grafana-server。 -
scram-sha-256身份验证机制被配置。如需更多信息,请参阅在 PCP 组件之间设置身份验证。
流程
安装
pcp-pmda-bpftrace软件包:# dnf install pcp-pmda-bpftrace编辑 bpftrace.conf 文件并添加您在设置 PCP 组件间身份验证时创建的用户:
# vi /var/lib/pcp/pmdas/bpftrace/bpftrace.conf [dynamic_scripts] enabled = true auth_enabled = true allowed_users = root,metrics使用您的用户名替换 metrics。
安装
bpftracePMDA:# 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 valuespmda-bpftrace现已安装,只能在验证您的用户后使用。如需更多信息,请参阅 查看 PCP bpftrace System Analysis 仪表板。
8.10. 查看 PCP bpftrace System Analysis 仪表盘 复制链接链接已复制到粘贴板!
使用 PCP bpftrace 数据源,您可以从 pmlogger 或 archive 中不以普通数据提供的源访问实时数据。在 PCP bpftrace 数据源中,您可以使用有用的指标概述查看仪表盘。
先决条件
-
已安装 PCP
bpftrace。如需更多信息,请参阅安装 PCP bpftrace。 -
grafana-server被配置。如需更多信息,请参阅设置 grafana-server。
流程
- 登录到 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 字段中添加创建的用户凭证。
点 Save and Test。
图 8.5. 在数据源中添加 PCP bpftrace
点 Dashboards tab > Import > PCP bpftrace: System Analysis 查看带有任何有用指标概述的仪表板。
图 8.6. PCP bpftrace: 系统分析
8.11. 安装 PCP 向量 复制链接链接已复制到粘贴板!
您必须先安装 pcp vector,然后才能开始使用它。
先决条件
- 配置了 PCP。如需更多信息,请参阅使用 pcp-zeroconf 设置 PCP。
-
grafana-server被配置。如需更多信息,请参阅设置 grafana-server。
流程
安装 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
8.12. 查看 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,然后点 Save & Test。
点 Dashboards 标签页 > Import * PCP Vector: Host Overview 查看带有任何有用指标概述的仪表板。
图 8.7. PCP 向量:主机概述
在菜单中,将鼠标悬停在 Performance Co-Pilot 插件上,然后单击 PCP Vector Checklist。
在 PCP 检查列表中,点 help 或 warning 图标查看相关的故障排除或参考链接。
图 8.8. Performance Co-Pilot / PCP 向量清单
8.13. 在 Grafana 中使用 heatmaps 复制链接链接已复制到粘贴板!
您可以在 Grafana 中使用 heatmaps ,来查看数据随时间变化的直方图,识别数据中的趋势和模式,并查看它们如何随时间而变化。heatmap 中的每一列代表一个直方图,不同的颜色单元代表该直方图中给定值的不同的观察密度。
先决条件
- Valkey 被配置。如需更多信息,请参阅配置 Valkey。
-
grafana-server可以访问。如需更多信息,请参阅 访问 Grafana Web UI。 - PCP valkey 数据源已配置。如需更多信息,请参阅在 PCP Valkey 数据源中创建面板和警报。
流程
- 将光标悬停在 Dashboards 选项卡上,然后单击 + New dashboard。
- 在 Add 面板 菜单上,单击 Add a new panel。
在 Query 选项卡中:
- 从查询列表中选择 Valkey,而不是所选的默认选项。
-
在文本字段 A 中,输入指标,如
kernel.all.load,来视觉化内核负载图。
- 单击视觉化下拉菜单,其默认被设为 Time series ,然后单击 Heatmap。
- 可选:在 Panel Options 下拉菜单中,添加 Panel Title 和 Description 。
在 Heatmap 下拉菜单中,在 Calculate from data 设置下,单击 Yes。
图 8.9. Heatmap
- 可选:在 Colors 下拉菜单中,将默认的 Orange 改为 Scheme,然后选择步骤数(色调)。
可选:在 Tooltip 下拉菜单中,在 Show histogram (Y Axis) 设置下,单击 toggle,以便在光标悬停在 heatmap 中的单元格上时,显示特定直方图中单元的位置。例如:
8.14. 为 Grafana 管理 SELinux 布尔值 复制链接链接已复制到粘贴板!
grafana-selinux 子软件包包括几个 SELinux 布尔值,用于控制 Grafana 对外部服务的访问。这些布尔值默认为 off。您可以根据您的系统要求 它们。
打开或关闭
先决条件
-
已安装
grafana-selinux子软件包。 - 您有 root 权限。
流程
查看所有与 Grafana 相关的 SELinux 布尔值:
# semanage boolean -l | grep grafana启用 SELinux 布尔值:
# setsebool [-P] <boolean_name> on- 将 <boolean_name > 替换为您要启用的 SELinux 布尔值的名称。
- 使用 -P 选项使更改在系统重启后仍然有效。
可选:关闭任何 SELinux 选项:
# setsebool [-P] <boolean_name> off
8.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 是否正在运行、时间序列支持以及到 valkey 的连接是否已建立:pmproxy/pmproxy.logpmproxy(1716) Info: valkey slots, command keys, schema version setup Here, 1716 is the PID of pmproxy, which will be different for every invocation of pmproxy. Verify if the valkey database contains any keys by executing the following command: $ valkey-cli dbsize (integer) 34837运行以下命令,验证 valkey 数据库和 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 [...] $ valkey-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> [...]
第 9 章 使用 PowerTOP 管理能耗 复制链接链接已复制到粘贴板!
降低计算机系统的整体功耗有助于节省成本。有效地优化每个系统组件的能源消耗包括研究系统执行的不同任务,并配置各个组件以确保其在该作业的性能正确。降低特定组件或整个系统的功耗,可以降低产生的热量并可能会降低性能。
正确的电源管理结果包括:
- 服务器和计算中心的 Heat 缩减。
- 降低辅助成本,包括冷却、空间、电缆、电缆和不间断电源(UPS)。
- 延长笔记本电脑的电池寿命.
- 降低 carbon dioxide 输出。
- 满足与 Green IT 相关的政府法规或法律要求,如 energy Star。
- 满足新系统的公司指南。
9.1. 电源管理基础 复制链接链接已复制到粘贴板!
有效电源管理基于以下原则构建:
- 空闲 CPU 应该在需要时唤醒
从 Red Hat Enterprise Linux 6 开始,内核会无空运行,这意味着以前的定期计时器中断已被按需中断替代。因此,空闲的 CPU 可以在新任务排队进行处理前保持空闲状态,并且已处于较低电源状态的 CPU 可以保持这个状态更长时间。但是,如果您的系统中存在会创建不必要的计时器事件的应用程序时,此功能的好处可能会减少。轮询事件(如检查卷更改或鼠标移动)是此类事件的示例。
Red Hat Enterprise Linux 包括根据其 CPU 使用情况识别和审核应用程序的工具。详情请参阅 审计和分析概述 和工具。
- 应该完全禁用未使用的硬件和设备
- 对于存在移动部分的设备(如硬盘)也是如此。此外,一些应用程序可能会留下未使用的但已启用的设备"打开"。当发生这种情况时,内核会假定设备正在使用,这可以防止设备进入节能状态。
- 较少的活动应转代表低的电源消耗
- 电源效率通常取决于现代硬件和正确的 BIOS 或 UEFI 配置,特别是在非 x86 构架中。确定您的系统正在运行最新的官方固件,且在 BIOS 或设备配置设置中启用了电源管理功能。
要查找的一些功能包括:
- 对 ARM64 的 Collaborative Processor Performance Controls (CPPC) 支持
- IBM Power 系统的 PowerNV 支持
- 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)
在最低睡眠状态中运行的 CPU 会消耗最少的能源量,但在需要时也会花费更多时间从该状态唤醒。在非常罕见的情形中,这可能会导致 CPU 在每次将要进入睡眠状态时被立即唤醒。这种情况会导致 CPU 一直处于忙碌状态,并在已使用另一个状态时丧失一些潜在的节能好处。
- 关闭的机器使用最少电能
- 省电功能的最佳方法是关闭系统。例如,您的公司可以开发一个企业文化,专注于"绿色 IT"感知,例如在午餐休息或下班后关闭机器。您还可以将多个物理服务器整合到一个较大的服务器中,并使用 Red Hat Enterprise Linux 提供的虚拟化技术虚拟化它们。
9.2. 审计和分析概述 复制链接链接已复制到粘贴板!
通常,单个系统的详细手动审计、分析和调优是例外,因为通常要做的时间和成本远远超过了从这些最后一部分系统调节中获得的好处。但是,对于相似的、可以在所有系统中重复使用相同设置的大量系统,一次执行这些任务可能会非常有用。例如,部署数千台桌面系统,或部署由几乎相同的机器组成的 HPC 集群。
审核和分析的另一种原因是,为以后识别系统行为的回归或更改提供了比较基础。对于需要定期更新硬件、BIOS 或软件的环境,此分析结果会非常有帮助,可以帮助避免出现与功耗相关的任何意外情况。通常,全面的审计和分析让您可以更好地了解特定系统中发生的情况。
对于电源消耗,审计和分析系统相对来说比较困难,即使对于大多数现代系统也是如此。大多数系统不提供使用软件来测量功耗的必要方法。然而,会存在一些例外:
- Hewlett Packard 服务器系统的 iLO 管理控制台具有一个电源管理模块,您可以通过 Web 访问。
- IBM 在其 BladeCenter 电源管理模块中提供类似的解决方案。
- 在一些 Dell 系统中,IT Assistant 提供电源监控功能。
其他供应商可能会为其服务器平台提供类似的功能,但所有供应商都不支持单一解决方案。
9.3. 用于审计的工具 复制链接链接已复制到粘贴板!
Red Hat Enterprise Linux 提供系统审计和分析的工具。当您要验证已发现的内容或需要更多有关某些部分的深度信息时,它们都可以用作补充信息的来源。其中许多工具用于性能调优,其中包括:
- PowerTOP
-
powertop 标识频繁唤醒 CPU 的内核和用户空间应用程序的特定组件。Intel CPU 的 Intel 硬件 P-State (HWP)调整 CPU 频率和投票,以规范功耗和性能。您可以以 root 用户身份使用
powertop命令启动 PowerTOP 工具和powertop --calibrate来放大电源估算引擎。 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 优化系统性能。使用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命令查看活动和不活跃的内存。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 1454712blktrace提供有关在 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) 的速度。它还可用于验证电源管理调整的影响。cpupowercpupower软件包包含一组工具,用于检查和调优处理器的相关功能。您可以使用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- GNOME Power Manager
- 它是作为 GNOME 桌面环境的一部分安装的守护进程。GNOME Power Manager 通知您系统的电源状态的变化,例如,从电池改为 AC 电源。它还会报告电池状态,并在电池电源较低时提醒您。
pmda-denki-
PMDA-denki监控功耗。它是 Performance Co-Pilot 套件的一部分,有助于监控一段时间内的消耗,并视觉化它。详情请查看 使用 pmda-denki 来控制 RHEL 系统的功耗。
9.4. PowerTOP 的目的 复制链接链接已复制到粘贴板!
powertop 是一个诊断与功耗相关的问题的程序,并提供了有关如何延长电池生命周期的建议。PowerTOP 工具可提供系统总功耗以及各个进程、设备、内核工作器、计时器和中断处理器的功耗。工具还可识别频繁绕过 CPU 的内核和用户空间应用程序的特定组件。Red Hat Enterprise Linux uses version 2.x of PowerTOP.
9.5. 安装 PowerTOP 复制链接链接已复制到粘贴板!
您可以安装 PowerTop 并开始使用它来诊断与功耗相关的问题。
流程
打开终端并输入:
# dnf install powertop
9.6. 启动 PowerTOP 复制链接链接已复制到粘贴板!
在您的系统上安装后,您可以开始使用 PowerTop。
先决条件
- 您以电池运行笔记本电脑。
流程
要运行 PowerTOP,请使用以下命令:
# powertop
9.7. 校准 PowerTOP 复制链接链接已复制到粘贴板!
您可以使用 PowerTOP 校准流程提高笔记本电脑上功耗测量的准确性。
流程
在笔记本电脑中,您可以通过运行以下命令来布放节能引擎:
# powertop --calibrate让校准完成,而不会在此过程中与机器交互。校准需要一些时间,因为进程执行各种测试,整个测试通过强度级别和交换机设备进行循环。完成校准过程后,PowerTOP 正常启动。让它运行大约一小时以收集数据。
收集足够数据后,输出表的第一列中将显示节能数据。
9.8. 设置测量间隔 复制链接链接已复制到粘贴板!
默认情况下,PowerTOP 测量间隔为 20 秒。但是,您可以根据您的要求更改此测量频率。
流程
要更改测量频率,请使用--
time选项运行powertop命令:# powertop --time=<time_in_seconds>
9.9. 控制 CPU 频率驱动程序和模式 复制链接链接已复制到粘贴板!
在使用 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
9.10. 生成 HTML 输出 复制链接链接已复制到粘贴板!
您还可以在终端中生成与 powertop 输出之外的 HTML 报告。
流程
使用
--html选项运行powertop命令:# powertop --html=<htmlfile.html>将 & lt;htmlfile.html > 参数替换为输出文件所需的名称。
9.11. 优化功耗 复制链接链接已复制到粘贴板!
您可以使用 powertop 服务或 程序来优化功耗。
powertop 2tuned
9.11.1. 使用 powertop 服务优化功耗 复制链接链接已复制到粘贴板!
您可以使用 powertop 服务,从引导时的 Tunables 选项卡中自动启用所有 PowerTOP 的建议。
流程
启用
powertop服务:# systemctl enable powertop
9.11.2. powertop2tuned 工具 复制链接链接已复制到粘贴板!
使用 powertop2tuned 实用程序从 PowerTOP 建议创建自定义 TuneD 配置集。默认情况下,powertop2tuned 在 /etc/tuned/ 目录中创建配置集,并在当前选择的 TuneD 配置集中基础配置集。为了安全起见,所有 PowerTOP 调优最初在新配置集中禁用。您可以通过在 /etc/tuned/profiles/profile_name/tuned.conf 文件中取消注释来启用调整。
使用-- enable or -e 选项生成新的配置集,以启用 PowerTOP 建议的大部分调优。某些潜在的调优(如 USB 自动暂停 )在默认情况下被禁用,需要手动取消注释。
9.11.3. 使用 powertop2tuned 程序优化电源消耗 复制链接链接已复制到粘贴板!
您可以使用 powertop2tuned 程序生成自定义 TuneD 配置集,以帮助优化系统的功耗。
先决条件
powertop2tuned程序已安装在系统上。# dnf install tuned-utils
流程
创建自定义配置文件:
# powertop2tuned <new_profile_name>激活新配置文件:
# tuned-adm profile <new_profile_name>
9.11.4. 比较 powertop2tuned 和 powertop.service 用量 复制链接链接已复制到粘贴板!
您可以按照以下原因,通过 powertop.service 优化 powertop2tuned 的功耗:
-
powertop2tuned实用程序代表将 PowerTOP 集成到 TuneD 中,这可以实现这两个工具的好处。 -
powertop2tuned实用程序允许对已启用的调优进行精细的控制。 -
使用
powertop2tuned时,可能不会自动启用潜在的危险调整。 -
通过
powertop2tuned,可以在不重启的情况下进行回滚。
第 10 章 perf 入门 复制链接链接已复制到粘贴板!
作为系统管理员,您可以使用 perf 工具来收集和分析系统的性能数据。与基于内核的子系统 Performance Counters for Linux (PCL)的 perf 用户空间工具接口。perf 是一个使用性能监控单元(PMU)测量、记录和监控各种硬件和软件事件的工具。perf 还支持 追踪点、kprobes 和 uprobes。
10.1. 安装 perf 复制链接链接已复制到粘贴板!
您必须安装 perf 用户空间工具才能使用 perf 工具启动。
流程
安装 perf 工具:
# dnf install perf
10.2. 常见 perf 命令 复制链接链接已复制到粘贴板!
您可以使用以下常用的 perf 命令来收集和分析性能数据。
- perf stat
- 提供常见性能事件的总体统计信息,包括执行的指令和消耗的时钟周期。选项可用于选择默认测量事件以外的事件。
- perf 记录
-
将性能数据记录到文件
perf.data中,稍后可以使用perf report命令进行分析。 - perf 报告
-
从
perf record命令创建的perf.data文件中读取并显示性能数据。 - perf list
- 列出特定计算机上可用的事件。这些事件根据系统的性能监控硬件和软件配置而有所不同。
- perf top
- 执行与 top 实用程序类似的功能。它实时生成并显示性能计数器配置集。
- perf trace
-
执行与
strace工具类似的功能。它监控指定线程或进程使用的系统调用,以及该应用收到的所有信号。 - perf help
-
显示
perf命令的完整列表。
第 11 章 使用 perf top 实时分析 CPU 使用量 复制链接链接已复制到粘贴板!
您可以使用 perf top 命令实时测量不同功能的 CPU 使用量。
11.1. perf top 的目的 复制链接链接已复制到粘贴板!
perf top 命令用于实时系统分析,功能类似于 top 实用程序。但是,如果 top 实用程序通常会显示给定进程或线程使用的 CPU 时间,perf top 则显示每个特定功能使用的 CPU 时间。在其默认状态下,perf top 告知您在用户空间和内核空间中的所有 CPU 之间使用的功能。要使用 perf, 您需要 root 访问权限。
11.2. 使用 perf top 分析 CPU 使用量 复制链接链接已复制到粘贴板!
您可以使用 perf top 来监控实时 CPU 使用量,并确定消耗最多处理时间的功能。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。 - 有 root 访问权限。
流程
启动 perf top 监控接口:
# perf top The monitoring interface looks similar to the following: 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 时间。
11.3. 了解 perf 输出和符号解析 复制链接链接已复制到粘贴板!
perf top 监控接口提供 CPU 使用量和功能活动的实时视图。了解其输出有助于识别性能瓶颈并优化系统行为。
- perf top 输出中的关键列
- 界面显示以下几列:
- 开销
-
显示给定功能消耗的 CPU 时间百分比。这有助于查明大多数
资源密集型操作。 - 共享对象
- 指明功能所在的程序或库的名称。
- 符号
显示函数或符号的名称。
- 在内核空间中运行的功能被标记为 [k]。
- 在用户空间中运行的功能被标记为 [.]。
- perf 输出中未解析的符号的原因
对于内核功能,
perf使用/proc/kallsyms文件中的信息将示例映射到其相应的功能名称或符号。对于用户空间中执行的功能,您可能会看到原始功能地址,因为二进制文件被剥离。可通过安装对应的 debuginfo 软件包或编译启用了调试的应用程序来包括此信息,比如在
gcc中使用 a-g选项。在提供必要的调试信息后,perf可以准确将抽样的地址映射到报告期间可读的功能名称。注意在提供调试信息后,不需要重新运行
perf record命令。再次运行perf report命令将反映已解析的符号。
11.4. 启用调试和资源存储库 复制链接链接已复制到粘贴板!
Red Hat Enterprise Linux 的标准安装不会启用调试和源存储库。这些存储库包含调试系统组件并测量其性能所需的信息。
流程
启用源并调试信息软件包通道:
# subscription-manager repos --enable rhel-10-for-$(uname -m)-baseos-debug-rpms # subscription-manager repos --enable rhel-10-for-$(uname -m)-baseos-source-rpms # subscription-manager repos --enable rhel-10-for-$(uname -m)-appstream-debug-rpms # subscription-manager repos --enable rhel-10-for-$(uname -m)-appstream-source-rpms$(uname -m)部分会自动替换为您系统构架的匹配值:
| 架构名称 | 订阅价值 |
| 64 位 Intel 和 AMD | x86_64 |
| 64-bit ARM | aarch64 |
| IBM POWER | ppc64le |
| 64-bit IBM Z | s390x |
11.5. 使用 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-9.5-6.el10.x86_64 (gdb)要退出 GDB,请键入 q 并使用 Enter 进行确认。
(gdb) q运行 GDB 建议的命令来安装所需的
debuginfo软件包:# dnf debuginfo-install coreutils-9.5-6.el10.x86_64dnf 软件包管理工具提供更改摘要、要求确认,并在确认后,下载并安装所有必要的文件。如果 GDB 无法建议
debuginfo软件包,请按照 手动应用程序或库获取debuginfo软件包中所述的步骤进行操作。
第 12 章 使用 perf stat 在进程执行过程中计算事件 复制链接链接已复制到粘贴板!
您可以使用 perf stat 命令在进程执行过程中计算硬件和软件事件。
12.1. perf stat 的目的 复制链接链接已复制到粘贴板!
perf stat 命令执行指定的命令,在命令执行过程中保留运行计数和软件事件,并生成这些计数的统计信息。如果没有指定任何事件,则 perf stat 会计算一组通用的硬件和软件事件。
12.2. 使用 perf stat 计数事件 复制链接链接已复制到粘贴板!
您可以使用 perf stat 计算命令执行过程中出现的硬件和软件事件,并生成这些计数的统计信息。默认情况下,perf stat 以针对每个线程的模式运行。
先决条件
-
已安装
perf用户空间工具,如 安装 perf 所述。 - 有 root 访问权限来计算用户空间和内核空间事件。
流程
计算事件数。
在没有 root 访问权限的情况下运行
perf stat命令只会计算用户空间中发生的事件:$ perf stat ls 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 ls 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
12.3. perf stat 输出的解释 复制链接链接已复制到粘贴板!
perf stat 在命令执行期间执行指定命令并计数发生事件,并在三列中显示这些计数的统计信息:
- 给定事件的发生次数。
- 被计算的事件的名称。
-
当相关的指标可用时,右列中的 hash 符号 (
#) 会显示比例或百分比。例如,当以默认模式运行时,perf stat会计算周期和说明,因此计算并在最接近列中显示每个周期的说明。您可以看到与分支丢失的类似行为,作为所有分支的百分比,因为默认情况下会计算这两个事件。
12.4. 将 perf stat 附加到正在运行的进程 复制链接链接已复制到粘贴板!
您可以将 perf stat 附加到正在运行的进程。这指示 perf stat 在执行命令期间仅在指定进程中发生事件。
先决条件
-
已安装
perf用户空间工具,如 安装 perf 所述。
流程
将
perf stat附加到正在运行的进程中:$ perf stat -p ID1,ID2 sleep seconds前面的示例计算进程
ID1和ID2的事件,覆盖的时间为sleep命令指定的seconds秒数。
第 13 章 使用 perf 记录和分析性能配置文件 复制链接链接已复制到粘贴板!
perf 工具允许您记录性能数据并在以后对其进行分析。
13.1. perf record 的目的 复制链接链接已复制到粘贴板!
perf record 命令对性能数据进行抽样,并将其存储在 perf.data 文件中。然后,您可以使用其他 perf 命令读取和视觉化数据。perf.data 在当前目录中生成,并可以在以后访问,可能在不同机器上。您可以通过运行 perf record -a 来对整个系统进行性能分析。这会在按 Ctrl+C 或特定命令的持续时间前记录性能数据。与之类似,您可以通过运行 perf record ./your_app 或使用 perf record -p PID 来对单个应用程序/进程进行性能分析。
13.2. 记录性能配置集 复制链接链接已复制到粘贴板!
您可以使用 perf record 来抽样和记录性能数据。捕获的数据级别取决于访问级别:
-
没有 root 访问权限:
perf record仅在用户空间中收集数据。 -
使用 root 访问权限:
perf record在用户和内核空间中收集数据。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。 - 如果要收集用户和内核空间数据,则具有 root 访问权限。
流程
执行以下操作之一:
记录用户空间的性能数据示例:
$ perf record command记录内核空间的性能数据(使用 root 或 sudo 访问权限):
# perf record command使用您要配置集的实际命令替换 command。如果没有指定命令,则
perf recordsamples data,直到手动通过按 Ctrl+C 来停止数据。
13.3. 以针对每个 CPU 的模式记录性能档案 复制链接链接已复制到粘贴板!
您可以在每个 CPU 模式中使用 perf record 来抽样并记录用户空间和内核空间中的性能数据。默认情况下,CPU 模式会监控所有在线 CPU。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。
流程
记录性能数据示例:
# perf record -a command使用您要在其中抽样数据的命令替换 command。如果没有指定命令,则
perf recordsamples data,直到手动通过按 Ctrl+C 来停止数据。
13.4. 使用 perf record 捕获调用图形数据 复制链接链接已复制到粘贴板!
您可以配置 perf record 工具,以便其记录在性能配置集中调用其他功能的功能。如果多个进程调用相同功能,这有助于识别瓶颈。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。
流程
使用
--call-graph选项记录性能数据示例:$ perf record --call-graph method command-
使用您要在其中抽样数据的命令替换 command。如果没有指定命令,则
perf recordsamples data,直到手动通过按 Ctrl+C 来停止数据。 使用以下 unwinding 方法之一替换 method:
- fp
-
使用帧指针方法。根据编译器优化,如使用 GCC option--
fomit-frame-pointer构建的二进制文件,这可能无法取消暂存堆栈。 - dwarf
- 使用 DWARF Call Frame 信息来 unwind 堆栈。
- lbr
- 使用 Intel 处理器上的最后分支记录硬件。
-
使用您要在其中抽样数据的命令替换 command。如果没有指定命令,则
13.5. 使用 perf report 分析 perf.data 复制链接链接已复制到粘贴板!
您可以使用 perf report 显示和分析 perf.data 文件中的数据。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。 -
当前目录中有一个
perf.data文件。 -
如果
perf.data文件是使用 root 访问权限创建的,则需要使用 root 访问权限运行 perf report。
流程
显示 perf.data 文件的内容以进一步分析:
# perf report This command displays output similar to the following: 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-record (1)手册页。
13.6. 将 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选项来启用继承性。
13.7. perf 报告输出的解释 复制链接链接已复制到粘贴板!
运行 perf report 命令显示的表会将数据排序为以下几列:
- 开销
- 指明在该特定功能中收集的整体样本的百分比。
- 命令
- 告诉您从哪个进程收集样本。
- 共享对象
- 显示示例来自内核的 ELF 镜像的名称(当样本来自内核时使用名称 [kernel.kallsyms])。
- 符号
- 显示功能名称或符号。在默认模式中,功能按照降序排列,首先显示最高的开销。
13.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。
13.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
第 14 章 使用 perf 调查繁忙的 CPU 复制链接链接已复制到粘贴板!
在调查系统上的性能问题时,您可以使用 perf 工具来识别和监控总线 CPU,以便专注于您的努力。
14.1. 显示使用 perf stat 计数的 CPU 事件 复制链接链接已复制到粘贴板!
您可以使用 perf stat 来显示因为禁用 CPU 计数聚而被计算的 CPU 事件。您必须使用 -a 标志来计算系统范围的事件,才能使用此功能。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。
流程
计算禁用 CPU 数聚合的事件:
# perf stat -a -A sleep seconds此命令以 CPU0 开始,每个 CPU 中以升序(从 CPU0 开始)显示 以秒为单位 记录的默认硬件和软件事件计数(以秒为单位)。因此,它可以用于指定一个事件(如周期):
# perf stat -a -A -e cycles sleep seconds
14.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。
14.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。
14.4. 使用 perf record 和 perf report 监控特定 CPU 复制链接链接已复制到粘贴板!
您可以使用 perf 工具对特定 CPU 的性能数据进行抽样,并分析结果来识别特定于 CPU 的行为或瓶颈。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。
流程
记录来自特定 CPU 的性能数据:
将
-C选项与perf record用于目标特定的 CPU。以下示例演示了如何指定单个 CPU 或范围。从所选 CPU 中对数据进行抽样(以分开):
# perf record -C 0,1 sleep <seconds>此命令对 CPU
0和1的指定秒数进行抽样并记录性能数据。从一系列 CPU 中对数据进行抽样:
# perf record -C 0-2 sleep <seconds>此命令在指定持续时间内对 CPU
0、1和2的性能数据进行抽样并记录。
分析记录的性能数据:
使用
perf report命令读取和分析perf.data文件。# perf report此命令显示
perf.data文件的内容。注意如果要查看记录的每个示例的 CPU,请参阅显示使用 perf report 的 CPU 样本。
第 15 章 使用 perf 创建 uprobes 复制链接链接已复制到粘贴板!
uprobes (用户空间探测)是在运行时监控用户空间应用程序中特定点的动态检测机制,而无需更改源代码或重新编译。
uprobes 有两种有用的用例:
- 调试和性能分析
-
uprobes 功能类似于监视点。您可以在应用程序的特定位置插入它们,以计算执行这些代码路径的频率。此外,他们可以捕获丰富的上下文,如调用堆栈或变量值,这有助于识别性能瓶颈或跟踪错误。 - 基于事件的数据收集
-
uprobes作为 circular 缓冲区等机制切换事件,有助于根据用户空间中的执行触发器来控制数据何时被记录或清空。
uprobes 与 perf 无缝集成,这既可以使用现有 uprobes 并创建新的 uprobes。这种灵活性允许强大的、非侵入观察和分析用户空间行为以及内核空间检测(通过 kprobes)。
15.1. 在功能级别使用 perf 创建 uprobes 复制链接链接已复制到粘贴板!
您可以使用 perf 工具在进程或应用程序的任意点处创建动态追踪点。然后,这些追踪点可以与其他 perf 工具(如 perf stat 和 perf 记录 )一起使用,以更好地理解进程或应用程序行为。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。
流程
在对进程或应用程序感兴趣的位置监控的进程或应用程序中创建 uprobe:
# perf probe -x /path/to/executable -a function Added new event: probe_executable:function (on function in /path/to/executable) You can now use it in all perf tools, such as: perf record -e probe_executable:function -aR sleep 1
15.2. 在带有 perf 的函数内创建 uprobes 复制链接链接已复制到粘贴板!
您可以将追踪点与其他 perf 工具(如 perf stat 和 perf 记录 )结合使用,以更好地理解进程或应用程序行为。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。 您已收到可执行文件的调试符号:
# objdump -t ./your_executable | head注意要做到这一点,必须安装可执行文件的
debuginfo软件包;或者,如果可执行文件是本地开发的应用程序,则必须使用调试信息(GCC 中的-g选项)编译应用程序。
流程
查看可以放置
uprobe的功能行:$ perf probe -x ./your_executable -L main这个命令的输出结果类似如下:
<main@/home/user/my_executable:0> 0 int main(int argc, const char *argv) 1 { int err; const char *cmd; char sbuf[STRERR_BUFSIZE]; / libsubcmd init */ 7 exec_cmd_init("perf", PREFIX, PERF_EXEC_PATH, EXEC_PATH_ENVIRONMENT); 8 pager_init(PERF_PAGER_ENVIRONMENT);为所需的功能行创建
uprobe:# perf probe -x ./my_executable main:8 Added new event: probe_my_executable:main_L8 (on main:8 in /home/user/my_executable) you can now use it in all perf tools, such as: Perf record -e probe_my_executable:main_L8 -aR sleep 1
15.3. 通过 uprobes 记录的数据 perf 脚本输出 复制链接链接已复制到粘贴板!
分析 uprobes 收集的数据的常见方法是运行 perf script 命令,该命令读取 perf.data 文件并显示记录的工作负载的详细追踪。
- 在 perf 脚本示例输出中
-
在名为
my_prog的程序中,uprobe 被添加到函数isprime () a是添加到uprobe的一个函数参数。或者,可以是在您添加uprobe的代码范围内可见的任意变量:# perf script my_prog 1367 [007] 10802159.906593: probe_my_prog:isprime: (400551) a=2 my_prog 1367 [007] 10802159.906623: probe_my_prog:isprime: (400551) a=3 my_prog 1367 [007] 10802159.906625: probe_my_prog:isprime: (400551) a=4 my_prog 1367 [007] 10802159.906627: probe_my_prog:isprime: (400551) a=5 my_prog 1367 [007] 10802159.906629: probe_my_prog:isprime: (400551) a=6 my_prog 1367 [007] 10802159.906631: probe_my_prog:isprime: (400551) a=7 my_prog 1367 [007] 10802159.906633: probe_my_prog:isprime: (400551) a=13 my_prog 1367 [007] 10802159.906635: probe_my_prog:isprime: (400551) a=17 my_prog 1367 [007] 10802159.906637: probe_my_prog:isprime: (400551) a=19
-
在名为
第 16 章 使用 perf mem 分析内存访问 复制链接链接已复制到粘贴板!
您可以使用 perf mem 命令对系统上的内存访问进行示例。perf 工具的 mem 子命令启用内存访问抽样(加载和存储)。perf mem 命令提供有关内存延迟、内存访问类型、导致缓存命中和丢失的功能,并通过记录数据符号(这些点和丢失的内存位置)。
16.1. 使用 perf mem 抽样内存访问 复制链接链接已复制到粘贴板!
您可以使用 perf mem 命令对系统上的内存访问进行示例。该命令使用与 perf record 和 perf report 相同的选项,以及一些选项专用于 mem 子命令。记录的数据保存在当前目录中的 perf.data 文件中,以便稍后进行分析。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。
流程
内存访问示例:
# perf mem record -a sleep <seconds>此命令在所有 CPU 中对内存访问进行抽样,覆盖的时间为
sleep命令指定的<seconds> 秒。您可以替换您要在其中示例内存访问数据的任何命令的sleep命令。默认情况下,perf mem样本会加载和存储。您可以使用 a-t选项只选择一个内存操作,并指定perf mem和record之间的负载或存储。对于负载,捕获内存层次结构级别的信息、TLB 内存访问、总线 snoops 和内存锁定。打开
perf.data文件进行分析:# perf mem report如果您使用了示例命令,输出为:
Available samples 35k cpu/mem-loads,ldlat=30/P 54k cpu/mem-stores/Pcpu/mem-loads,ldlat=30/P行表示通过内存负载收集的数据,cpu/mem-stores/P行表示通过内存存储收集的数据。突出显示感兴趣的类别,然后按 Enter 键以查看数据:Samples: 35K of event 'cpu/mem-loads,ldlat=30/P', Event count (approx.): 4067062 Overhead Samples Local Weight Memory access Symbol Shared Object Data Symbol Data Object Snoop TLB access Locked 0.07% 29 98 L1 or L1 hit [.] 0x000000000000a255 libspeexdsp.so.1.5.0 [.] 0x00007f697a3cd0f0 anon None L1 or L2 hit No 0.06% 26 97 L1 or L1 hit [.] 0x000000000000a255 libspeexdsp.so.1.5.0 [.] 0x00007f697a3cd0f0 anon None L1 or L2 hit No 0.06% 25 96 L1 or L1 hit [.] 0x000000000000a255 libspeexdsp.so.1.5.0 [.] 0x00007f697a3cd0f0 anon None L1 or L2 hit No 0.06% 1 2325 Uncached or N/A hit [k] pci_azx_readl [kernel.kallsyms] [k] 0xffffb092c06e9084 [kernel.kallsyms] None L1 or L2 hit No 0.06% 1 2247 Uncached or N/A hit [k] pci_azx_readl [kernel.kallsyms] [k] 0xffffb092c06e8164 [kernel.kallsyms] None L1 or L2 hit No 0.05% 1 2166 L1 or L1 hit [.] 0x00000000038140d6 libxul.so [.] 0x00007ffd7b84b4a8 [stack] None L1 or L2 hit No 0.05% 1 2117 Uncached or N/A hit [k] check_for_unclaimed_mmio [kernel.kallsyms] [k] 0xffffb092c1842300 [kernel.kallsyms] None L1 or L2 hit No 0.05% 22 95 L1 or L1 hit [.] 0x000000000000a255 libspeexdsp.so.1.5.0 [.] 0x00007f697a3cd0f0 anon None L1 or L2 hit No 0.05% 1 1898 L1 or L1 hit [.] 0x0000000002a30e07 libxul.so [.] 0x00007f610422e0e0 anon None L1 or L2 hit No 0.05% 1 1878 Uncached or N/A hit [k] pci_azx_readl [kernel.kallsyms] [k] 0xffffb092c06e8164 [kernel.kallsyms] None L2 miss No 0.04% 18 94 L1 or L1 hit [.] 0x000000000000a255 libspeexdsp.so.1.5.0 [.] 0x00007f697a3cd0f0 anon None L1 or L2 hit No 0.04% 1 1593 Local RAM or RAM hit [.] 0x00000000026f907d libxul.so [.] 0x00007f3336d50a80 anon Hit L2 miss No 0.03% 1 1399 L1 or L1 hit [.] 0x00000000037cb5f1 libxul.so [.] 0x00007fbe81ef5d78 libxul.so None L1 or L2 hit No 0.03% 1 1229 LFB or LFB hit [.] 0x0000000002962aad libxul.so [.] 0x00007fb6f1be2b28 anon None L2 miss No 0.03% 1 1202 LFB or LFB hit [.] __pthread_mutex_lock libpthread-2.29.so [.] 0x00007fb75583ef20 anon None L1 or L2 hit No 0.03% 1 1193 Uncached or N/A hit [k] pci_azx_readl [kernel.kallsyms] [k] 0xffffb092c06e9164 [kernel.kallsyms] None L2 miss No 0.03% 1 1191 L1 or L1 hit [k] azx_get_delay_from_lpib [kernel.kallsyms] [k] 0xffffb092ca7efcf0 [kernel.kallsyms] None L1 or L2 hit No可选:对结果进行排序,以便在显示数据时调查感兴趣的不同方面。例如,在抽样周期内按类型内存访问对内存负载进行排序,以降低其帐户的开销:
# perf mem -t load report --sort=mem例如,输出可以是:
Samples: 35K of event 'cpu/mem-loads,ldlat=30/P', Event count (approx.): 40670 Overhead Samples Memory access 31.53% 9725 LFB or LFB hit 29.70% 12201 L1 or L1 hit 23.03% 9725 L3 or L3 hit 12.91% 2316 Local RAM or RAM hit 2.37% 743 L2 or L2 hit 0.34% 9 Uncached or N/A hit 0.10% 69 I/O or N/A hit 0.02% 825 L3 miss
16.2. perf mem 报告输出的解释 复制链接链接已复制到粘贴板!
当您运行 perf mem report 命令时,没有任何修饰符将数据排序为几列:
- 开销
- 表示该特定功能中收集的整体样本的百分比。
- Samples
- 显示该行所指定的示例数量。
- 本地权重
- 在处理器核心周期中显示访问延迟。
- 内存访问
- 显示发生的内存访问类型。
- 符号
- 显示功能名称或符号。
- 共享对象
-
显示示例来自内核的 ELF 镜像的名称(当样本来自内核时使用名称
[kernel.kallsyms])。 - Data Symbol
显示行目标的内存位置的地址。
重要Data Symbol列可能会因为被访问的内存或堆栈内存动态分配而显示原始地址。- Snoop
- 显示总线事务。
- TLB 访问
- 显示 TLB 内存访问。
- Locked
- 指明某个函数是或者没有内存锁定。在默认模式中,功能按照降序排列,首先显示最高的开销。
第 17 章 检测错误共享 复制链接链接已复制到粘贴板!
当 Symmetric Multi Processing (SMP) 系统上的处理器核心修改供其他处理器使用的相同缓存行上的数据项时,会发生错误。
初始修改要求另一个使用缓存行的处理器使其副本无效,并且请求更新了一个处理器不需要,甚至不一定有权访问修改的数据项的更新版本。
您可以使用 perf c2c 命令检测 false 共享。
17.1. perf c2c 的目的 复制链接链接已复制到粘贴板!
perf 工具的 c2c 子命令启用 Shared Data Cache-to-Cache (C2C) 分析。您可以使用 perf c2c 命令检查 cache-line contention 来检测 true 和 false 共享。
当 Symmetric Multi Processing (SMP) 系统中的处理器内核修改由其他处理器使用的同一缓存行上的数据项时,缓存行争用会出现这种情况。使用这个缓存行的所有其他处理器都必须使其副本无效,并请求更新过。这会导致性能下降。
perf c2c 命令提供以下信息:
- 缓存被检测到竞争的行
- 读取和写入数据的进程
- 导致竞争的说明
- 涉及内容的 Non-Uniform Memory Access (NUMA) 节点
17.2. 使用 perf c2c 检测缓存行竞争 复制链接链接已复制到粘贴板!
您可以使用 perf c2c 命令检测系统中的缓存行争用。perf c2c 命令支持与 perf record 相同的选项,以及 c2c 子命令的一些选项。记录的数据保存在当前目录中的 perf.data 文件中,以便稍后进行分析。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。
流程
使用
perf c2c检测缓存行争用:# perf c2c record -a sleep <seconds>这个命令抽样并记录所有 CPU 的缓存行争用数据,周期为 <
seconds>,由sleep命令指定。您可以使用您要收集缓存数据的任何命令替换sleep命令。
17.3. 视觉化使用 perf c2c 记录所记录的 perf.data 文件 复制链接链接已复制到粘贴板!
您可以视觉化使用 perf c2c 命令记录的 perf.data 文件。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。 -
使用
perf c2c命令记录的perf.data文件位于当前目录中。如需更多信息,请参阅使用 perf c2c 检测缓存行争用。
流程
打开
perf.data文件进行分析:# perf c2c report --stdio此命令可在终端中将
perf.data文件视觉化到多个图中:================================================= Trace Event Information ================================================= Total records : 329219 Locked Load/Store Operations : 14654 Load Operations : 69679 Loads - uncacheable : 0 Loads - IO : 0 Loads - Miss : 3972 Loads - no mapping : 0 Load Fill Buffer Hit : 11958 Load L1D hit : 17235 Load L2D hit : 21 Load LLC hit : 14219 Load Local HITM : 3402 Load Remote HITM : 12757 Load Remote HIT : 5295 Load Local DRAM : 976 Load Remote DRAM : 3246 Load MESI State Exclusive : 4222 Load MESI State Shared : 0 Load LLC Misses : 22274 LLC Misses to Local DRAM : 4.4% LLC Misses to Remote DRAM : 14.6% LLC Misses to Remote cache (HIT) : 23.8% LLC Misses to Remote cache (HITM) : 57.3% Store Operations : 259539 Store - uncacheable : 0 Store - no mapping : 11 Store L1D Hit : 256696 Store L1D Miss : 2832 No Page Map Rejects : 2376 Unable to parse data source : 1 ================================================= Global Shared Cache Line Event Information ================================================= Total Shared Cache Lines : 55 Load HITs on shared lines : 55454 Fill Buffer Hits on shared lines : 10635 L1D hits on shared lines : 16415 L2D hits on shared lines : 0 LLC hits on shared lines : 8501 Locked Access on shared lines : 14351 Store HITs on shared lines : 109953 Store L1D hits on shared lines : 109449 Total Merged records : 126112 ================================================= c2c details ================================================= Events : cpu/mem-loads,ldlat=30/P : cpu/mem-stores/P Cachelines sort on : Remote HITMs Cacheline data grouping : offset,pid,iaddr ================================================= Shared Data Cache Line Table ================================================= # # Total Rmt ----- LLC Load Hitm ----- ---- Store Reference ---- --- Load Dram ---- LLC Total ----- Core Load Hit ----- -- LLC Load Hit -- # Index Cacheline records Hitm Total Lcl Rmt Total L1Hit L1Miss Lcl Rmt Ld Miss Loads FB L1 L2 Llc Rmt # ..... .................. ....... ....... ....... ....... ....... ....... ....... ....... ........ ........ ....... ....... ....... ....... ....... ........ ........ # 0 0x602180 149904 77.09% 12103 2269 9834 109504 109036 468 727 2657 13747 40400 5355 16154 0 2875 529 1 0x602100 12128 22.20% 3951 1119 2832 0 0 0 65 200 3749 12128 5096 108 0 2056 652 2 0xffff883ffb6a7e80 260 0.09% 15 3 12 161 161 0 1 1 15 99 25 50 0 6 1 3 0xffffffff81aec000 157 0.07% 9 0 9 1 0 1 0 7 20 156 50 59 0 27 4 4 0xffffffff81e3f540 179 0.06% 9 1 8 117 97 20 0 10 25 62 11 1 0 24 7 ================================================= Shared Cache Line Distribution Pareto ================================================= # # ----- HITM ----- -- Store Refs -- Data address ---------- cycles ---------- cpu Shared # Num Rmt Lcl L1 Hit L1 Miss Offset Pid Code address rmt hitm lcl hitm load cnt Symbol Object Source:Line Node{cpu list} # ..... ....... ....... ....... ....... .................. ....... .................. ........ ........ ........ ........ ................... .................... ........................... .... # ------------------------------------------------------------- 0 9834 2269 109036 468 0x602180 ------------------------------------------------------------- 65.51% 55.88% 75.20% 0.00% 0x0 14604 0x400b4f 27161 26039 26017 9 [.] read_write_func no_false_sharing.exe false_sharing_example.c:144 0{0-1,4} 1{24-25,120} 2{48,54} 3{169} 0.41% 0.35% 0.00% 0.00% 0x0 14604 0x400b56 18088 12601 26671 9 [.] read_write_func no_false_sharing.exe false_sharing_example.c:145 0{0-1,4} 1{24-25,120} 2{48,54} 3{169} 0.00% 0.00% 24.80% 100.00% 0x0 14604 0x400b61 0 0 0 9 [.] read_write_func no_false_sharing.exe false_sharing_example.c:145 0{0-1,4} 1{24-25,120} 2{48,54} 3{169} 7.50% 9.92% 0.00% 0.00% 0x20 14604 0x400ba7 2470 1729 1897 2 [.] read_write_func no_false_sharing.exe false_sharing_example.c:154 1{122} 2{144} 17.61% 20.89% 0.00% 0.00% 0x28 14604 0x400bc1 2294 1575 1649 2 [.] read_write_func no_false_sharing.exe false_sharing_example.c:158 2{53} 3{170} 8.97% 12.96% 0.00% 0.00% 0x30 14604 0x400bdb 2325 1897 1828 2 [.] read_write_func no_false_sharing.exe false_sharing_example.c:162 0{96} 3{171} ------------------------------------------------------------- 1 2832 1119 0 0 0x602100 ------------------------------------------------------------- 29.13% 36.19% 0.00% 0.00% 0x20 14604 0x400bb3 1964 1230 1788 2 [.] read_write_func no_false_sharing.exe false_sharing_example.c:155 1{122} 2{144} 43.68% 34.41% 0.00% 0.00% 0x28 14604 0x400bcd 2274 1566 1793 2 [.] read_write_func no_false_sharing.exe false_sharing_example.c:159 2{53} 3{170} 27.19% 29.40% 0.00% 0.00% 0x30 14604 0x400be7 2045 1247 2011 2 [.] read_write_func no_false_sharing.exe false_sharing_example.c:163 0{96} 3{171}
17.4. perf c2c 报告输出的解释 复制链接链接已复制到粘贴板!
运行 perf c2c report --stdio 命令显示的视觉化会将数据排序为几个表格中:
- 跟踪事件信息
-
提供
perf c2c record命令收集的所有负载和存储样本的高级概述。 - 全局共享缓存行事件信息
- 提供共享缓存行的统计信息。
c2c详情-
提供有关记录事件的信息以及
perf c2c 报告数据在视觉化中组织的方式。 - 共享数据缓存行表
- 为检测到 false 共享的热测试缓存行提供一行摘要,并根据每个缓存行检测到的远程 Hitm 量降序排列。
- 共享缓存行分发 Pareto
提供有关每个缓存行遇到竞争的各种信息:
-
缓存行在 NUM 列中编号,从
0开始。 - 每个缓存行的虚拟地址都包含在 Data address Offset 列中,随后是偏移到发生不同访问权限的缓存行中。
- Pid 列包含进程 ID。
- Code Address 列包含指令指针代码地址。
- cycles 标签下的列显示平均负载延迟。
- cpu cnt 列显示来自多少个不同 CPU 样本。也就是说,在那个给定位置索引的数据不同 CPU 的数量。
- Symbol 列显示功能名称或符号。
- Shared Object 列显示来自示例的 ELF 镜像的名称(当样本来自内核时使用 [kernel.kallsyms] )。
- Source:Line 列显示源文件和行号。
- Node{cpu list} 列显示每个节点来自哪些特定 CPU 样本。
-
缓存行在 NUM 列中编号,从
17.5. 使用 perf c2c 检测错误共享 复制链接链接已复制到粘贴板!
您可以使用 perf c2c 命令检测错误共享。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。 -
使用
perf c2c命令记录的perf.data文件位于当前目录中。如需更多信息,请参阅使用 perf c2c 检测缓存行争用。
流程
打开
perf.data文件:# perf c2c report --stdio这会在终端中打开
perf.data文件。在 Trace Event Information 表中,找到包含 LLC Misses to Remote Cache (HITM)的值的行:
LLC Misses to Remote Cache (HITM) 行的值列中的百分比表示在修改的 cache-lines 中的 NUMA 节点之间发生 LLC misses 的百分比,这是错误共享发生的关键指示。
================================================= Trace Event Information ================================================= Total records : 329219 Locked Load/Store Operations : 14654 Load Operations : 69679 Loads - uncacheable : 0 Loads - IO : 0 Loads - Miss : 3972 Loads - no mapping : 0 Load Fill Buffer Hit : 11958 Load L1D hit : 17235 Load L2D hit : 21 Load LLC hit : 14219 Load Local HITM : 3402 Load Remote HITM : 12757 Load Remote HIT : 5295 Load Local DRAM : 976 Load Remote DRAM : 3246 Load MESI State Exclusive : 4222 Load MESI State Shared : 0 Load LLC Misses : 22274 LLC Misses to Local DRAM : 4.4% LLC Misses to Remote DRAM : 14.6% LLC Misses to Remote cache (HIT) : 23.8% LLC Misses to Remote cache (HITM) : 57.3% Store Operations : 259539 Store - uncacheable : 0 Store - no mapping : 11 Store L1D Hit : 256696 Store L1D Miss : 2832 No Page Map Rejects : 2376 Unable to parse data source : 1检查 Shared Data Cache Line Table 的 LLC Load Hitm 字段的 Rmt 列:
================================================= Shared Data Cache Line Table ================================================= # # Total Rmt ----- LLC Load Hitm ----- ---- Store Reference ---- --- Load Dram ---- LLC Total ----- Core Load Hit ----- -- LLC Load Hit -- # Index Cacheline records Hitm Total Lcl Rmt Total L1Hit L1Miss Lcl Rmt Ld Miss Loads FB L1 L2 Llc Rmt # ..... .................. ....... ....... ....... ....... ....... ....... ....... ....... ........ ........ ....... ....... ....... ....... ....... ........ ........ # 0 0x602180 149904 77.09% 12103 2269 9834 109504 109036 468 727 2657 13747 40400 5355 16154 0 2875 529 1 0x602100 12128 22.20% 3951 1119 2832 0 0 0 65 200 3749 12128 5096 108 0 2056 652 2 0xffff883ffb6a7e80 260 0.09% 15 3 12 161 161 0 1 1 15 99 25 50 0 6 1 3 0xffffffff81aec000 157 0.07% 9 0 9 1 0 1 0 7 20 156 50 59 0 27 4 4 0xffffffff81e3f540 179 0.06% 9 1 8 117 97 20 0 10 25 62 11 1 0 24 7表按照每个缓存行检测到的远程 Hitm 的数量降序排列。LLC Load Hitm 部分的 Rmt 列中的数量很高,需要进一步检查调试 false 共享活动的缓存行。
第 18 章 flamegraphs 入门 复制链接链接已复制到粘贴板!
作为系统管理员,您可以使用 flamegraphs 创建使用 perf 工具记录的系统性能数据的可视化。作为软件开发人员,您可以使用 flamegraphs 创建使用 perf 工具记录的应用程序性能数据的视觉化。抽样堆栈追踪是使用 perf 工具分析 CPU 性能的常见技术。不幸的是,利用 perf 的性能分析堆栈跟踪的结果可能非常详细,对其进行分析是一个人工密集型的工作。flamegraphs 是从通过 perf 记录的数据创建的视觉化呈现,以便更快、更轻松地识别热代码路径。
18.1. 安装 flamegraphs 复制链接链接已复制到粘贴板!
您必须安装所需软件包才能使用 flamegraphs 开始。
流程
安装 flamegraphs 软件包:
# dnf install js-d3-flame-graph
18.2. 在整个系统中创建 flamegraphs 复制链接链接已复制到粘贴板!
您可以使用 flamegraphs 来视觉化在整个系统中记录的性能数据。
先决条件
-
如安装
flamegraphs所述 安装 flamegraphs。 -
安装
perf工具,如 安装 perf 所述。
流程
记录数据并创建视觉化。
# perf script flamegraph -a -F 99 sleep 60此命令对整个系统的性能数据进行抽样并记录 60 秒,如使用
sleep命令确定的,然后以flamegraph.html形式保存在当前活动目录中的视觉化。命令默认示例调用数据,并在特定情况下使用与perf工具相同的参数:- -a
- 保证记录整个系统的数据。
- -F
- 设置每秒抽样频率。
验证
要分析,请查看生成的视觉化:
# xdg-open flamegraph.html这个命令在默认浏览器中打开视觉化:
18.3. 在特定进程中创建 flamegraphs 复制链接链接已复制到粘贴板!
您可以使用 flamegraphs 来视觉化在特定运行中的进程中记录的性能数据。
先决条件
-
如安装
flamegraphs所述 安装 flamegraphs。 -
安装
perf工具,如 安装 perf 所述。
流程
记录数据并创建视觉化。
# perf script flamegraph -a -F 99 -p ID1,ID2 sleep 60此命令抽样并记录进程 ID 为
ID1和ID2的进程的性能数据(使用sleep命令确定),然后以flamegraph.html形式保存在当前活动目录中的视觉化。命令默认示例调用数据,并在特定情况下使用与perf工具相同的参数:- -a
- 保证记录整个系统的数据。
- -F
- 设置每秒抽样频率。
- -p
- 要推断特定进程 ID 的示例并记录数据。
验证
要分析,请查看生成的视觉化:
# xdg-open flamegraph.html这个命令在默认浏览器中打开视觉化:
18.4. 解释 flamegraphs 复制链接链接已复制到粘贴板!
flamegraph 中的每个框代表堆栈中的不同功能。y-axis 显示堆栈中最顶层框的深度,每个堆栈都是实际处于 CPU 的函数,以及它处于ancestry 下的一切。x-axis 显示抽样的 call-graph 数据的填充。
给定行中堆栈的子项会根据在 x-axis 中以降序排列的样本数量来显示。 并不代表传递时间。更广泛的一个单独框是,在数据被抽样时,它更频繁地处于 CPU 或一个 on-CPU ancestry 的一部分。
x-axis
流程
要显示之前未显示的功能名称并进一步调查数据,请点击 flamegraph 中的框来缩放给定位置的堆栈:
要返回 flamegraph 的默认视图,请点 Reset Zoom。
重要代表用户空间功能的框可以在 flamegraphs 中被标记为
Unknown,因为函数的二进制文件被剥离。必须安装可执行文件的debuginfo软件包,或者如果可执行文件是本地开发的应用程序,则必须使用调试信息进行编译。使用 GCC 中的-g选项,在这种情形中显示功能名称或符号。
第 19 章 使用 perf 环形缓冲监控性能瓶颈的进程 复制链接链接已复制到粘贴板!
您可以创建环形缓冲区,它使用 perf 工具获取特定于事件的数据快照,以监控您系统上运行的特定进程或部分性能瓶颈。在这种情况下,perf 仅将数据写入 perf.data 文件,以便在检测到指定事件时进行后续分析。
19.1. 使用 perf 环缓冲缓冲和特定于事件的快照 复制链接链接已复制到粘贴板!
使用 perf 在进程或应用程序中调查性能问题时,在发生特定事件前几小时内可能无法记录数据。在这种情况下,您可以使用 perf record 来创建自定义环形缓冲,该缓冲区在特定事件后拍摄快照。
-overwrite 选项使 perf record 将所有数据存储在可覆盖循环缓冲区中。当缓冲区已满时,perf record 会自动覆盖最旧的记录,因此永远不会被写入 perf.data 文件。
将-- overwrite 和 --switch-output-event 选项一起配置循环缓冲区,记录并持续转储数据,直到它检测到 --switch-output-event 触发器事件。对 perf record 的触发器事件信号发生与用户相关的内容,并将 circular 缓冲区中的数据写入 perf.data 文件。这会收集您感兴趣的特定数据,同时减少运行 perf 进程的开销,方法是不需要写入 perf.data 文件。
19.2. 通过 perf circular buffer 收集特定数据以监控性能瓶颈 复制链接链接已复制到粘贴板!
使用 perf 工具,您可以创建环形缓冲。它们由您指定的事件触发,以仅收集您感兴趣的数据。要创建收集事件数据的 circular 缓冲,请将 --overwrite 和 --switch-output-event 选项用于 perf。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。 您已在对进程或应用程序感兴趣的位置在需要监控的进程或应用程序中放置了一个
uprobe:# perf probe -x </path/to/executable> -a function Added new event: probe_executable:function (on function in /path/to/executable) You can now use it in all perf tools, such as: perf record -e probe_executable:function -aR sleep 1
流程
使用
uprobe作为触发器事件创建环形缓冲:# perf record --overwrite -e cycles --switch-output-event probe_executable:function ./executable [ perf record: dump data: Woken up 1 times ] [ perf record: Dump perf.data.2021021012231959 ] [ perf record: dump data: Woken up 1 times ] [ perf record: Dump perf.data.2021021012232008 ] ^C[ perf record: dump data: Woken up 1 times ] [ perf record: Dump perf.data.2021021012232082 ] [ perf record: Captured and wrote 5.621 MB perf.data.<timestamp> ]此命令启动可执行文件并收集 cpu 周期,在 option
-e选项后指定,直到perf检测到uprobe,该触发器事件在--switch-output-event选项后指定的触发器事件。此时,perf采用循环缓冲区中所有数据的快照,并将其存储在由时间戳标识的唯一perf.data文件中。本例生成总计 2 个快照,最后的perf.data文件是通过按 Ctrl+C 强制的。
第 20 章 使用 perf 收集器管理追踪点而无需重启 perf 复制链接链接已复制到粘贴板!
通过使用控制管道接口在正在运行的 perf 收集器中启用和禁用不同的追踪点,您可以动态调整收集的数据,而无需停止或重启 perf。这样可确保您不会丢失在停止或重启过程中记录的性能数据。
20.1. 在没有停止或重启 perf 的情况下向正在运行的 perf 添加追踪点 复制链接链接已复制到粘贴板!
使用控制管道接口向正在运行的 perf 收集器添加追踪点,以调整您要记录的数据,而无需停止 perf 和丢失性能数据。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。
流程
配置控制管道接口:
# mkfifo control ack perf.pipe使用您启用的控制文件设置和事件运行
perf 记录:# perf record --control=fifo:control,ack -D -1 --no-buffering -e 'sched:*' -o - > perf.pipe在本例中,在
-e选项后声明'sched:*'使用调度程序事件启动perf record。在第二个终端中,启动控制管道的读取权限:
# cat perf.pipe | perf --no-pager script -i -启动控制管道的读取侧会在第一个终端中触发以下信息:
Events disabled在第三个终端中,使用控制文件启用追踪点:
# echo 'enable sched:sched_process_fork' > control此命令触发
perf,以扫描控制文件中针对声明的事件扫描当前事件列表。如果事件存在,则会启用 tracepoint,并在第一个终端中显示以下消息:event sched:sched_process_fork enabled启用追踪点后,第二个终端会显示 perf 检测追踪点的输出:
bash 33349 [034] 149587.674295: sched:sched_process_fork: comm=bash pid=33349 child_comm=bash child_pid=34056
20.2. 在不停止或重启 perf 的情况下从正在运行的 perf 收集器中除追踪点 复制链接链接已复制到粘贴板!
使用控制管道接口从正在运行的 perf 收集器中删除追踪点,以减少收集的数据范围,而无需停止 perf 并丢失性能数据。
先决条件
-
已安装
perf用户空间工具。如需更多信息,请参阅安装 perf。 -
已使用控制管道接口向正在运行的
perf收集器添加追踪点。如需更多信息,请参阅 在不停止或重启 perf 的情况下向正在运行的 perf 收集器添加追踪点。
流程
删除追踪点:
# echo 'disable sched:sched_process_fork' > control本例假设您之前已将调度程序事件加载到控制文件中,并启用 tracepoint
sched_process_fork。此命令触发
perf,以扫描控制文件中针对声明的事件扫描当前事件列表。如果事件存在,则会禁用 tracepoint,并在用于配置控制管道的终端中显示以下消息:# event sched:sched_process_fork disabled
第 21 章 在 web 控制台中优化系统性能 复制链接链接已复制到粘贴板!
您可以在 RHEL web 控制台中设置性能配置集,以便为所选任务优化系统性能。
21.1. Web 控制台中的性能调优选项 复制链接链接已复制到粘贴板!
Red Hat Enterprise Linux 提供多个性能优化的性能配置集:
- 使用桌面的系统
- 吞吐性能
- 延迟性能
- 网络性能
- 低功耗
- 虚拟机
TuneD 服务优化系统选项以匹配所选配置集。在 web 控制台中,您可以设置系统的性能配置集。
21.2. 在 Web 控制台中设置性能配置文件 复制链接链接已复制到粘贴板!
根据您要执行的任务,您可以使用 Web 控制台通过设置合适的性能配置文件来优化系统性能。
先决条件
已安装 RHEL 10 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
流程
- 登录到 RHEL 10 web 控制台。
- 点 Overview。
在 Configuration 部分中,点当前的性能配置文件。
- 在 Change performance profile 对话框中设置所需的配置集。
- 点 Change profile。
21.3. 使用 Web 控制台监控本地系统的性能 复制链接链接已复制到粘贴板!
RHEL web 控制台使用 Utilization Saturation and Errors (USE)方法进行故障排除。新的性能指标页面带有最新数据,您可以对数据进行组织化的历史视图。在 Metrics and history 页面中,您可以查看事件、错误以及资源利用率和饱和度的图形表示。
先决条件
已安装 RHEL 10 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
-
cockpit-pcp软件包已安装。 -
Performance Co-Pilot (PCP)服务
pmlogger.service和pmproxy.service已启用并在运行。
流程
- 登录到 RHEL 10 web 控制台。
- 点 Overview。
在 Usage 部分中,点 View metrics and history。
Metrics 和 history 部分会打开并显示: 当前系统配置 ,并使用在用户指定的时间间隔以图形形式使用性能指标
21.4. 使用 Web 控制台和 Grafana 监控多个系统的性能 复制链接链接已复制到粘贴板!
Grafana 允许您一次从多个系统收集数据,并查看其收集的 Performance Co-Pilot (PCP)指标的图形表示。您可以在 web 控制台界面中的多个系统设置性能指标监控和导出。
先决条件
已安装 RHEL 10 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
-
您已安装了
cockpit-pcp软件包。 -
Performance Co-Pilot (PCP)服务
pmlogger.service和pmproxy.service已启用并在运行。 - 您已设置了 Grafana 仪表板。如需更多信息,请参阅设置 grafana-server。
已安装
valkey软件包。另外,您可以在稍后的流程中从 Web 控制台界面安装软件包。
流程
- 登录到 RHEL 10 web 控制台。
- 在 Overview 页面中,点 Usage 表中的 View metrics and history。
- 点 Metrics 设置 按钮。
将 Export to network 滑块移到活跃位置。
如果您没有安装
valkey软件包,Web 控制台会提示您安装它。-
要打开
pmproxy服务,请从下拉列表中选择一个区域,然后点 Add pmproxy 按钮。 - 点击 Save。
验证
- 点 Networking。
- 在 Firewall 表中,点 Edit rules and zones 按钮。
在您选择的区域中搜索
pmproxy。重要在您要监控的所有系统上重复此步骤。
第 22 章 使用 BPF Compiler Collection 分析系统性能 复制链接链接已复制到粘贴板!
BPF Compiler Collection (BCC)通过组合 Berkeley Packet Filter (BPF)的功能来分析系统性能。使用 BPF,您可以安全地运行内核中的自定义程序,以访问系统事件和数据,以性能监控、追踪和调试。BCC 简化了 BPF 程序的开发和部署,用户可使用工具和库从其系统中提取重要见解。
22.1. 安装 bcc-tools 软件包 复制链接链接已复制到粘贴板!
安装 bcc-tools 软件包以获取 BPF Compiler Collection (BCC)库和相关工具。
流程
安装 bcc-tools。
# dnf install bcc-toolsBCC 工具安装在
/usr/share/bcc/tools/目录中。
验证
检查安装的工具。
# ls -l /usr/share/bcc/tools/此时会显示安装的工具列表。列表中的
doc目录为每个工具提供了文档。
22.2. 使用 execsnoop检查系统进程 复制链接链接已复制到粘贴板!
BCC 套件的 execsnoop 工具会捕获并实时显示新的进程执行事件。它可用于观察系统上正在执行哪些命令或二进制文件,以帮助调试、审计和安全监控。
流程
在一个终端中运行
execsnoop程序:# /usr/share/bcc/tools/execsnoop要创建一个短暂的
ls命令的进程,请在另一个终端中输入:$ ls /usr/share/bcc/tools/doc/运行
execsnoop的终端显示类似如下的输出:PCOMM PID PPID RET ARGS ls 8382 8287 0 /usr/bin/ls --color=auto /usr/share/bcc/tools/doc/execsnoop程序打印消耗系统资源的每个新进程的输出行。它甚至会检测很快运行的程序(如ls)的进程,大多数监控工具也不会进行注册。execsnoop输出显示以下字段:- PCOMM
-
父进程名称。(
ls) - PID
- 进程 ID。(8382)
- PPID
- 父进程 ID。(8287)
- RET
- exec ()系统调用(0)的返回值,它将程序代码加载到新进程中。
- ARGS
启动的程序的参数的位置。
如需更多信息,请参阅系统中的
/usr/share/bcc/tools/doc/execsnoop_example.txt文件和exec (3)手册页。
22.3. 跟踪由带有 opensnoop的命令打开的文件 复制链接链接已复制到粘贴板!
您可以使用 BCC 中的 opensnoop 工具(BPF Compiler Collection)实时监控和日志文件访问。这可用于调试、审核或了解应用程序的运行时行为。
流程
在一个终端中,运行
opensnoop程序,以打印仅由uname命令进程打开的文件的输出:# /usr/share/bcc/tools/opensnoop -n uname在另一个终端中,输入命令来打开某些文件:
$ uname The terminal running opensnoop shows the output similar to the following: PID COMM FD ERR PATH 8596 uname 3 0 /etc/ld.so.cache 8596 uname 3 0 /lib64/libc.so.6 8596 uname 3 0 /usr/lib/locale/locale-archive ...opensnoop程序在整个系统中监视open ()系统调用,并为uname尝试打开的每个文件打印一行输出。opensnoop输出显示以下字段:- PID
- 进程 ID。(8596)
- COMM
-
进程名称。(
uname) - FD
- 文件描述符 - open ()返回的值来引用打开的文件。(3)
- ERR
- 任何错误。
- PATH
open ()试图打开的文件位置。如果命令尝试读取不存在的文件,则 FD 列返回
-1,ERR 列会打印与相关错误对应的值。通过使用opensnoop,您可以识别行为不正确的应用程序。如需更多信息,请参阅系统中的/usr/share/bcc/tools/doc/opensnoop_example.txt文件和open (2)手册页。
22.4. 使用 biotop监控磁盘上执行 I/O 操作的主要进程 复制链接链接已复制到粘贴板!
biotop 工具提供对生成最多磁盘 I/O 活动的进程的实时视图。它标识大量从磁盘读取或写入到磁盘的应用程序,使其成为性能监控和故障排除的重要工具。
流程
在一个终端中运行
biotop程序,并作为参数生成 30 秒概述:# /usr/share/bcc/tools/biotop 30当您不提供任何参数时,输出屏幕默认会每 1 秒刷新一次。
在另一个终端中,输入命令从本地硬盘设备读取内容,并将结果写入
/dev/zero文件:# dd if=/dev/vda of=/dev/zero此步骤会生成特定的 I/O 流量来演示
biotop。运行biotop的终端显示类似如下的输出:PID COMM D MAJ MIN DISK I/O Kbytes AVGms 9568 dd R 252 0 vda 16294 14440636.0 3.69 48 kswapd0 W 252 0 vda 1763 120696.0 1.65 7571 gnome-shell R 252 0 vda 834 83612.0 0.33 1891 gnome-shell R 252 0 vda 1379 19792.0 0.15 7515 Xorg R 252 0 vda 280 9940.0 0.28 7579 llvmpipe-1 R 252 0 vda 228 6928.0 0.19 9515 gnome-control-c R 252 0 vda 62 6444.0 0.43 8112 gnome-terminal- R 252 0 vda 67 2572.0 1.54 7807 gnome-software R 252 0 vda 31 2336.0 0.73 9578 awk R 252 0 vda 17 2228.0 0.66 7578 llvmpipe-0 R 252 0 vda 156 2204.0 0.07 9581 pgrep R 252 0 vda 58 1748.0 0.42 7531 InputThread R 252 0 vda 30 1200.0 0.48 7504 gdbus R 252 0 vda 3 1164.0 0.30 1983 llvmpipe-1 R 252 0 vda 39 724.0 0.08 1982 llvmpipe-0 R 252 0 vda 36 652.0 0.06 ...biotop输出显示以下字段:- PID
- 进程 ID。(9568)
- COMM
-
进程名称。(
dd) - DISK
- 磁盘执行读取操作。(vda)
- I/O
- 执行的读操作的数量。(16294)
- Kbytes
- 读操作达到的 Kbytes 量。(14,440,636)
- AVGms
读操作的平均 I/O 时间。(3.69)
如需更多信息,请参阅系统中的
/usr/share/bcc/tools/doc/biotop_example.txt文件和dd (1)手册页。
22.5. 使用 xfsslower 公开意外慢的文件系统操作 复制链接链接已复制到粘贴板!
xfsslower 测量 XFS 文件系统执行读取、写入、打开或同步 (fsync) 操作所花费的时间。参数 1 可确保程序仅显示比 1 ms 慢的操作。
流程
在一个终端中运行
xfsslower程序:# /usr/share/bcc/tools/xfsslower 1当您不提供任何参数时,
xfsslower默认会显示比 10 ms 慢的操作。在另一个终端中,输入以下命令在 vim 编辑器中创建一个文本文件,以开始与 XFS 文件系统交互:
$ vim text The terminal running xfsslower shows something similar upon saving the file from the previous step: TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME 13:07:14 b'bash' 4754 R 256 0 7.11 b'vim' 13:07:14 b'vim' 4754 R 832 0 4.03 b'libgpm.so.2.1.0' 13:07:14 b'vim' 4754 R 32 20 1.04 b'libgpm.so.2.1.0' 13:07:14 b'vim' 4754 R 1982 0 2.30 b'vimrc' 13:07:14 b'vim' 4754 R 1393 0 2.52 b'getscriptPlugin.vim' 13:07:45 b'vim' 4754 S 0 0 6.71 b'text' 13:07:45 b'pool' 2588 R 16 0 5.58 b'text’ ...每行代表文件系统中的一个操作,它花费的时间超过特定阈值。
xfsslower检测到可能的文件系统问题,这些问题可能会以意外的慢速操作的形式出现。xfsslower输出显示以下字段:- COMM
-
进程名称。(
b'bash') - T
操作类型。(
R)- Read
- Write
- open
- Sync
- OFF_KB
- KB 为单位的文件偏移。(0)
- FILENAME
被读、写或同步的文件。
如需更多信息,请参阅系统上的
/usr/share/bcc/tools/doc/xfsslower_example.txt文件和fsync (2)手册页。
第 23 章 配置操作系统以优化 CPU 使用率 复制链接链接已复制到粘贴板!
您可以配置操作系统来优化跨工作负载的 CPU 使用率。
23.1. 监控和诊断处理器问题的工具 复制链接链接已复制到粘贴板!
以下是 Red Hat Enterprise Linux 中用于监控并诊断处理器相关性能问题的工具:
-
numactl实用程序提供了多个选项来管理处理器和内存关联性。numactl软件包包含libnuma库,它为内核支持的 NUMA 策略提供了简单的编程接口,并可用于比numactl应用更精细的调优。 -
numad是一个自动 NUMA 关联性管理守护进程。它监控系统中的 NUMA 拓扑和资源使用情况,以动态改进 NUMA 资源分配和管理。 -
numastat工具显示操作系统及其进程的每个 NUMA 节点内存统计信息,并向管理员显示进程内存是否在整个系统中分散,还是集中于特定的节点上。此工具由numactl软件包提供。 pqos程序在intel-cmt-cat软件包中提供。它监控最近 Intel 处理器上的 CPU 缓存和内存带宽。它监控以下信息:- 每个周期的说明(IPC)
- 最后一次缓存 MISSES 的计数
- 在 LLC 中给定 CPU occupies 中程序执行的大小(以 KB 为单位)
- 到本地内存的带宽(MBL)
- 远程内存的带宽(MBR)
/proc/interrupts文件显示以下类型的信息:- 中断请求(IRQ)号
- 由系统中每个处理器处理的类似中断请求数量
- 发送的中断类型
- 以逗号分隔的响应所列中断请求的设备列表
-
taskset工具由util-linux软件包提供。它允许管理员检索和设置正在运行的进程的处理器关联,或启动具有指定处理器关联性的进程。 -
turbostat工具以指定间隔打印计数器结果,以帮助管理员识别服务器中的意外行为,如过量电源使用、无法进入深度睡眠状态或系统管理中断 (SMI) 创建不必要。 -
x86_energy_perf_policy工具让管理员能够定义与性能和能源效率相对的重要性。然后,当这些信息选择在性能和能源效率之间权衡的选项时,可以使用这些信息来影响支持此功能的处理器。
23.2. 系统拓扑类型 复制链接链接已复制到粘贴板!
在现代计算中,单个 CPU 的概念误导,因为大多数现代系统具有多个处理器。系统的拓扑是这些处理器互相连接并与其他系统资源的连接的方式。这会影响系统和应用程序性能以及系统的调优注意事项。
以下是现代计算中使用的两种主要拓扑类型:
- 对称多进程 (SMP) 拓扑
- SMP 拓扑允许所有处理器在相同时间内访问内存。但是,因为共享和相同的内存访问本质上会阻止所有 CPU 进行序列化内存访问,SMP 系统扩展限制通常被视为不可接受的。因此,所有现代服务器系统都是 NUMA 机器。
- 非统一内存访问 (NUMA) 拓扑
NUMA 拓扑是比 SMP 拓扑更久而开发的。在 NUMA 系统中,多个处理器通过插槽被物理分组。每个套接字都有一个专用的内存区域,并且该套接字上的处理器对该内存具有本地访问权限。套接字、其内存以及关联的处理器形成什么称为节点。同一节点上的处理器对节点的内存银行具有高速访问,而对其他节点上的内存银行的访问速度较慢。
因此,访问非本地内存时会出现性能损失。因此,具有 NUMA 拓扑的系统上性能敏感的应用程序应该访问与执行应用程序的处理器相同的内存,并应尽可能避免访问远程内存。
对于性能敏感的多线程应用程序,这些应用程序可能会被配置为在特定 NUMA 节点上执行,而不是特定处理器。这是否适当地取决于您的系统和应用程序的要求。
- 如果多个应用程序线程访问同一缓存的数据,那么可将这些线程配置为在同一处理器上执行。
-
如果多个访问和缓存不同数据在同一处理器上执行的线程,则每个线程可能会驱除由之前线程访问的缓存数据。这意味着,每个线程"misses"缓存,浪费执行时间从内存中获取数据并在缓存中替换。使用
perf工具检查是否有过多的缓存未命中。
23.3. 显示系统拓扑 复制链接链接已复制到粘贴板!
您可以使用多个命令了解系统的拓扑。
流程
显示系统拓扑概述:
$ numactl --hardware available: 4 nodes (0-3) node 0 cpus: 0 4 8 12 16 20 24 28 32 36 node 0 size: 65415 MB node 0 free: 43971 MB [...]要收集有关 CPU 架构的信息,如 CPU、线程、内核、插槽和 NUMA 节点的数量:
$ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 40 On-line CPU(s) list: 0-39 Thread(s) per core: 1 Core(s) per socket: 10 Socket(s): 4 NUMA node(s): 4 Vendor ID: GenuineIntel CPU family: 6 Model: 47 Model name: Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz Stepping: 2 CPU MHz: 2394.204 BogoMIPS: 4787.85 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 30720K NUMA node0 CPU(s): 0,4,8,12,16,20,24,28,32,36 NUMA node1 CPU(s): 2,6,10,14,18,22,26,30,34,38 NUMA node2 CPU(s): 1,5,9,13,17,21,25,29,33,37 NUMA node3 CPU(s): 3,7,11,15,19,23,27,31,35,39查看系统的图形表示:
# dnf install hwloc-gui # lstopo
查看详细文本输出:
# dnf install hwloc # lstopo-no-graphics Machine (15GB) Package L#0 + L3 L#0 (8192KB) L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0 PU L#0 (P#0) PU L#1 (P#4) HostBridge L#0 PCI 8086:5917 GPU L#0 "renderD128" GPU L#1 "controlD64" GPU L#2 "card0" PCIBridge PCI 8086:24fd Net L#3 "wlp61s0" PCIBridge PCI 8086:f1a6 PCI 8086:15d7 Net L#4 "enp0s31f6"
23.4. 配置内核空循环时间 复制链接链接已复制到粘贴板!
默认情况下,Red Hat Enterprise Linux 使用无空循环内核,它不会中断空闲的 CPU 减少功耗,并允许新处理器利用深度睡眠状态。Red Hat Enterprise Linux 还提供动态无空选项,这对于对延迟敏感的工作负载(如高性能计算或实时计算)非常有用。默认情况下禁用动态无空选项。您可以使用 cpu-partitioning TuneD 配置集为指定为 isolated_cores 的内核启用动态无空选项。
流程
要在特定内核中启用动态无空行为,在内核命令行中使用
nohz_full参数指定这些核心。例如,在 16 核系统上启用nohz_full=1-15内核选项:# grubby --update-kernel=ALL --args="nohz_full=1-15"这可启用内核 1 到 15 的动态无空行为,将所有时间保留到唯一未指定的内核(内核 0)。
当系统引导时,手动将
rcu线程移到非延迟敏感的核心中,本例中为 core 0 :# for i in pgrep rcu[^c] ; do taskset -pc 0 $i ; done-
可选:在内核命令行中使用
isolcpus参数,将特定内核与用户空间任务隔离开来。 可选:将内核的 write-back
bdi-flush线程的 CPU 关联性设置为 housekeeping 内核:echo 1 > /sys/bus/workqueue/devices/writeback/cpumask
验证
系统重启后,验证是否启用了
dynticks:# journalctl -xe | grep dynticks Mar 15 18:34:54 rhel-server kernel: NO_HZ: Full dynticks CPUs: 1-15.验证动态无空配置是否正常工作:
# perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 sleep 3这个命令会在 CPU 1 上测量升级,同时告诉 CPU 1 休眠 3 秒。默认内核计时器配置在常规 CPU 上显示大约 3100 勾号:
# perf stat -C 0 -e irq_vectors:local_timer_entry taskset -c 0 sleep 3 Performance counter stats for 'CPU(s) 0': 3,107 irq_vectors:local_timer_entry 3.001342790 seconds time elapsed配置动态无数内核后,您应该会看到大约 4 个空循环:
# perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 sleep 3 Performance counter stats for 'CPU(s) 1': 4 irq_vectors:local_timer_entry 3.001544078 seconds time elapsed
23.5. 中断请求概述 复制链接链接已复制到粘贴板!
中断请求(IRQ)是一种从硬件立即发送到处理器的信号。系统中的每个设备都会被分配一个或多个 IRQ 号,允许它发送唯一的中断。启用中断后,接收中断请求的处理器会立即暂停当前应用程序线程的执行,以解决中断请求。
因为中断会停止正常操作,所以高中断率可能会严重降低系统性能。通过配置中断的关联性,或者向批处理中发送多个较低优先级中断(协调多个中断),这可以减少中断所花费的时间。
中断请求具有关联的 affnity 属性 smp_affinity,它定义了处理中断请求的处理器。要提高应用程序性能,并允许指定的中断和应用程序线程共享缓存行,您可以改进:
- 分配中断关联性。
- 处理同一内核上相同处理器或处理器的关联性。
在支持中断中断的系统上,修改中断请求的 smp_affinity 属性可设置硬件,以便决定使用特定处理器在硬件级别提供中断,而无需在内核中干预。
23.6. 手动平衡中断 复制链接链接已复制到粘贴板!
如果您的 BIOS 导出它的 NUMA 拓扑,则 irqbalance 服务可自动为节点上对请求服务的硬件进行中断请求。
流程
- 检查哪些设备对应于您要配置的中断请求。
查找平台的硬件规格。检查您系统上的芯片组是否支持分发中断。
- 如果芯片组支持分发,您可以配置中断交付,如以下步骤中所述。另外,检查您的芯片组用来平衡中断的算法。有些 BIOS 有一些选项来配置中断交付。
- 如果芯片组不支持分发,您的芯片组始终将所有中断路由到单个静态 CPU。您无法配置使用哪些 CPU。
检查系统上使用了 Advanced Programmable Interrupt Controller (APIC) 模式:
$ journalctl --dmesg | grep APIC- 如果您的系统使用 flat 以外的模式,您可以看到一个类似于 Setting APIC routing to physical flat 的行。
-
如果看不到这个信息,代表您的系统使用
flat模式。 如果您的系统使用
x2apic模式,您可以通过将nox2apic选项添加到引导装载程序配置中的内核命令行来禁用它。只有非物理平面模式(flat)支持将中断分发到多个 CPU。这个模式仅适用于有 8 个或更少 CPU 的系统。
-
计算
smp_affinity掩码。有关如何计算smp_affinitymask 的更多信息,请参阅设置smp_affinitymask。
23.7. 设置 smp_affinity 掩码 复制链接链接已复制到粘贴板!
smp_affinity 值存储为代表系统中所有处理器的十六进制位掩码。每个位配置不同的 CPU。最重要的位是 CPU 0。掩码的默认值为 f,这意味着可在系统中的任何处理器上处理中断请求。将此值设置为 1 表示只有处理器 0 才能处理中断。
流程
二进制代码,对于处理中断的 CPU 使用值
1。例如,要设置 CPU0和 CPU7以处理中断,请使用0000000010000001作为二进制代码:Expand 表 23.1. CPU 的二进制位 CPU
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
二进制
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
将二进制代码转换为十六进制代码:
例如,使用 Python 转换二进制代码:
>>> hex(int('0000000010000001', 2)) '0x81'在有 32 个处理器的系统上,您必须限制离散的 32 位组的
smp_affinity值。例如,如果您只想 64 位处理器系统的第一个 32 个处理器来服务中断请求,请使用0xffffffff,00000000。特定中断请求的中断关联性值存储在关联的
/proc/irq/irq_number/smp_affinity文件中。在此文件中设置smp_affinitymask:# echo mask > /proc/irq/irq_number/smp_affinity
第 24 章 使用 tuna 接口检查系统 复制链接链接已复制到粘贴板!
tuna 工具降低了执行调优任务的复杂性。您可以使用 tuna 调整调度程序可调项参数,调优线程优先级、RRI 处理程序并隔离 CPU 内核和套接字。通过使用 tuna,您可以执行以下操作:
- 列出系统上的 CPU。
- 列出当前在系统上运行的中断请求(IRQ)。
- 更改有关线程的策略和优先级信息。
- 显示系统的当前策略和优先级。
24.1. 安装 tuna 工具 复制链接链接已复制到粘贴板!
tuna 工具设计为在运行的系统上使用。特定于应用程序的测量工具可在更改后立即分析系统性能。
流程
安装
tuna工具:# dnf install tuna
验证
显示可用的 tuna
CLI选项:# tuna -h如需更多信息,请参阅您系统的
tuna (8)手册页。
24.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_listpid_or_cmd_list 参数是一个用逗号分开的 PID 或 command-name 模式的列表。
根据场景,执行以下操作之一:
- 要使用 tuna CLI 调整 CPU,请使用 tuna 工具完成调整 CPU 中的步骤。
- 要使用 tuna 工具调整 IRQs,请使用 tuna 工具完成 Tuning IRQs 中的步骤。
保存更改的配置:
# tuna save filename这个命令只保存当前运行的内核线程。未运行的进程不会保存。
24.3. 使用 tuna 工具调优 CPU 复制链接链接已复制到粘贴板!
tuna 命令可以管理单个 CPU。通过使用 tuna 工具,您可以执行以下操作:
- 隔离 CPU
- 在指定 CPU 上运行的所有任务都移至下一个可用 CPU。通过将 CPU 从所有线程的关联性掩码中删除来隔离 CPU ,使其不可用。
- 包括 CPU
- 允许任务在指定的 CPU 上运行。
- 恢复 CPU
- 将指定的 CPU 恢复到之前的配置。
先决条件
-
tuna工具已安装。如需更多信息 ,请参阅安装 tuna 工具。
流程
列出所有当前运行的进程:
# 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_list 参数是一个用逗号分开的 CPU 号列表,如--
根据您的场景,执行以下操作之一:
要隔离一个 CPU,请输入:
# tuna isolate --cpus cpu_list要包括一个 CPU,请输入:
# tuna include --cpus cpu_list
要使用具有四个或更多处理器的系统,使所有
ssh线程都在 CPU0和1上运行,以及 CPU2和3中的所有http线程:# 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)手册页。
24.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。
-
使用 irq_list 参数替换 128,将
验证
在将任何中断移到特定的 CPU 之前和之后,比较所选 IRQs 的状态:
# tuna show_irqs --irqs 128 users affinity 128 iwlwifi 3如需更多信息,请参阅系统中的
/proc/interrupts文件和tuna (8)手册页。
第 25 章 配置操作系统以优化内存访问 复制链接链接已复制到粘贴板!
您可以使用 RHEL 中包含的工具配置操作系统,以便在工作负载间优化内存访问。
25.1. 监控和诊断系统内存问题的工具 复制链接链接已复制到粘贴板!
以下工具包括在 Red Hat Enterprise Linux 中用于监控系统性能并诊断与系统内存相关的性能问题:
-
vmstat工具包含在procps-ng软件包中,显示系统的进程、内存、分页、块 I/O、陷阱、磁盘和 CPU 活动的报告。它生成一个即时报告,显示计算机上次打开或自上次报告起这些事件的平均事件。 valgrind框架提供了用户空间二进制文件的工具。这个框架包括多个工具,可用于对程序性能进行性能分析和分析,例如:memcheck工具是valgrind中的默认工具。它检测并报告一些可能很难检测和诊断的内存错误,例如:- 无效的内存访问
- 使用未定义或未初始化的值
- 空闲的堆内存不正确
- 指针重叠(缓冲区重叠)
内存泄漏
注意Memcheck只能报告这些错误,它无法防止它们发生。但是,memcheck会在错误发生前立即记录错误消息。
-
cachegrind工具模拟应用程序如何与系统的缓存层次结构和分支预测进行交互。它收集应用的执行持续时间的统计信息,并显示控制台的摘要。 massif工具测量指定应用程序使用的堆空间。它测量有用的空间以及为预订和协调目的而分配的额外空间。如需更多信息,请参阅系统上的
/usr/share/doc/valgrind-version/valgrind_manual.pdf文件和vmstat (8)和valgrind (1)手册页。
25.2. 系统内存概述 复制链接链接已复制到粘贴板!
Linux 内核旨在最大程度提高系统内存(RAM)中资源的利用率。由于这些设计特性,根据工作负载的内存要求,系统内存部分在内核内代表工作负载使用,而一小部分内存仍保持可用。这个空闲内存被保留:特殊系统分配和其他低或高优先级系统服务。系统内存的其余部分专用于工作负载本身,并分为以下两类:
- 文件内存
这个类别中添加的页面代表持久性存储中的部分文件。这些页面缓存中的页面可以在应用程序的地址空间中映射或取消映射。您可以使用应用程序使用
mmap系统调用将文件映射到其地址空间中,或使用缓冲的 I/O 读写系统调用对文件进行操作。缓冲区的 I/O 系统调用以及直接映射页面的应用程序可以重新使用未映射的页面。因此,内核将这些页面存储在缓存中,特别是当系统没有运行任何内存密集型任务时,以避免对同一组页面造成昂贵的 I/O 操作。
- 匿名内存
- 此类别的页面由动态分配的进程使用,或者与持久性存储中的文件无关。这组页面会备份每个任务的内存中控制结构,如应用堆栈和堆区域。
25.3. 虚拟内存参数 复制链接链接已复制到粘贴板!
虚拟内存参数列在 /proc/sys/vm 目录中。以下是可用的虚拟内存参数:
vm.dirty_ratio- 一个百分比值。修改系统内存占总内存的百分比时,系统开始向磁盘写入修改。默认值为 20 百分比。
vm.dirty_background_ratio- 一个百分比值。修改系统内存占总内存的百分比时,系统会在后台开始向磁盘写入修改。默认值为 10%。
vm.overcommit_memory- 定义决定接受或拒绝大型内存请求的条件。默认值为 0。默认情况下,内核会检查虚拟内存分配请求是否适合存在的内存量(总计 + swap),并只拒绝大型请求。否则,会授予虚拟内存分配,并允许内存过量使用。
- 设置
overcommit_memory参数的值 - 当此参数设置为 1 时,内核不会执行内存过量使用处理。这会增加内存过载的可能性,但提高了内存密集型任务的性能。
-
当此参数设置为 2 时,内核拒绝对内存的请求等于或大于可用交换空间总量,以及
overcommit_ratio中指定的物理 RAM 的百分比。此设置降低了过量使用内存的风险,只对 swap 分区大于其物理内存的系统使用。
vm.overcommit_ratio-
当
overcommit_memory设为 2 时,指定物理 RAM 的百分比。默认值为 50。 vm.max_map_count- 定义进程可以使用的最大内存映射区域数。默认值为 65530。如果您的应用程序需要更多内存映射区域,则提高这个值。
vm.min_free_kbytes-
设置保留可用页面池的大小。它还负责设置管理 Linux 内核中页面回收算法行为的
min_page、low_page和high_page阈值。它还指定在系统中保留最少的可用 KB 数。这会为每个低内存区计算一个特定值,每个值都会被分配一个保留的空闲页面的大小。 - 设置
vm.min_free_kbytes参数的值 - 增加参数值可有效减少应用程序工作集可用内存。因此,您只能将其用于内核驱动的工作负载,其中驱动程序缓冲区需要在原子上下文中分配。
减少参数值可能会导致内核无法服务系统请求,如果内存在系统中发生大量处理。
警告极端的值可能会降低系统性能。将
vm.min_free_kbytes设置为非常低的值可防止系统有效地回收内存,这可能会导致系统崩溃并失败服务中断或其他内核服务。但是,设置vm.min_free_kbytes太大地增加系统回收活动,从而导致分配延迟因为假的直接重新声明状态而造成分配延迟。这可能导致系统立即进入内存不足状态。vm.min_free_kbytes 参数还设置页面重新声明水位线,称为min_pages。在确定两个其他内存水位线、low_pages和high_pages时,这个水位线被用作一个因素,它管理页面重新声明算法。/proc/PID/oom_adj在事件中,当系统内存不足,并且panic_on_oom参数设置为 0 时,oom_killer功能会终止进程,从具有最高oom_score的进程开始,直到系统恢复为止。oom_adj参数决定了进程的oom_score。这个参数会根据进程标识符设置。值 -17 可禁用该进程的oom_killer。其他有效的值范围从 -16 到 15。注意由调整的进程创建的进程将继承该进程的
oom_score。
vm.swappiness- swappiness 值范围从 0 到 200,控制系统从匿名内存池回收内存或页面缓存内存池的程度。
- 设置 swappiness 参数的值
- 高的值首选文件映射驱动的工作负载,同时交换出较少访问的进程的 RAM 匿名映射内存。这对依赖于数据的文件或流应用(如存储中的文件)非常有用,以减少服务请求的 I/O 延迟。
低值优先选择匿名映射驱动的工作负载,同时回收页面缓存(文件映射内存)。这个设置对于不依赖于文件系统信息的应用程序很有用,并且主要利用动态分配和私有内存,如数学和数字缩小应用程序,以及某些硬件虚拟化超级visors (如 QEMU)。
vm.swappiness参数的默认值为 60。警告将
vm.swappiness设置为 0 主动避免将匿名内存交换到磁盘,这会增加oom_killer功能在内存或 I/O 密集型工作负载期间终止进程的可能性。
25.4. 文件系统参数 复制链接链接已复制到粘贴板!
文件系统参数在 /proc/sys/fs 目录中列出。以下是可用的文件系统参数:
aio-max-nr- 定义所有活跃异步输入/输出上下文中允许的最大事件数。默认值为 65536,修改这个值不会预先分配或调整任何内核数据结构。
file-max- 决定整个系统的最大文件句柄数。Red Hat Enterprise Linux 的默认值为 8192 或在内核启动时可用的空闲内存页面的第 10 个,以较大者为准。增加这个值可能会解决缺少可用文件句柄造成的错误。
25.5. 内核参数 复制链接链接已复制到粘贴板!
内核参数的默认值位于 /proc/sys/kernel/ 目录中。它们由内核提供的默认值,或使用 sysctl 为用户指定的值设置默认值。以下内核参数为 msg* 和 shm* System V IPC (sysvipc)系统调用设置限制:
msgmax-
定义消息队列中任何单个消息允许的最大大小(以字节为单位)。这个值不得超过队列的大小 (
msgmnb)。使用sysctl kernel.msgmax命令确定系统中的当前msgmax值。 msgmnb-
定义单个消息队列的最大大小(以字节为单位)。使用
sysctl msgmnb命令确定系统中的当前msgmnb值。 msgmni-
定义消息队列标识符的最大数量,因此定义队列的最大数量。使用
sysctl kernel.msgmni命令确定系统中的当前msgmni值。 shmall-
定义系统一次可以使用的共享内存页面总量。例如,AMD64 和 Intel 64 构架中的页面为 4096 字节。使用
sysctl kernel.shmall命令确定系统中的当前shmall值。 shmmax-
定义内核允许的单个共享内存段的最大大小(以字节为单位)。现在在内核中支持共享内存片段最多 1Gb。使用
sysctl kernel.shmmax命令确定系统中的当前shmmax值。 shmmni- 定义系统范围共享内存段的最大数量。所有系统上的默认值为 4096。
第 26 章 SystemTap 入门 复制链接链接已复制到粘贴板!
作为系统管理员,您可以使用 SystemTap 识别正在运行的 RHEL 系统上的 bug 或性能问题的底层原因。作为应用程序开发人员,您可以使用 SystemTap 密切监控和分析 RHEL 环境中的应用程序行为。
26.1. SystemTap 的目的 复制链接链接已复制到粘贴板!
SystemTap 是跟踪和探测工具,可用于详细研究和监视操作系统(特别是内核)的活动。SystemTap 提供与 netstat、ps、top 和 iostat 等工具输出相似的信息。但是,SystemTap 提供了更多用于收集的信息的过滤和分析选项。在 SystemTap 脚本中,您可以指定 SystemTap 收集的信息。
SystemTap 旨在通过为用户提供基础架构来跟踪内核活动并将此功能与以下两个属性相结合来补充现有 Linux 监控工具套件:
- 灵活性
- 使用 SystemTap 框架,您可以开发简单的脚本来调查和监控内核空间中发生的各种内核功能、系统调用和其他事件。因此,SystemTap 并不是一个工具,它是一种系统,可用于开发自己的内核特定发行版和监控工具。
- 易用性
- 使用 SystemTap,您可以监控内核活动,而无需重新编译内核或重启系统。
26.2. 安装 SystemTap 复制链接链接已复制到粘贴板!
要开始使用 SystemTap,请安装所需的软件包。要在具有多个内核的系统上使用 SystemTap,请为每个内核版本安装对应的内核软件包。
先决条件
- 您已启用了 debug 软件仓库,如 启用调试和源存储库 中所述。
流程
安装所需的 SystemTap 软件包:
# dnf install systemtap安装所需的内核软件包:
使用
stap-prep:# stap-prep如果
stap-prep无法正常工作,请手动安装所需的内核软件包:# dnf install kernel-debuginfo-$(uname -r) kernel-debuginfo-common-$(uname -m)-$(uname -r) kernel-devel-$(uname -r)$(uname -m)会自动替换为您系统的硬件平台,$uname -r)会自动替换为正在运行的内核版本。
验证
如果当前使用 SystemTap 探测内核,请检查您的安装是否成功:
# stap -v -e 'probe kernel.function("vfs_read") {printf("read performed\n"); exit()}'有关成功 SystemTap 部署,您会看到类似如下的输出:
Pass 1: parsed user script and 45 library script(s) in 340usr/0sys/358real ms. Pass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) in 290usr/260sys/568real ms. Pass 3: translated to C into "/tmp/stapiArgLX/stap_e5886fa50499994e6a87aacdc43cd392_399.c" in 490usr/430sys/938real ms. Pass 4: compiled C into "stap_e5886fa50499994e6a87aacdc43cd392_399.ko" in 3310usr/430sys/3714real ms. Pass 5: starting run. read performed Pass 5: run completed in 10usr/40sys/73real ms.其中:
-
传递 5:启动运行表示 SystemTap 成功创建了检测程序来探测内核并运行检测。 -
执行读取表示 SystemTap 检测到指定的事件,本例中为 VFS 读取。 -
pass 5: run in & lt;time& gt; ms表示 SystemTap 执行有效的处理器。它显示文本并关闭且无错误。
26.3. 运行 SystemTap 的权限 复制链接链接已复制到粘贴板!
运行 SystemTap 脚本需要提升系统特权,但在某些实例中,非特权用户可能需要在其计算机上运行 SystemTap 检测。
要允许用户在没有 root 访问权限的情况下构建并运行 SystemTap 脚本,将用户添加到这两个用户组中:
- stapdev
-
此组的成员可以使用
stap运行 SystemTap 脚本或staprun来运行 SystemTap 检测模块。运行stap涉及将 SystemTap 脚本编译到内核模块中,并将其加载到内核中。这要求系统升级的特权,这被授予stapdev成员。这些特权还授予stapdev成员的有效 root 访问权限。仅将stapdev组成员资格授予可通过 root 访问权限的用户。 - stapusr
-
这个组的成员只能使用
staprun来运行 SystemTap 检测模块。另外,这些用户只能从/lib/modules/ <kernel_version> /systemtap/ 目录中运行这些模块。该目录必须只归 root 用户所有且可写入。
26.4. 运行 SystemTap 脚本 复制链接链接已复制到粘贴板!
您可以从标准输入或从文件运行 SystemTap 脚本。在 Sample SystemTap 脚本或 /usr/share/systemtap/examples 目录中查找与 SystemTap 安装一起分发的示例脚本。
先决条件
- 安装 SystemTap 和所需的内核软件包,如 安装 Systemtap 所述。
要以普通用户身份运行 SystemTap 脚本,请将该用户添加到 SystemTap 组:
# usermod --append --groups stapdev,stapusr <user_name>
流程
运行 SystemTap 脚本:
从标准输入中:
# stap -e "probe timer.s(1) {exit()}"从文件中:
# stap <file_name>.stp
26.5. SystemTap 脚本示例 复制链接链接已复制到粘贴板!
您可以在 /usr/share/systemtap/examples 目录中找到与 SystemTap 安装一起分发的示例脚本。使用 stap 命令执行不同的 SystemTap 脚本:
- 追踪函数调用
您可以使用
para-callgraph.stpSystemTap 脚本追踪函数调用和函数返回。# stap para-callgraph.stp <argument1 argument2>该脚本采用两个命令行参数:
- 正在追踪其 entry/exit 的功能名称。
可选的触发器功能,用于在每个线程上启用或禁用追踪。
只要触发器功能还没有退出,每个线程中的追踪将继续。
- 监控轮询应用程序
您可以使用
timeout.stpSystemTap 脚本来识别和监控哪些应用程序正在轮询。了解这一点,您可以跟踪不必要的或过度的轮询,这有助于确定 CPU 使用量和节能方面的改进。# stap timeout.stp此脚本跟踪每个应用使用
轮询的次数,选择、epoll、itimer、futex、nanosleep和Signal系统调用。- 跟踪每个进程的系统调用量
您可以使用
syscalls_by_proc.stpSystemTap 脚本查看哪些进程正在执行最多的系统调用。它显示前 20 个进程。# stap syscalls_by_proc.stp- 追踪网络套接字代码中调用的函数
您可以使用
socket-trace.stpSystemTap 脚本跟踪从内核的net/socket.c文件中调用的功能。这有助于您识别每个进程如何以详细方式在内核级别上与网络交互。# stap socket-trace.stp- 跟踪每个文件读或写的 I/O 时间
您可以使用
iotime.stpSystemTap 脚本监控每个进程读取或写入任何文件所需的时间。这有助于您确定系统上载入哪些文件。# stap iotime.stp- 跟踪 IRQ 和其他进程从任务中窃取周期
您可以使用
cycle_thief.stpSystemTap 脚本跟踪任务运行的时间以及其没有运行的时间。这帮助您识别哪些进程正在从任务中窃取周期。# stap cycle_thief.stp -x pid如需更多信息,请参阅
/usr/share/systemtap/examples目录。注意您可以在
/usr/share/systemtap/examples/index.html文件中找到有关 SystemTap 脚本的更多示例和信息。在 Web 浏览器中打开它,以查看所有可用的脚本及其描述的列表。
26.6. SystemTap 交叉检测 复制链接链接已复制到粘贴板!
SystemTap 的交叉检测是从一个系统中的 SystemTap 脚本创建 SystemTap 检测模块,以在未完全部署 SystemTap 的其他系统上使用。运行 SystemTap 脚本时,将从该脚本构建内核模块。然后,SystemTap 会将模块加载到内核中。
通常,SystemTap 脚本只能在部署了 SystemTap 的系统中运行。要在 10 个系统上运行 SystemTap,需要将 SystemTap 部署到所有这些系统上。在某些情况下,这可能并不可行。例如,企业策略可能禁止您安装提供特定机器的编译器或调试信息的软件包,这会阻止 SystemTap 的部署。
要临时解决这个问题,请使用交叉检测。交叉检测(Cross-instrumentation)是从系统中的 SystemTap 脚本生成 SystemTap 检测模块以在另一个系统上生成 SystemTap 检测模块的过程。这个过程具有以下优点:
-
可以在单一主机上安装各种机器的内核信息软件包。内核打包错误可能会阻止安装。在这种情况下,主机系统和目标系统的
kernel-debuginfo和kernel-devel软件包必须匹配。如果发生错误,请向 红帽 JIRA 报告错误。 每个目标机器都需要一个软件包才能使用生成的 SystemTap 检测模块:
systemtap-runtime。主机系统必须与目标系统具有相同的架构,并运行与目标系统相同的 Linux 发行版,以便构建检测模块正常工作。- 术语
检测模块
内核模块是从 SystemTap 脚本构建的;SystemTap 模块在主机系统上构建,并将在目标系统的目标内核中载入。
主机系统
编译检测模块(来自 SystemTap 脚本)的系统,以便在目标系统上加载。
目标系统
正在构建检测模块的系统(来自 SystemTap 脚本)。
目标内核
目标系统的内核。这是载入并运行检测模块的内核。
26.7. 初始化 SystemTap 的交叉检测 复制链接链接已复制到粘贴板!
初始化 SystemTap 的交叉检测,以从一个系统上的 SystemTap 脚本构建 SystemTap 检测模块,并在另一个系统上使用这些模块没有完全部署 SystemTap。
先决条件
- SystemTap 安装在主机系统上,如 安装 Systemtap 所述。
systemtap-runtime软件包安装在每个目标系统中:# dnf install systemtap-runtime- 主机和目标系统都是相同的架构。
主机和目标系统都运行相同的 Red Hat Enterprise Linux 主版本(如 Red Hat Enterprise Linux 10)。
重要内核打包错误可能会阻止在一个系统中安装多个
kernel-debuginfo和kernel-devel软件包。在这种情况下,主机和目标系统的次版本必须匹配。如果发生错误,请向 红帽 JIRA 报告错误。
流程
确定在每个目标系统上运行的内核:
$ uname -r- 为每个 目标系统 重复此步骤。
- 在主机系统中,根据安装 Systemtap 中描述的方法,为每个目标系统安装目标内核和相关软件包。
在主机系统中构建检测模块,将这个模块复制到目标系统并在其中运行:
如果可以从主机系统对目标系统进行 SSH 连接,请使用远程实现:
# stap --remote <target_system> script您必须确保可以从主机系统对目标系统进行 SSH 连接,才能成功。
手动:
在主机系统中构建检测模块:
# stap -r <kernel_version> script -m <module_name> -p 4在这里,<
kernel_version> 是在第 1 步中确定的目标内核版本,script是要转换为检测模块的脚本,<module_name> 是检测模块的名称。p4选项告知 SystemTap 不要加载并运行已编译的模块。编译检测模块后,将其复制到目标系统并使用以下命令载入它:
# staprun <module_name>.ko
第 27 章 调优调度策略 复制链接链接已复制到粘贴板!
在 Red Hat Enterprise Linux 中,进程执行的最小单元称为线程。系统调度程序决定哪个处理器运行线程,以及线程的运行时间。但是,因为调度程序的主要关注是保持系统忙碌,因此可能无法为应用程序的调度策略性能最佳调度线程。
例如,如果 NUMA 系统上的应用程序在 Node B 上的处理器可用时在 Node A 上运行。为了将处理器保持在节点 B忙碌上,调度程序会将其中一个应用的线程移至节点 B。但是,应用程序线程仍然需要访问 Node A 上的内存。但是,这个内存会更长时间访问,因为线程现在在 Node B 和 Node A 内存上运行,而 Node A 内存不再是线程本地的。因此,线程完成在 Node B 上运行的时间可能要长于在 Node B 上运行,等待 Node A 上的处理器变得可用,然后在具有本地内存访问的原始节点上执行线程。
27.1. 调度策略的类别 复制链接链接已复制到粘贴板!
性能敏感的应用程序通常受益于设计人员或管理员确定运行线程的位置。Linux 调度程序实施多个调度策略,以确定线程的运行位置和时长。以下是调度策略的两个主要类别:
- 普通策略
- 常规线程用于普通优先级的任务。
- 实时策略
- 实时策略用于不需要中断时必须完成的时间敏感任务。实时线程不会受到时间分片。这意味着线程会运行直到它们 block、exit、voluntarily yield 或被较高优先级线程抢占。
任何具有一般策略线程的线程前,会调度最低优先级实时线程。如需更多信息,请参阅使用 SCHED_FIFO 的静态优先级调度,使用SCHED_ RR 进行循环优先级调度,以及 sched (7), sched_setaffinity (2), sched_getaffinity (2), sched_setscheduler (2), 和 sched_getscheduler (2) man page。
27.2. 使用 SCHED_FIFO 的静态优先级调度 复制链接链接已复制到粘贴板!
SCHED_FIFO 也称为静态优先级调度,是一个实时策略,为每个线程定义固定优先级。此策略允许管理员提高事件响应时间并缩短延迟。不要在时间敏感时执行此策略。当使用 SCHED_FIFO 时,调度程序会按照优先级顺序扫描所有 SCHED_FIFO 线程的列表,并调度可随时运行的最高优先级线程。SCHED_FIFO 线程的优先级级别可以是从 1 到 99 的任何整数,其中 99 被视为最高优先级。从较低数字开始,只有在您识别延迟问题时才会增加优先级。
因为实时线程不会受到时间分片,因此请避免设置优先级 99。这与迁移和 watchdog 线程相同的优先级级别保持您的进程;如果您的线程进入计算循环,并且这些线程被阻止,则它们将无法运行。具有单一处理器的系统最终会在这种情况下挂起。
管理员可以限制 SCHED_FIFO 带宽,以防止实时应用程序程序员启动对处理器进行单调执行的实时任务。以下是此策略中使用的一些参数:
/proc/sys/kernel/sched_rt_period_us- 此参数以微秒为单位定义时间,它被视为处理器带宽的 10%。默认值为 1000000 HEKETIs 或 1 秒。
/proc/sys/kernel/sched_rt_runtime_us- 此参数以微秒为单位定义运行实时线程的时间周期。默认值为 950000 HEKETIs 或 0.95 秒。
27.3. 使用 SCHED_RR 循环优先级调度 复制链接链接已复制到粘贴板!
SCHED_RR 是 SCHED_FIFO 的循环变体。当多个线程需要在同一优先级级别上运行时,此策略很有用。与 SCHED_FIFO 一样,SCHED_RR 是一个实时策略,用于为每个线程定义固定优先级。调度程序会按照优先级顺序扫描所有 SCHED_RR 线程的列表,并调度可随时运行的最高优先级线程。但是,与 SCHED_FIFO 不同,在特定时间片段中以 round-robin 样式调度具有相同优先级的线程。您可以使用 /proc/sys/kernel/sched_rr_timeslice_ms 文件中的 sched_rr_timeslice_ms 内核参数以毫秒为单位设置这个时间片段的值。最低值为 1 毫秒。
27.4. 使用 SCHED_OTHER 常规调度 复制链接链接已复制到粘贴板!
SCHED_OTHER 是默认的调度策略。此策略使用完全公平调度程序 (CFS) ,允许对使用该策略调度的所有线程进行公平处理器访问。当有大量线程或数据吞吐量是优先级时,此策略最有用,因为它可以更有效地调度线程。当使用此策略时,调度程序会根据每个进程线程的 niceness 值创建动态优先级列表。管理员可以更改进程的 niceness 值,但不能直接更改调度程序的动态优先级列表。
27.5. 设置调度程序策略 复制链接链接已复制到粘贴板!
您可以使用 chrt 命令行工具检查和调整调度程序策略和优先级。它可以启动具有所需属性的新进程,或更改正在运行的进程的属性。它还可用于在运行时设置策略。
流程
查看活跃进程的进程 ID (PID) :
# ps-
在
ps命令中使用--pid或-p选项来查看特定 PID 的详细信息。 检查特定进程的调度策略、PID 和优先级:
# chrt -p 468 pid 468's current scheduling policy: SCHED_FIFO pid 468's current scheduling priority: 85 # chrt -p 476 pid 476's current scheduling policy: SCHED_OTHER pid 476's current scheduling priority: 0设置进程的调度策略,例如:
要将 PID 为 1000 的进程设置为
SCHED_FIFO,其优先级为 50 :# chrt -f -p 50 1000要将 PID 为 1000 的进程设置为
SCHED_OTHER,其优先级为 0 :# chrt -o -p 0 1000要将 PID 为 1000 的进程设置为
SCHED_RR,其优先级为 10 :# chrt -r -p 10 1000要启动具有特定策略和优先级的新应用,请指定应用程序的名称:
# chrt -f 36 /bin/my-app
27.6. chrt 命令的策略选项 复制链接链接已复制到粘贴板!
您可以使用 chrt 命令查看和设置进程的调度策略。下表描述了适当的策略选项,可用于设置进程的调度策略。
| 短选项 | 长选项 | 描述 |
|---|---|---|
|
|
|
将调度设置为 |
|
|
|
将调度设置为 |
|
|
|
将调度设置为 |
27.7. 在引导过程中更改服务优先级 复制链接链接已复制到粘贴板!
您可以使用 systemd 服务在引导过程中为启动的服务设置实时优先级。单元配置指令用于在引导过程中更改服务的优先级。可使用 service 部分中的以下指令更改引导过程优先级:
-
CPUSchedulingPolicy=:设置已执行进程的 CPU 调度策略。它用于设置 other、fifo 和 rr 策略。 -
CPUSchedulingPriority=:设置已执行进程的 CPU 调度优先级。可用的优先级范围取决于所选的 CPU 调度策略。对于实时调度策略,可以使用 1 (最低优先级)和 99 (最高优先级)之间的整数。
您可以在引导过程中更改服务的优先级,并使用 mcelog 服务。
先决条件
-
已安装并启用了
tuned。如需更多信息,请参阅 安装和启用 TuneD。
流程
查看正在运行的线程的调度优先级:
# tuna --show_threads thread ctxt_switches pid SCHED_ rtpri affinity voluntary nonvoluntary cmd 1 OTHER 0 0xff 3181 292 systemd 2 OTHER 0 0xff 254 0 kthreadd 3 OTHER 0 0xff 2 0 rcu_gp 4 OTHER 0 0xff 2 0 rcu_par_gp 6 OTHER 0 0 9 0 kworker/0:0H-kblockd 7 OTHER 0 0xff 1301 1 kworker/u16:0-events_unbound 8 OTHER 0 0xff 2 0 mm_percpu_wq 9 OTHER 0 0 266 0 ksoftirqd/0 [...]创建附加 mcelog 服务配置目录文件,并在此文件中插入策略名称和优先级:
# cat << EOF > /etc/systemd/system/mcelog.service.d/priority.conf [Service] CPUSchedulingPolicy=fifo CPUSchedulingPriority=20 EOF重新载入
systemd脚本配置:# systemctl daemon-reload重启
mcelog服务:# systemctl restart mcelog
验证
显示
systemd问题设置的mcelog优先级:# tuna -t mcelog -P thread ctxt_switches pid SCHED_ rtpri affinity voluntary nonvoluntary cmd 826 FIFO 20 0,1,2,3 13 0 mcelog
27.8. 优先级映射 复制链接链接已复制到粘贴板!
优先级在组中定义,有一些组专用于特定内核功能。对于实时调度策略,使用 1 (最低优先级)和 99 (最高优先级)之间的整数。
下表描述了优先级范围,可在设置进程的调度策略时使用。
| Priority | 线程 | 描述 |
|---|---|---|
| 1 | 低优先级内核线程 |
此优先级通常为需要超过 |
| 2 - 49 | 可供使用 | 用于典型的应用程序优先级的范围。 |
| 50 | 默认 hard-IRQ 值 | |
| 51 - 98 | 高优先级线程 | 对定期执行的线程使用此范围,且必须快速响应时间。不要将此范围用于 CPU 密集型线程,因为您将中断。 |
| 99 | Watchdogs 和 migration | 必须以最高优先级运行的系统线程。 |
27.9. TuneD cpu-partitioning 配置文件 复制链接链接已复制到粘贴板!
要为对延迟敏感的工作负载调整 Red Hat Enterprise Linux,请使用 cpu-partitioning TuneD 配置集。在 Red Hat Enterprise Linux 9 及更新的版本中,您可以使用 cpu-partitioning TuneD 配置集更有效地执行低延迟性能优化。根据个人低延迟应用程序的要求,此配置文件可轻松自定义。下图显示了如何使用 cpu-partitioning 配置集。这个示例使用 CPU 和节点布局。
您可以使用以下配置选项在 /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-partitioning 配置集,它列出了不使用内核调度程序负载均衡的 CPU。cpu-list选项在 /etc/tuned/cpu-partitioning-variables.conf指定
no_balance_cores选项是可选的,但此列表中的任何 CPU 都必须是isolated_cores列表中所列 CPU 的子集。使用这些 CPU 的应用程序线程需要单独固定到每个 CPU。- 日常 CPU
-
在
cpu-partitioning-variables.conf文件中没有隔离的 CPU 会自动被视为内务 CPU。在内务 CPU 上,允许执行所有服务、守护进程、用户进程、可移动内核线程、中断处理程序和内核计时器。
27.10. 使用 TuneD cpu-partitioning 配置文件进行低延迟调整 复制链接链接已复制到粘贴板!
您可以使用 TuneD 的 cpu-partitioning 配置集调整低延迟的系统。本例中的应用程序使用了:
- 从网络读取数据的专用的 reader 线程将固定到 CPU 2。
- 处理此网络数据的大量线程将固定到 CPU 4-23。
- 将处理的数据写入网络的专用写入器线程将固定到 CPU 3。
先决条件
-
您已以 root 用户身份,使用
dnf install tuned-profiles-cpu-partitioning命令安装cpu-partitioningTuneD 配置文件。
流程
使用以下更改编辑
/etc/tuned/cpu-partitioning-variables.conf文件:注释掉
isolated_cores=${f:calc_isolated_cores:1}行:# isolated_cores=${f:calc_isolated_cores:1}为隔离的 CPUS 添加以下信息:
# 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 上剩余的应用程序线程。
验证
验证隔离的 CPU 是否没有在 Cpus_allowed_list 字段中反映:
# cat /proc/self/status | grep Cpu Cpus_allowed: 003 Cpus_allowed_list: 0-1要查看所有进程的亲和性,请输入:
# ps -ae -o pid= | xargs -n 1 taskset -cp pid 1's current affinity list: 0,1 pid 2's current affinity list: 0,1 pid 3's current affinity list: 0,1 pid 4's current affinity list: 0-5 pid 5's current affinity list: 0,1 pid 6's current affinity list: 0,1 pid 7's current affinity list: 0,1 pid 9's current affinity list: 0 ...注意TuneD 无法更改某些进程的亲和性,主要是内核进程。在本例中,PID 4 和 9 的进程保持不变。
27.11. 自定义 cpu-partitioning TuneD 配置文件 复制链接链接已复制到粘贴板!
您可以扩展 TuneD 配置文件,以进行额外的性能优化更改。例如,cpu-partitioning 配置文件将 CPU 设置为使用 cstate=1。要使用 cpu-partitioning 配置集,但要额外将 CPU cstate 从 cstate1 改为 cstate0,以下流程描述了一个名为 my_profile 的新 TuneD 配置集,它继承 cpu-partitioning 配置集,然后设置 C state-0。
流程
创建
/etc/tuned/my_profile目录:# mkdir /etc/tuned/profiles/my_profile在此目录中创建
tuned.conf文件并添加以下内容:# vi /etc/tuned/profiles/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 配置文件中的更改需要重新引导才能生效,则重新启动计算机。
第 28 章 使用 numastat 分析内存分配 复制链接链接已复制到粘贴板!
numastat 工具提供有关系统中内存分配的详细统计信息,可分别显示每个 NUMA 节点的数据。此信息对于分析系统内存性能并评估各种内存策略的效率很有价值。
28.1. 默认 numastat 统计 复制链接链接已复制到粘贴板!
默认情况下,numastat 工具显示各个 NUMA 节点的这些类别数据的统计信息:
numa_hit- 成功分配给此节点的页面数量。
numa_miss由于预期节点上的内存较低,在此节点上分配的页面数量。每个
numa_miss事件在另一个节点上都有对应的numa_foreign事件。注意高
numa_hit值和低numa_miss值(相对于彼此)代表优化的性能。numa_foreign-
最初用于分配给另一节点的页面数量。每个
numa_foreign事件在另一节点上都有对应的numa_miss事件。 interleave_hit- 成功分配给此节点的交集策略页面数量。
local_node- 此节点上的进程在这个节点上成功分配的页面数量。
other_node- 通过另一节点上的进程在这个节点上分配的页面数量。
28.2. 使用 numastat 查看内存分配 复制链接链接已复制到粘贴板!
您可以使用 numastat 工具查看系统的内存分配。
先决条件
已安装
numactl软件包。# dnf install numactl
流程
查看系统的内存分配:
$ numastat node0 node1 numa_hit 76557759 92126519 numa_miss 30772308 30827638 numa_foreign 30827638 30772308 interleave_hit 106507 103832 local_node 76502227 92086995 other_node 30827840 30867162