
Telegraf Intel PMU 输入插件实战指南通过 Linux Perf 子系统采集核心与 Uncore 硬件性能计数器【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf本文以 Telegraf 仓库内plugins/inputs/intel_pmu插件为对象系统讲解如何通过 Linux Perf 子系统采集 Intel 处理器 Performance Monitoring UnitPMU指标。阅读本文后你将掌握该插件的事件定义文件准备、核心事件core events与 Uncore 事件uncore events配置、perf 修饰符语义、事件组perf group与聚合行为以及输出指标中raw/enabled/running/scaled四个字段的真实含义可直接用于 CPU 性能剖析与利用率监控的落地配置。插件概览与适用场景Intel PMU 插件intel_pmu用于采集 Linux Perf 子系统暴露的 Intel Performance Monitoring Unit 指标。性能计数器是 CPU 上的硬件寄存器用于统计诸如已执行指令数instructions executed、缓存未命中数cache-misses suffered、分支预测失败数branches mispredicted等硬件事件是应用性能剖析、动态控制流追踪与热点识别的数据基础。随着核心数持续增长、处理器拓扑日趋复杂对 IA 处理器内部组件包括 core 与 uncore 单元性能与健康状态的洞察成为保障 CPU 最佳性能与利用率的关键。该插件正是面向这一场景既采集每个核心的 core 事件也采集分布在 CPU 包socket内各 PMU 上的 uncore 事件。引入版本⭐ Telegraf v1.21.0见 插件 README分类标签️ hardware、system运行平台 仅支持Linux 64-bitamd64系统插件在非 Linux/amd64 平台上的实现会退化为空操作在Init阶段打印Current platform is not supported警告Gather不产生任何数据见 intel_pmu_notamd64linux.go。插件依赖 iaevents 库当前仓库 go.mod 锁定版本为github.com/intel/iaevents v1.1.0来访问 Linux 内核的 perf 接口通过perf_event_open系统调用完成事件激活与计数读取。工作原理与测量流程从 intel_pmu.go 的Init与Gather实现可以看出插件遵循初始化一次、周期读取的模型初始化Init校验event_definitions指向的 JSON 文件存在、且为常规文件拒绝符号链接通过ia.JSONFilesReader读取事件定义文件旧版 perfmon 事件格式会被识别并打印警告后跳过解析配置中的 core/uncore 事件、core/socket ID将用户提供的事件名与 JSON 中的事件定义匹配resolver翻译为对应的 perf 属性估算所需文件描述符数量并做上限校验详见下文文件描述符注意事项激活activate所有事件开始计数。周期采集Gather在每个 Telegraf 采集间隔并行读取每个已激活事件的计数值计算 scaled 值后发布为pmu_metric指标。停止Stop依次Deactivate所有 core 与 uncore 激活事件。值得注意的实现细节可参见 resolver.gocore 事件块中若出现 uncore 事件名会报错uncore event found in core entity反之亦然——两者被严格区分。当未显式指定events列表allEvents模式时会解析文件中全部事件无法解析的事件被跳过并在日志中警告Some events may be omitted。事件激活时以进程号-1即所有运行中的进程为目标因此采集到的计数反映系统全局活动而非某个特定进程。另外从 reader.go 可以看到每个事件值的读取通过errgroup并发执行uncore 事件聚合时使用ia.AggregateValues对同一 socket 上多个同类型 PMU 的 raw/enabled/running 分别求和。环境要求与事件定义文件平台限制插件仅适用于 Linux 64-bitamd64系统这是使用前提。事件定义文件插件不内置任何事件定义。不同微架构的 PMU 事件定义以 JSON 文件形式发布在 perfmon 仓库Intel 官方事件文件仓库中你需要下载与当前 CPU 型号匹配的 core 与 uncore 事件定义文件并保存在系统上的安全位置。事件定义 JSON 文件命名通常形如GenuineIntel-6-55-4-core.jsoncore 事件与GenuineIntel-6-55-4-uncore.jsonuncore 事件其中6-55-4对应 CPUID 的 family-model-stepping。可使用 perfmon 仓库配套的 PMU 工具脚本下载适配当前系统的文件并建议统一存放于/var/cache/pmu/这类固定目录以便在配置中引用。在启动前可通过系统命令确认 CPU 拓扑与事件源uncore 事件的 PMU 名称可在/sys/bus/event_source/devices/下列出如uncore_cbox_0、uncore_imc_1等。完整配置示例与参数详解以下为插件官方sample.conf见 sample.conf的完整内容可直接复制并替换事件定义路径与事件列表# Intel Performance Monitoring Unit plugin exposes Intel PMU metrics available through Linux Perf subsystem # This plugin ONLY supports Linux on amd64 [[inputs.intel_pmu]] ## List of filesystem locations of JSON files that contain PMU event definitions. event_definitions [/var/cache/pmu/GenuineIntel-6-55-4-core.json, /var/cache/pmu/GenuineIntel-6-55-4-uncore.json] ## List of core events measurement entities. There can be more than one core_events sections. [[inputs.intel_pmu.core_events]] ## List of events to be counted. Event names shall match names from event_definitions files. ## Single entry can contain name of the event (case insensitive) augmented with config options and perf modifiers. ## If absent, all core events from provided event_definitions are counted skipping unresolvable ones. events [INST_RETIRED.ANY, CPU_CLK_UNHALTED.THREAD_ANY:config10x4043200000000k] ## Limits the counting of events to core numbers specified. ## If absent, events are counted on all cores. ## Single 0, multiple 0,1,2 and range 0-2 notation is supported for each array element. ## example: cores [0,2, 4, 12-16] cores [0] ## Indicator that plugin shall attempt to run core_events.events as a single perf group. ## If absent or set to false, each event is counted individually. Defaults to false. ## This limits the number of events that can be measured to a maximum of available hardware counters per core. ## Could vary depending on type of event, use of fixed counters. # perf_group false ## Optionally set a custom tag value that will be added to every measurement within this events group. ## Can be applied to any group of events, unrelated to perf_group setting. # events_tag ## List of uncore event measurement entities. There can be more than one uncore_events sections. [[inputs.intel_pmu.uncore_events]] ## List of events to be counted. Event names shall match names from event_definitions files. ## Single entry can contain name of the event (case insensitive) augmented with config options and perf modifiers. ## If absent, all uncore events from provided event_definitions are counted skipping unresolvable ones. events [UNC_CHA_CLOCKTICKS, UNC_CHA_TOR_OCCUPANCY.IA_MISS] ## Limits the counting of events to specified sockets. ## If absent, events are counted on all sockets. ## Single 0, multiple 0,1 and range 0-1 notation is supported for each array element. ## example: sockets [0-2] sockets [0] ## Indicator that plugin shall provide an aggregated value for multiple units of same type distributed in an uncore. ## If absent or set to false, events for each unit are exposed as separate metric. Defaults to false. # aggregate_uncore_units false ## Optionally set a custom tag value that will be added to every measurement within this events group. # events_tag 顶层参数参数类型必填说明event_definitionsstring 数组必填包含 PMU 事件定义的 JSON 文件路径列表。Init阶段会校验每个文件存在、且为常规文件符号链接会被拒绝见 intel_pmu.go 的checkFiles。core_events 小节参数每个[[inputs.intel_pmu.core_events]]小节定义一个核心事件测量实体可重复出现多个小节参数类型默认说明eventsstring 数组无缺省时统计文件内全部 core 事件要计数的事件名须与事件定义文件中的名称匹配大小写不敏感单条目可在事件名后追加配置选项与 perf 修饰符coresstring 数组无缺省时统计所有核心限制在指定的核心上计数数组每个元素支持单个0、多个0,1,2与范围0-2三种记法可混合使用如cores [0,2, 4, 12-16]perf_groupboolfalse若为 true尝试将本小节的events作为一个 perf 事件组整体调度详见下文核心事件组events_tagstring空可选的自定义标签值会附加到本小节产生的每条测量上与perf_group设置无关可独立使用uncore_events 小节参数参数类型默认说明eventsstring 数组无缺省时统计文件内全部 uncore 事件同 core 事件名称须匹配定义文件大小写不敏感可带修饰符socketsstring 数组无缺省时统计所有 socket限制在指定的 socketCPU 包上计数同样支持单个、多个与范围记法如sockets [0-2]aggregate_uncore_unitsboolfalse为 true 时将同一 socket 内同类型多个 PMU 单元的计数聚合为一条测量为 false 时每个单元独立输出一条测量events_tagstring空同 core 小节附加自定义标签值配置解析的边界行为源码印证来自 config.go 的细节若core_events与uncore_events均未配置启动报错neither core nor uncore entities configured。events列表中的重复事件会被去重并输出警告duplicated event ... will be removed。core/socket ID 解析支持逗号与a-b范围展开a b时start大于等于end会报错ID 总数上限为 8192maxIDsSize 1 13基于 Linux 内核支持的最大 CPU 数。重复的 ID 会被去重并警告。空列表events []或cores []会被视为配置错误。事件修饰符Modifiers每个events列表元素可以按如下通用格式追加修饰符用于调整事件特定的 perf 属性以满足特定采集需求EVENT_NAME(:(config|config1|config2)(0x[0-9a-f]{1-16})(p|k|u|h|H|I|G|D))*即事件名后通过冒号分隔、可叠加多个keyvalue或单字母标志。各修饰符与perf_event_open系统调用其perf_event_attr结构的对应关系如下表Modifier底层属性说明configperf_event_attr.config事件类型相关的配置config1perf_event_attr.config1config 的扩展config2perf_event_attr.config2config1 的扩展pperf_event_attr.precise_ip滑步skid约束限制采样精度kperf_event_attr.exclude_user不统计用户态user spaceuperf_event_attr.exclude_kernel不统计内核态kernel spaceh / Hperf_event_attr.exclude_guest不在 guest虚拟机中计数Iperf_event_attr.exclude_idle空闲时不计Gperf_event_attr.exclude_hv不计 hypervisorDperf_event_attr.pinned事件必须一直固定在 PMU 上不可被复用示例CPU_CLK_UNHALTED.THREAD_ANY:config10x4043200000000k表示对CPU_CLK_UNHALTED.THREAD_ANY事件设置自定义config1值并附加k修饰符不统计用户态。注意单字母修饰符p/k/u/h/H/I/G/D彼此并不互斥可自由组合但k与u同时出现时语义上既不统计用户态也不统计内核态请按实际需求谨慎组合。核心事件组Core Event GroupsPerf 允许将多个事件组装成一个事件组group。事件组作为一个整体被调度到 CPU 上仅当组内所有事件都能同时放置到 CPU 时整个组才会被调度。这意味着组内成员事件的计数值可以相互有意义地比较——相加、相除求比率等——因为它们针对的是同一批已执行指令进行计数。在插件中将某个core_events小节的perf_group true即可启用此行为源码见 activators.go 的activateCoreEventsGroup内部调用ia.ActivateGroup。注意当尝试创建的事件组大小超过该核心可用的 PMU 硬件计数器数量时插件会抛出错误perf 系统调用返回的错误信息为 invalid argument。若需确认你的 Intel CPU 支持多少个 PMU 计数器可使用cpuid命令查询。同时要注意启用perf_group会把可同时测量的事件数量限制在每核心可用硬件计数器上限内该上限会随事件类型、是否使用固定计数器fixed counters而变化。文件描述符File Descriptors注意事项插件打开的文件描述符数量取决于被监控的 CPU 数量与被监控的计数器数量的乘积核心事件约为事件数 × 核心数uncore 事件约为事件数 × PMU 类型数 × socket 数估算逻辑见 intel_pmu.go 的estimateCoresFd/estimateUncoreFd。它很容易超过系统默认的单进程文件描述符上限。插件在初始化阶段会主动进行双重校验与内核级上限/proc/sys/fs/file-max比较与当前进程的软限制RLIMIT_NOFILE通过syscall.Getrlimit(syscall.RLIMIT_NOFILE, ...)获取比较。任一超限都会报错提示consider increasing the limit。根据配置规模可能需要调高允许打开的文件描述符数量例如通过ulimit -n命令或为 Telegraf 服务配置相应的 LimitNOFILE来提升。相关错误路径均有单元测试覆盖见 intel_pmu_test.go 的exceeded file descriptors用例。指标格式与标签定义每个 Telegraf 间隔插件发布名为pmu_metric的测量包含以下字段与标签。Metric Fields字段类型描述enableduint64时间计数器事件被启用的总时间runninguint64时间计数器事件实际被计数的总时间rawuint64值计数器事件实际计数期间的事件计数值scaleduint64值计数器按scaled raw * (enabled / running)公式计算的事件连续计数近似值关于四个字段的关系正常情况下enabled与running相等。但当启动的事件数量超过 PMU 可用计数器槽位时会发生时间复用multiplexing事件只在部分时间内被计数此时二者出现差异。scaled值正是据此估算若事件被持续计数时的近似值由 iaevents 库的EventScaledValue计算见 intel_pmu.go 的Gather。若 scaled 值超过 uint64 上限插件会报错终止本次采集。Metric Tags通用标签core 与 uncore 事件共有Tag描述hostTelegraf 读取到的主机名event事件名称core 事件附加标签Tag描述cpuCPU id由 Linux OS 标识启用超线程时为逻辑 CPU id否则为物理 CPU idevents_tag可选intel_pmu.core_events配置中定义的自定义标签值uncore 事件附加标签Tag描述socketsocket 号由 Linux OS 标识即physical_package_idunit_type事件所计数 PMU 的类型提供 PMU 类别信息如 cbox对应uncore_cbox_1、r2pcie对应uncore_r2pcie等unit事件所计数 PMU 的名称与/sys/bus/event_source/devices/下列出的名字一致如uncore_cbox_1、uncore_imc_1仅非聚合的 uncore 事件出现events_tag可选intel_pmu.uncore_events配置中定义的自定义标签值从 intel_pmu.go 的publishCoreMeasurements/publishUncoreMeasurements可以看到聚合模式下aggregate_uncore_units true不输出unit标签仅输出unit_typeevents_tag只有在配置了非空值时才会作为标签出现。输出示例解读事件组Event Groupperf_group true且events_tag unhalted时core 事件在多个 CPU 上各自输出pmu_metric,cpu0,eventCPU_CLK_THREAD_UNHALTED.REF_XCLK,events_tagunhalted,hostxyz enabled2871237051i,running2871237051i,raw1171711i,scaled1171711i 1621254096000000000 pmu_metric,cpu0,eventCPU_CLK_UNHALTED.THREAD_P_ANY,events_tagunhalted,hostxyz enabled2871240713i,running2871240713i,raw72340716i,scaled72340716i 1621254096000000000 pmu_metric,cpu1,eventCPU_CLK_THREAD_UNHALTED.REF_XCLK,events_tagunhalted,hostxyz enabled2871118275i,running2871118275i,raw1646752i,scaled1646752i 1621254096000000000 pmu_metric,cpu1,eventCPU_CLK_UNHALTED.THREAD_P_ANY,events_tagunhalted,hostxyz raw108802421i,scaled108802421i,enabled2871120107i,running2871120107i 1621254096000000000 pmu_metric,cpu2,eventCPU_CLK_THREAD_UNHALTED.REF_XCLK,events_tagunhalted,hostxyz enabled2871143950i,running2871143950i,raw1316834i,scaled1316834i 1621254096000000000 pmu_metric,cpu2,eventCPU_CLK_UNHALTED.THREAD_P_ANY,events_tagunhalted,hostxyz enabled2871074681i,running2871074681i,raw68728436i,scaled68728436i 1621254096000000000可见组内事件在同一 CPU 上的enabled/running值非常接近这正是事件组同进同出调度语义的体现——便于对CPU_CLK_THREAD_UNHALTED.REF_XCLK与CPU_CLK_UNHALTED.THREAD_P_ANY计算比率。Uncore 事件非聚合同一 uncore 事件在 socket 0 上的多个 cbox 单元分别输出带unit标签pmu_metric,eventUNC_CBO_XSNP_RESPONSE.MISS_XCORE,hostxyz,socket0,unituncore_cbox_0,unit_typecbox enabled2870630747i,running2870630747i,raw183996i,scaled183996i 1621254096000000000 pmu_metric,eventUNC_CBO_XSNP_RESPONSE.MISS_XCORE,hostxyz,socket0,unituncore_cbox_1,unit_typecbox enabled2870608194i,running2870608194i,raw185703i,scaled185703i 1621254096000000000 pmu_metric,eventUNC_CBO_XSNP_RESPONSE.MISS_XCORE,hostxyz,socket0,unituncore_cbox_2,unit_typecbox enabled2870600211i,running2870600211i,raw187331i,scaled187331i 1621254096000000000 pmu_metric,eventUNC_CBO_XSNP_RESPONSE.MISS_XCORE,hostxyz,socket0,unituncore_cbox_3,unit_typecbox enabled2870593914i,running2870593914i,raw184228i,scaled184228i 1621254096000000000 pmu_metric,eventUNC_CBO_XSNP_RESPONSE.MISS_XCORE,hostxyz,socket0,unituncore_cbox_4,unit_typecbox scaled195355i,enabled2870558952i,running2870558952i,raw195355i 1621254096000000000 pmu_metric,eventUNC_CBO_XSNP_RESPONSE.MISS_XCORE,hostxyz,socket0,unituncore_cbox_5,unit_typecbox enabled2870554131i,running2870554131i,raw197756i,scaled197756i 1621254096000000000Uncore 事件聚合设置aggregate_uncore_units true后同一 socket、同一unit_type下多个单元合并为一条测量不再有unit标签计数为各单元之和pmu_metric,eventUNC_CBO_XSNP_RESPONSE.MISS_XCORE,hostxyz,socket0,unit_typecbox enabled13199712335i,running13199712335i,raw467485i,scaled467485i 1621254412000000000时间复用Time Multiplexing当事件数超过硬件计数器槽位时可观察到enabled与running明显不一致scaled值高于raw值pmu_metric,cpu0,eventCPU_CLK_THREAD_UNHALTED.REF_XCLK,hostxyz raw2947727i,scaled4428970i,enabled2201071844i,running1464935978i 1621254412000000000 pmu_metric,cpu0,eventCPU_CLK_UNHALTED.THREAD_P_ANY,hostxyz running1465155618i,raw302553190i,scaled454511623i,enabled2201035323i 1621254412000000000 pmu_metric,cpu0,eventCPU_CLK_UNHALTED.REF_XCLK,hostxyz enabled2200994057i,running1466812391i,raw3177535i,scaled4767982i 1621254412000000000 pmu_metric,cpu0,eventCPU_CLK_UNHALTED.REF_XCLK_ANY,hostxyz enabled2200963921i,running1470523496i,raw3359272i,scaled5027894i 1621254412000000000 pmu_metric,cpu0,eventL1D_PEND_MISS.PENDING_CYCLES_ANY,hostxyz enabled2200933946i,running1470322480i,raw23631950i,scaled35374798i 1621254412000000000 pmu_metric,cpu0,eventL1D_PEND_MISS.PENDING_CYCLES,hostxyz raw18767833i,scaled28169827i,enabled2200888514i,running1466317384i 1621254412000000000此处enabled ≈ 2.2e9而running ≈ 1.46e9说明事件仅在大约三分之二的时间内被实际计数scaled已将这部分缺失时间折算进估算值在做长期趋势与比率分析时应优先使用scaled。使用建议与常见排错先确认平台非 Linux amd64 平台上插件静默不产出数据只打印一条平台不支持警告排查时留意日志。事件名匹配失败事件名须与下载的事件定义文件完全对应大小写不敏感若某个事件无法解析插件会报failed to resolve unknown event。缺省全量模式下无法解析的事件会被跳过并警告。core/uncore 混用core 小节中写 uncore 事件或反之会直接报错请核对事件定义文件划分。事件组过大启用perf_group后若报 invalid argument说明组内事件数超出该核心可用硬件计数器数可通过cpuid确认 PMU 数量并精简事件。文件描述符超限启动报required file descriptors number ... exceeds ...时按错误提示提升上限如ulimit -n或服务单元的LimitNOFILE。事件定义文件格式插件支持新版 perfmon 事件格式v1.1.0 起旧格式仍被接受但会在日志中打印警告建议从 perfmon 仓库更新事件文件见 插件 README 的 Changelog 与 intel_pmu.go 中DeprecatedFormatError处理逻辑。变更日志版本说明v1.0.0初始版本v1.1.0支持新的 perfmon 事件格式上游 perfmon 仓库 issue #22 引入旧格式仍被接受但会在日志中打印警告相关资源插件完整文档与示例输出插件 README可直接引用的最小可运行配置模板sample.conf插件主实现Init/Gather/Stop、文件描述符校验、指标发布intel_pmu.go配置解析事件/核心/socket ID 解析与去重config.go事件解析与翻译resolverresolver.go事件激活与 perf group 逻辑activators.go计数值读取与聚合scaled 计算、aggregate_uncore_units 实现reader.go单元测试初始化链路、文件描述符校验等intel_pmu_test.go插件注册入口custom builder 场景下按需加载plugins/inputs/all/intel_pmu.goTelegraf 插件的通用全局配置别名、标签/字段处理、插件排序等CONFIGURATION.md【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考