Performance Co-Pilot 7.2.2 常用 CLI 命令与工具详解
PCP 7.2.2 命令行工具链深度实测:pminfo 指标元数据与取值、pmval 实时采样、pmrep 报表与 90+ 内置指标集、pmlogger 归档创建与 pmdumplog/pmlogsummary 剖析、pmstat 整机总览、pmfind 服务发现,全部命令附真实回显与排障实录。
Performance Co-Pilot 7.2.2 常用 CLI 命令与工具详解
目标:系统讲解 Performance Co-Pilot(PCP)7.2.2 命令行工具链的日常用法。核心六件套——指标查询
pminfo、单指标实时采样pmval、多指标报表pmrep、归档创建与剖析pmlogger/pmdumplog/pmlogsummary/pmlogcheck、系统总览pmstat、服务发现pmfind——每个参数、每条命令、每段输出均来自真实服务器实测,并附 pmstore/pmprobe/pmseries 等关联工具速查与常见问题排障实录。
一、环境信息
本篇在一台已部署 PCP 的服务器上实测(安装过程见 《Ubuntu 22.04 安装 Performance Co-Pilot 7.2.2 指南》,配置体系见 《Performance Co-Pilot 7.2.2 配置参数详解》),环境信息如下:
| 项目 | 值 |
|---|---|
| 主机名 | pcp-server |
| 操作系统 | Ubuntu 22.04.5 LTS |
| PCP 版本 | 7.2.2 |
| 核心服务 | pmcd / pmlogger / pmie / pmproxy 全部 active |
| pmcd 监听 | 127.0.0.1:44321(实测仅回环接口,见 4.6 节) |
| pmproxy 监听 | 0.0.0.0:8139(经 pmproxy.options 的 -p 修改,默认 44322) |
| 键值库 | redis-server(127.0.0.1:6379,供 pmproxy 时序索引) |
| 归档目录 | /var/log/pcp/pmlogger/pcp-server/ |
工具版本实测(各工具统一随 PCP 发版):
root@pcp-server:~# pminfo -V
pminfo version 7.2.2
root@pcp-server:~# pmval -V
pmval version 7.2.2
root@pcp-server:~# pmrep -V
pmrep version 7.2.2
root@pcp-server:~# pmstat -V
pmstat version 7.2.2
root@pcp-server:~# pmfind -V
pmfind version 7.2.2
root@pcp-server:~# pmstore -V
pmstore version 7.2.2
⚠️ 例外:pmlogger 没有 -V 版本显示选项——它的 -V NUM 是"指定归档版本号",必须带参数:
root@pcp-server:~# pmlogger -V
pmlogger: option requires an argument -- 'V'
Usage: pmlogger [options] [archive]
查 pmlogger 版本请用包管理器或全局版本:pminfo -f pmcd.version(返回 "7.2.2")。
二、工具概览
PCP 的命令行工具按数据流向分为四类:
| 类别 | 工具 | 一句话定位 |
|---|---|---|
| 指标查询 | pminfo、pmprobe、pmseries | 查指标名/元数据/当前值/时序索引 |
| 实时采样 | pmval、pmrep、pmstat | 对 live pmcd 持续取数并格式化输出 |
| 归档读写 | pmlogger、pmdumplog、pmlogsummary、pmlogcheck、pmlogextract、pmlogreduce | 创建归档、剖析归档、离线分析 |
| 运行时管理 | pmstore、pmie、pmieconf、pmlogconf、pmfind | 在线改参、规则评估、配置生成、服务发现 |
六个核心工具的选择逻辑:
- 想知道**"这个指标是什么、现在值多少"** →
pminfo; - 想盯一个指标随时间变化 →
pmval; - 想一张表看多个指标/多实例、要 CSV/归档输出 →
pmrep; - 想把数据存下来以后分析 →
pmlogger(配pmdumplog/pmlogsummary读); - 想快速看一眼整机负载全貌(类
top/sar) →pmstat; - 想发现网络里有哪些 pmcd/pmproxy 服务 →
pmfind。
💡 技术拓展:PCP 工具的数据源有三形态,几乎所有查询/采样工具都通过同一组选项切换——
-h HOST连远程 pmcd(默认走本机 pmcd)、-a FILE读离线归档、-L直连本机 PMDA(绕过 pmcd)。本文所有示例覆盖这三种来源。
三、前置条件
- pmcd 运行中(所有 live 查询的前提):
root@pcp-server:~# systemctl is-active pmcd
active
root@pcp-server:~# pminfo -f pmcd.version
pmcd.version
value "7.2.2"
- 存在可分析的归档(4.4 节归档工具链的前提)。本机归档目录实测:
root@pcp-server:~# ls /var/log/pcp/pmlogger/pcp-server/
20261101.09.10-00.index 20261101.09.10.0.gz 20261101.09.10.meta.gz pmlogger.log
20261101.09.10-00.meta 20261101.09.10.index Latest pmlogger.log.prev
Latest 是文本清单,列出当前正在写入的归档卷;20261101.09.10 是每日治理(pmlogger_daily)合并压缩后的历史归档(.gz)。后文用 20261101.09.10 做离线示例。
- 普通用户即可查询;
pmstore写操作与 pmcd 管理需要相应权限(默认策略下本机 store 被[access]放行,详见配置篇 5.2 节)。
四、核心工具详解
4.1 pminfo:指标元数据与取值查询
pminfo 是 PCP 的"指标字典":给指标名,返回它的描述、帮助文本、PMID、标签、实例与当前值。它也是排查"指标到底存不存在、有没有值"的第一工具。
4.1.1 名字解析与取值
不带任何显示选项时,pminfo 只做名字解析(验证指标是否存在):
root@pcp-server:~# pminfo kernel.all.load
kernel.all.load
-f 抓取并打印所有实例的当前值:
root@pcp-server:~# pminfo -f kernel.all.load
kernel.all.load
inst [1 or "1 minute"] value 1.6900001
inst [5 or "5 minute"] value 1.61
inst [15 or "15 minute"] value 1.63
inst [内部编号 or "实例名"] 的格式直接揭示了实例结构。单值指标(无实例集)则没有 inst 前缀:
root@pcp-server:~# pminfo -f mem.util.free
mem.util.free
value 569600
-F 是 -f 的加强版:对不可枚举实例集(如按需展开的进程类指标)也强制取全部实例值:
root@pcp-server:~# pminfo -F disk.dev.read
disk.dev.read
inst [0 or "sda"] value 504925
4.1.2 元数据四件套:-d / -1 / -T / -t
-d 打印指标描述(数据类型、实例集、语义、单位):
root@pcp-server:~# pminfo -d kernel.all.load
kernel.all.load
Data Type: float InDom: 60.2 0xf000002
Semantics: instant Units: none
InDom: 60.2 即"domain 60(linux PMDA).序号 2"的实例域编号;Semantics: instant 表示瞬时值(另两种见 4.1.6 节语义说明)。
-1 把描述压成单行(便于脚本处理):
root@pcp-server:~# pminfo -1 kernel.all.load
kernel.all.load
kernel.all.load float 60.2 0xf000002 instant none
-T 打印详细帮助文本,-t 打印一行式帮助:
root@pcp-server:~# pminfo -T kernel.all.load
kernel.all.load
Help:
1, 5 and 15 minute load average
root@pcp-server:~# pminfo -t kernel.all.load
kernel.all.load [1, 5 and 15 minute load average]
4.1.3 PMID、标签与时序标识
-m/-M 打印指标唯一编号 PMID(域.序列.实例 三段):
root@pcp-server:~# pminfo -m kernel.all.load
kernel.all.load PMID: 60.2.0
root@pcp-server:~# pminfo -M kernel.all.load
kernel.all.load PMID: 60.2.0 = 251660288 = 0xf000800
-l 打印指标级与实例级标签(JSON 格式,含主机名、agent、machineid 等,是 pmproxy/时序库做维度过滤的基础):
root@pcp-server:~# pminfo -l kernel.all.load
kernel.all.load
labels {"agent":"linux","domainname":"localdomain","groupid":0,"hostname":"pcp-server","machineid":"ddef1ec03ec94561a0468c1c9ce61c75","userid":0}
inst [1 or "1 minute"] labels {"agent":"linux",...,"hostname":"pcp-server",...}
(输出节选,实测首尾:三个实例各带一行同构标签,... 处为与首行相同的完整 JSON。)
-s 打印源(source)与时序(series)标识——每个"指标×实例×来源"组合一个 40 位十六进制 ID,是 pmseries 时序 API 的查询键:
root@pcp-server:~# pminfo -s kernel.all.load
kernel.all.load
Source: 4e41f76ccfa4df86d26c81dca5a2dc4c9c9cf14d
Series: 0a1e939b8cff3df9f19f7226c56430921f65dc92
inst [1 or "1 minute"] series 7ed47e95430f9fad96b6621b6206f61b177e6616
inst [5 or "5 minute"] series 66df10d8df160e3e726f013d1a225c4b90e869f8
inst [15 or "15 minute"] series 96f2086e29de8a4eaa9ada62cf52bacff285652b
4.1.4 批量校验:-v
-v 静默校验模式:只报错、不打印,适合脚本里批量检查指标可用性:
root@pcp-server:~# pminfo -v kernel.all.load; echo rc=$?
rc=0
4.1.5 派生指标:全局与临时
配置篇 5.6 节定义的全局派生指标 demo.* 在任意工具里透明可用:
root@pcp-server:~# pminfo -f demo.load_pct
demo.load_pct
inst [1 or "1 minute"] value 28.16666666666667
inst [5 or "5 minute"] value 26.83333333333333
inst [15 or "15 minute"] value 27.16666666666667
-r 还能只在当前命令的上下文里临时注册派生指标(不落盘、不影响他人),实测 load×2:
root@pcp-server:~# pminfo -r "myload=kernel.all.load * 2" -f myload
myload
inst [1 or "1 minute"] value 3.3800001
inst [5 or "5 minute"] value 3.22
inst [15 or "15 minute"] value 3.26
(对照 4.1.1 节 kernel.all.load 的 1.69/1.61/1.63,×2 结果吻合。)
4.1.6 数据源切换:-a 归档与 -h 远程
-a 让 pminfo 从离线归档取"归档最后一个样本"的值:
root@pcp-server:~# cd /var/log/pcp/pmlogger/pcp-server
root@pcp-server:~# pminfo -a 20261101.09.10 -f kernel.all.load
kernel.all.load
inst [1 or "1 minute"] value 2.05
inst [5 or "5 minute"] value 2.2
inst [15 or "15 minute"] value 1.87
-h 指定远端 pmcd。本机实测 localhost 正常:
root@pcp-server:~# pminfo -h localhost -f pmcd.hostname
pmcd.hostname
value "pcp-server"
⚠️ 用本机网卡 IP 连接则被拒绝——实测本机 pmcd 只监听回环地址(见 4.6 节),远程访问需在 pmcd.options 用 -i 显式绑定对外接口:
root@pcp-server:~# pminfo -h 10.89.58.2 -f pmcd.hostname
pminfo: Cannot connect to PMCD on host "10.89.58.2": Connection refused
4.1.7 参数速查
| 选项 | 含义 | 实测备注 |
|---|---|---|
-a FILE / -h HOST / -L | 数据源:归档 / 远程 pmcd / 直连 PMDA | 三者互斥,默认本机 pmcd |
-f | 取所有实例当前值 | 最常用 |
-F | 连不可枚举实例也取全 | 进程级指标慎用(量大) |
-d / -1 | 描述 / 单行描述 | 含语义与单位 |
-T / -t | 帮助文本 / 一行帮助 | 未配置帮助时输出空 |
-m / -M | PMID / 含十进制与十六进制的 PMID | |
-l | 指标与实例标签(JSON) | |
-s | source/series 标识 | pmseries 查询键 |
-v | 静默校验 | 脚本友好 |
-r name=expr | 本上下文临时派生指标 | 不落盘 |
-c FILE | 加载全局派生指标文件 | 与 pmcd 已加载文件叠加 |
-b N | -f/-v 批量抓取大小 | 默认 128 |
⚠️ pminfo 不支持通配符:pminfo "kernel.all.*" 实测报 Error: kernel.all.*: Unknown metric name。按前缀找指标请用 pmseries 名字查询(4.7 节)或从 PMDA 侧列名。
4.2 pmval:单指标实时采样
pmval 一次盯一个指标,按固定间隔滚动打印各实例值,输出头部是指标元信息、正文是定宽列。
4.2.1 基本用法与输出结构
root@pcp-server:~# pmval -t 1 -s 3 kernel.all.load
metric: kernel.all.load
host: pcp-server
semantics: instantaneous value
units: none
samples: 3
interval: 1.00 sec
1 minute 5 minute 15 minute
1.430 1.560 1.610
1.400 1.550 1.610
1.400 1.550 1.610
输出分两段:元信息头(指标、主机、语义、单位、样本数、间隔)+ 数据区(实例名做列头,每行一个样本)。⚠️ 不带 -s/-T 时 pmval 永远运行,交互场景务必用 -s N(采样 N 次后退出)或 -T 时长 收尾。
4.2.2 实例过滤 -i
-i 按实例名过滤,实测单磁盘实例正常:
root@pcp-server:~# pmval -t 1 -s 2 -i sda disk.dev.read
metric: disk.dev.read
host: pcp-server
semantics: cumulative counter (converting to rate)
units: count (converting to count / sec)
samples: 2
interval: 1.00 sec
sda
0.0
0.0
⚠️ 实例名含空格时 -i 会按空白拆词而失败——pmval -i "1 minute" kernel.all.load 实测报 pmval: instance minute not available。绕行方法:用实例内部编号过滤(kernel.all.load 的三个实例编号为 1/5/15):
root@pcp-server:~# pmval -t 1 -s 2 -i 1 kernel.all.load
1
2.640
2.510
(输出节选,实测尾部:仅保留编号 1 的一列。usage 说明实例列表以逗号分隔。)
4.2.3 计数器语义:速率与原始值
disk.dev.read 是累计计数器(cumulative counter),pmval 默认做差分换算成速率(语义行自动标注 converting to rate,见 4.2.2)。-r 输出原始累计值:
root@pcp-server:~# pmval -t 1 -s 2 -r disk.dev.read
metric: disk.dev.read
host: pcp-server
semantics: cumulative counter
units: count
samples: 2
interval: 1.00 sec
sda
504970
504970
(同一指标两种视角:速率 0.0 次/秒 ↔ 累计计数 504970 纹丝不动,互相印证。)
💡 技术拓展:PCP 指标语义共三类——
instant(瞬时值,如 load、内存空闲量,直接取值);cumulative(累计计数器,如磁盘读次数,默认差分增速率);discrete(离散值,如磁盘容量,取值不换算)。pminfo -d的Semantics:行即标明类别,决定 pmval/pmrep 默认怎么"换算"你的数字。
4.2.4 精度、时间戳与归档源
-f N 控制小数位(默认 3):
root@pcp-server:~# pmval -t 1 -s 2 -f 2 kernel.all.load
metric: kernel.all.load
host: pcp-server
semantics: instantaneous value
units: none
samples: 2
interval: 1.00 sec
1 minute 5 minute 15 minute
1.36 1.54 1.61
1.36 1.54 1.61
-X 在归档重放时给每行加完整日期+微秒时间戳;实测对 live 源无效果(live 默认就不打时间列):
root@pcp-server:~# cd /var/log/pcp/pmlogger/pcp-server
root@pcp-server:~# pmval -a 20261101.09.10 -t 10 -s 3 -X kernel.all.load
metric: kernel.all.load
archive: 20261101.09.10
host: pcp-server
start: Sun Nov 1 09:10:13.394685 2026
end: Sun Nov 1 09:10:28.453592 2026
semantics: instantaneous value
units: none
samples: 3
interval: 10.00 sec
Sun Nov 1 09:10:13.394685 2026 No values available
1 minute 5 minute 15 minute
Sun Nov 1 09:10:23.394685 2026 2.030 2.190 1.870
注意首个样本 No values available:归档起点时刻早于第一个采样点,pmval 默认插值取数,窗口内没数据就报无值——这是归档分析的常见现象,不是错误。
派生指标同样可用:
root@pcp-server:~# pmval -t 1 -s 2 demo.x2
metric: demo.x2
host: pcp-server
semantics: instantaneous value
units: none
samples: 2
interval: 1.00 sec
1 minute 5 minute 15 minute
2.720 3.080 3.220
2.720 3.080 3.220
不存在的指标报错即退(rc=1):
root@pcp-server:~# pmval -t 1 -s 2 kernel.nonexistent
pmval: pmLookupName(kernel.nonexistent): Unknown metric name
4.2.5 参数速查
| 选项 | 含义 | 实测备注 |
|---|---|---|
-t DELTA / -s N / -T TIME | 间隔 / 样本数 / 结束时长 | 不带 -s/-T 永运行 |
-i INST | 实例过滤(逗号分隔) | 空格实例名用编号 |
-r | 原始计数器值 | 默认速率换算 |
-f N | 小数精度 | 默认 3 |
-X | 完整时间戳 | 仅归档重放有效 |
-a FILE / -h HOST / -L | 数据源三形态 | |
-S/-O/-T TIME | 时间窗口起点/原点/终点 | 归档切片分析用 |
-w N | 列宽 | |
--derived=FILE | 临时加载派生指标 |
4.3 pmrep:多指标报表
pmrep 是"报表工厂":同时输出多个指标、多实例,支持 stdout 表格、CSV、直接写 PCP 归档三种目标,还有 90+ 个内置指标集可一键复刻 sar/vmstat/iostat 等经典工具的输出。
4.3.1 默认 stdout 报表
root@pcp-server:~# pmrep -t 1 -s 3 kernel.all.load
k.a.load k.a.load k.a.load
1 minute 5 minute 15 minut
1.810 1.630 1.640
1.660 1.600 1.630
1.660 1.600 1.630
表头三行依次是缩写指标名(kernel.all.load → k.a.load)、实例名、单位(本指标无量纲故空行);每个"指标×实例"占一列。-p 在行首加时间戳列:
root@pcp-server:~# pmrep -t 1 -s 2 -p kernel.all.load
k.a.load k.a.load k.a.load
1 minute 5 minute 15 minut
09:34:54 1.850 1.640 1.640
09:34:55 1.850 1.640 1.640
-P N 调小数位(默认 3):
root@pcp-server:~# pmrep -t 1 -s 2 -P 1 kernel.all.load
k.a.load k.a.load k.a.load
1 minute 5 minute 15 minut
1.9 1.6 1.6
1.8 1.6 1.6
4.3.2 CSV 输出
-o csv 把表头压成单行、值逗号分隔,且自动带 Time 列,适合喂给脚本/表格软件:
root@pcp-server:~# pmrep -t 1 -s 3 -o csv kernel.all.load mem.util.used
Time,"kernel.all.load[1 minute]","kernel.all.load[5 minute]","kernel.all.load[15 minute]","mem.util.used"
2026-11-01 09:34:50,1.660,1.600,1.630,14873316
2026-11-01 09:34:51,1.660,1.600,1.630,14876744
2026-11-01 09:34:52,1.660,1.600,1.630,14881000
⚠️ 实测 7.2.2 的 -o 只接受 stdout/csv/archive 三种目标,-o json 报错:Error while parsing options: Invalid output target specified.。要 JSON 请走 pmproxy REST(配置篇 5.5 节)。
4.3.3 直接生成归档:-o archive -F
pmrep 可把采样结果直接落成 PCP 归档(三文件结构):
root@pcp-server:~# pmrep -t 1 -s 3 -o archive -F /tmp/pmrep_arc kernel.all.load
Recording 1 metrics to /tmp/pmrep_arc:
3 samples(s) with 1.0 sec interval ~ 2 sec duration.
root@pcp-server:~# ls /tmp/pmrep_arc*
/tmp/pmrep_arc.0 /tmp/pmrep_arc.index /tmp/pmrep_arc.meta
生成的归档可被 pmdumplog/pmlogsummary/pmval -a 等一切归档工具消费(见 4.4 节)。
4.3.4 实例排名 -J 与实例过滤 -i
-J N 只保留值最大的 N 个实例(磁盘/网络多实例场景定位热点设备利器):
root@pcp-server:~# pmrep -t 1 -s 2 -J 3 disk.dev.read
d.d.read
sda
count/s
N/A
0.000
(本机仅 1 个磁盘实例故只列 sda;N/A 是首样本差分窗口未就绪。)-i 过滤实例,且支持含空格的实例名(与 pmval 不同,实测通过):
root@pcp-server:~# pmrep -t 1 -s 2 -i "1 minute" kernel.all.load
k.a.load
1 minute
1.750
1.750
4.3.5 内联派生指标 -e
-e 临时注册派生指标参与报表(对照 4.1.5 的 pminfo -r):
root@pcp-server:~# pmrep -t 1 -s 2 -e "myload=kernel.all.load*0.5" myload kernel.all.load
myload myload myload k.a.load k.a.load k.a.load
1 minu 5 minu 15 min 1 minute 5 minute 15 minut
0.925 0.820 0.820 1.850 1.640 1.640
0.925 0.820 0.820 1.850 1.640 1.640
4.3.6 内置指标集::setname
/etc/pcp/pmrep/ 下的发行版配置定义了 90+ 个命名指标集(节选实测清单):
root@pcp-server:~# grep -h "^\[" /etc/pcp/pmrep/*.conf | sort -u | tr '\n' ' '
[collectl-dm-sD] [collectl-sD] [iostat-dktx] [mpstat-P-ALL] [pidstat] [pmstat] [proc-cpu] [sar-B] [sar-d-dev] [sar-n-DEV] [sar-u-ALL] [sar] [vmstat-d] [vmstat] ...
调用语法是位置参数加冒号前缀:pmrep :集合名。实测复刻 sar 的 CPU 报表与 vmstat 全貌:
root@pcp-server:~# pmrep -t 1 -s 2 :sar
CPU %user %nice %system %iowait %steal %idle
09:43:17 = N/A N/A N/A N/A N/A N/A
09:43:18 = 39.97 0.00 6.00 0.00 0.00 51.47
root@pcp-server:~# pmrep -t 1 -s 2 :vmstat
r b swpd free buff cache si so bi bo in cs us sy id wa st gu
6 0 2339652 228576 837044 8031876 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A
3 0 2339644 210024 837096 8029988 0 0 0 631 18428 22577 25 8 68 0 0 0
(每个集合自带宽度/精度/表头配置,首行 N/A 同样是首样本未就绪。)
4.3.7 自定义配置文件
配置文件用 ini 格式:节名即集合名,指标行采用紧凑语法 指标名 = 标签,实例,单位/量纲,类型,宽度,精度,上限(实测可跑通的最小例子):
root@pcp-server:~# cat /tmp/n.conf
[myset]
header = yes
kernel.all.load = load1
mem.util.free = free
root@pcp-server:~# pmrep -c /tmp/n.conf -t 1 -s 2 :myset
load1 load1 load1 free
1 min 5 min 15 mi
Kbyt
2.240 1.910 1.720 xxx
2.140 1.890 1.720 xxx
(free 列显示 xxx 是实测原样:默认列宽放不下 Kbyte 量级数值,加 width 字段或 -W 可解。)⚠️ 踩坑实录:把节写成 [metrics] 或 [global] 都报 No metrics specified.——节名必须与 :集合名 位置参数对应;-c 只接受文件/目录路径,-c sar 实测报 Failed to read configuration from 'sar': No such file or directory。
-C 校验模式:解析配置与指标后退出,不输出报表。
4.3.8 参数速查
| 选项 | 含义 | 实测备注 |
|---|---|---|
-t/-s/-T/-S/-O | 间隔/样本数/时长/窗口 | 同 pmval |
-o stdout|csv|archive | 输出目标 | 无 json;archive 配 -F |
-p | 行首时间戳 | |
-P N / -0 N | 优先/强制小数位 | 默认 3 |
-i STR | 实例过滤 | 支持空格实例名 |
-J COUNT | 值最大/最小的 N 实例 | 热点定位 |
-e DFNT | 内联派生指标 | |
-c FILE | 配置文件/目录 | 节名=:集合名 |
-C | 校验配置退出 | |
-r / -R | 原始计数器 | |
-w/-W | 列宽/强制列宽 | |
-X STR | 行列转置(colxrow) | |
:set | 内置指标集 | 90+ 个 |
4.4 pmlogger 与归档分析工具链
pmlogger 是归档创建器。常驻实例由 pmlogger_check 按 control 规格拉起(配置体系见 《配置参数详解》 5.3 节);日常运维更常用的是手工建一个临时归档取证,再用 pmdumplog/pmlogsummary/pmlogcheck 剖析。
4.4.1 配置文件与 -C 校验
pmlogger 的指标级配置核心语法是 log <mandatory|advisory> on <间隔> { 指标列表 }。实测最小配置:
root@pcp-server:~# cat /tmp/quick.conf
log mandatory on 1 second {
kernel.all.load
mem.util.free
disk.dev.read
}
root@pcp-server:~# pmlogger -C -c /tmp/quick.conf
[Sun Nov 1 09:36:59] pmlogger(38075) Info: Start
preprocessor cmd: /usr/lib/pcp/bin/pmcpp -rs -I /var/lib/pcp/config/pmlogger /tmp/quick.conf
Config parsed
-C 只做语法/指标校验不写数据,回显 Config parsed。⚠️ 实测两个易错点:①配置不要手写 $version=1.1 行——文件要先过 pmcpp 预处理器,$ 开头的旧式版本行实测报 Unexpected character '$';现代写法直接 log ... { } 块即可。②配置里引用不存在的指标不致命,实测 pmlogger -C 对 kernel.nonexistent 只给 Warning、仍 Config parsed 且 rc=0——上线前务必看 Warning 而不是只看退出码:
root@pcp-server:~# printf '$version=1.1\nkernel.nonexistent 1000 msec\n' > /tmp/bad.conf
root@pcp-server:~# pmlogger -C -c /tmp/bad.conf
[Sun Nov 1 09:36:10] pmlogger(37761) Info: Start
preprocessor cmd: /usr/lib/pcp/bin/pmcpp -rs -I /var/lib/pcp/config/pmlogger /tmp/bad.conf
Specification error in configuration file (/tmp/bad.conf)
[line 1] Unexpected character '$'
root@pcp-server:~# printf 'log mandatory on 1 second {\n kernel.nonexistent\n}\n' > /tmp/bad.conf
root@pcp-server:~# pmlogger -C -c /tmp/bad.conf
[Sun Nov 1 09:37:08] pmlogger(38091) Info: Start
preprocessor cmd: /usr/lib/pcp/bin/pmcpp -rs -I /var/lib/pcp/config/pmlogger /tmp/bad.conf
cache_bind(): pmLookupName(1, kernel.nonexistent): Unknown metric name
Warning [/tmp/bad.conf, line 3]
Problem with lookup for metric "kernel.nonexistent" ... logging not activated
Reason: Unknown metric name
Config parsed
(第一段是旧式 $version 行的致命语法错;第二段的 ... 为实测报错原文自带省略。)
4.4.2 限时采集与归档文件结构
-T 时长 让 pmlogger 采满即停,适合取证:
root@pcp-server:~# pmlogger -c /tmp/quick.conf -T 6sec /tmp/quicktest
root@pcp-server:~# ls -l /tmp/quicktest*
-rw-r--r-- 1 root root 2040 Nov 1 09:37 /tmp/quicktest.0
-rw-r--r-- 1 root root 872 Nov 1 09:37 /tmp/quicktest.index
-rw-r--r-- 1 root root 2431 Nov 1 09:36 /tmp/quicktest.meta
一个归档 = 三个文件:.0(数据卷,满 -v 卷大小后滚 .1…)、.meta(指标元数据字典)、.index(时间索引)。引用归档时省略后缀(-a /tmp/quicktest)。
4.4.3 pmdumplog:逐记录剖析
pmdumplog -m 打印标签与首尾元记录(归档"出生证明":主机、端口、归档路径、pmcd PID):
root@pcp-server:~# pmdumplog -m /tmp/quicktest
09:36:59.346761976 5 metrics
2.3.3 (pmcd.pmlogger.host): inst [38078 or "38078"] value "pcp-server"
2.3.0 (pmcd.pmlogger.port): inst [38078 or "38078"] value 4331
2.3.2 (pmcd.pmlogger.archive): inst [38078 or "38078"] value "/tmp/quicktest"
2.0.23 (pmcd.pid): value 37170
2.0.24 (pmcd.seqnum): value 12
09:36:59.346761976 3 metrics
60.2.0 (kernel.all.load):
inst [1 or "1 minute"] value 2.0999999
inst [5 or "5 minute"] value 1.75
inst [15 or "15 minute"] value 1.67
60.1.2 (mem.util.free): value 956960
60.0.4 (disk.dev.read): inst [0 or "sda"] value 506159
(输出节选,实测首尾:中间为每 1 秒一条的同构数据记录,末条为 09:37:05.326540534 的收尾元记录,内容与首条标签记录同构。)
pmdumplog -t 打印时间索引(起止时间与卷内偏移):
root@pcp-server:~# pmdumplog -t /tmp/quicktest
Temporal Index
Log Vol end(meta) end(log)
09:36:59.346761976 0 808 808
09:37:05.326540534 0 2431 1868
不带选项的 pmdumplog 全量逐样本转储(实测 6 秒归档输出近百行,节选首两条数据记录):
root@pcp-server:~# pmdumplog /tmp/quicktest | head -14
09:36:59.346761976 5 metrics
2.3.3 (pmcd.pmlogger.host): inst [38078 or "38078"] value "pcp-server"
...
09:36:59.346761976 3 metrics
60.2.0 (kernel.all.load):
inst [1 or "1 minute"] value 2.0999999
inst [5 or "5 minute"] value 1.75
inst [15 or "15 minute"] value 1.67
60.1.2 (mem.util.free): value 956960
(输出节选,实测首尾:后续每 1 秒一条同构记录,最后以收尾元记录结束。)
4.4.4 pmlogsummary 与 pmlogcheck
pmlogsummary 对归档内指标做统计汇总(均值/最值,附单位):
root@pcp-server:~# pmlogsummary /tmp/quicktest kernel.all.load mem.util.free
kernel.all.load ["1 minute"] 2.100 none
kernel.all.load ["5 minute"] 1.750 none
kernel.all.load ["15 minute"] 1.670 none
mem.util.free 932825.680 Kbyte
pmlogcheck 做归档完整性体检(静默即通过):
root@pcp-server:~# pmlogcheck /tmp/quicktest; echo rc=$?
rc=0
4.4.5 参数速查
| 选项 | 含义 | 实测备注 |
|---|---|---|
-c FILE | 指标配置文件 | 经 pmcpp 预处理 |
-C | 校验配置退出 | 未知指标仅 Warning |
-T TIME | 采集时长 | 取证利器 |
-t DELTA | 默认间隔 | 配置未指定时生效,默认 60 秒 |
-s SIZE / -v SIZE | 累计量终止 / 卷切换大小 | 常驻规格行用的就是 -v 100Mb |
-h HOST | 远程 pmcd 取数 | 需目标 pmcd 开放监听 |
-l FILE / -r | 诊断日志 / 记录大小报告 | |
-P / -L | 主实例标记 / 滞留 | 常驻编排用 |
-V NUM | 归档版本号(非 --version) | 实测易错点 |
4.5 pmstat:系统总览
pmstat 是一行式整机概览(融合 load/vmstat/iostat 视角),默认 1 秒滚动。-s N 限次实测:
root@pcp-server:~# pmstat -t 1 -s 3
@ Sun Nov 1 09:35:32 2026
loadavg memory swap io system cpu
1 min swpd free buff cache pi po bi bo in cs us sy id
1.75 2283m 959252 1009m 6339m 0 0 0 639 17K 22K 11 4 85
1.75 2283m 961508 1009m 6338m 21 0 175 51K 24K 36K 19 8 73
1.77 2283m 961660 1009m 6339m 0 0 0 367 17K 22K 10 5 85
列组速读:loadavg(1 分钟负载)|memory(swpd 交换占用/free 空闲 Kbyte/buff/cache)|swap(pi/po 换页)|io(bi/bo 块设备读写)|system(in 中断/cs 上下文切换)|cpu(us/sy/id 百分比)。
-x 扩展 CPU 列(追加 wa 等待、st 偷取、gu 客户机):
root@pcp-server:~# pmstat -x -t 1 -s 2
@ Sun Nov 1 09:35:35 2026
loadavg memory swap io system cpu
1 min swpd free buff cache pi po bi bo in cs us sy id wa st gu
1.77 2283m 963764 1009m 6339m 0 0 0 51K 15K 20K 8 4 88 0 0 0
1.77 2283m 980092 1009m 6339m 0 0 0 423 18K 23K 13 5 82 0 0 0
-a 重放归档(离线复盘历史时段):
root@pcp-server:~# pmstat -a 20261101.09.10 -t 10 -s 2
@ Sun Nov 1 09:10:13 2026
loadavg memory swap io system cpu
1 min swpd free buff cache pi po bi bo in cs us sy id
2.03 2579m 348524 835900 5875m ? ? ? ? ? ? ? ? ?
pmFetchGroup: End of PCP archive
⚠️ 实测归档首行除 loadavg 外全是 ?:pi/po/in/cs/us 等是差分语义指标,归档起点没有前值可差分,故无值——重放归档时建议窗口起点往后留 1-2 个采样周期。
4.6 pmfind:PCP 服务发现
pmfind 定位是网络服务发现(找网段里有哪些 pmcd/pmproxy 可连),不是指标名搜索。它支持三种发现机制:shell(调用外部脚本)、probe=<子网>(CIDR 探测)、all。
-V 看版本;-m probe=<子网> -s pmcd 探测服务,实测必须给 CIDR 掩码:
root@pcp-server:~# pmfind -m probe=127.0.0.1 -s pmcd -t 2
[Sun Nov 1 09:36:20] pmfind(37770) Error: __pmSubnetProbeDiscoverServices: No subnet mask provided
No pmcd servers discovered
root@pcp-server:~# pmfind -m probe=127.0.0.1/32 -s pmcd -t 2
Discovered pmcd servers:
pcp://127.0.0.1:44321
-s all 同时探测 pmcd 与 pmproxy 两类服务:
root@pcp-server:~# pmfind -m probe=127.0.0.1/32 -s all -t 2
Discovered pmcd servers:
pcp://127.0.0.1:44321
No pmproxy servers discovered
pmcd 被发现而 pmproxy 没有——实测原因:pmfind 按默认服务端口 44322 探测 pmproxy,本机 pmproxy 已按配置篇所述用 -p 改到 8139,44322 无监听故探测落空。端口被改过的服务,pmfind 探测不到。
⚠️ 关键实测发现:对本机网卡网段探测反而一无所获:
root@pcp-server:~# pmfind -m probe=10.89.58.0/24 -s pmcd -t 5
No pmcd servers discovered
原因:实测本机 pmcd 仅监听 127.0.0.1(/proc/net/tcp 监听项为 127.0.0.1:44321,网卡 IP 连接被拒,见 4.1.6)。要让 pmfind 跨主机发现,需在 pmcd.options 用 -i <地址> 显式绑定对外接口并重启 pmcd,使 pmcd 出现在网卡地址上。-m shell 机制依赖 mDNS(avahi),实测本机未装 avahi,输出 No pmcd servers discovered。
-S 改为输出服务源标识(source ID + 主机名,替代 URI 列表;该 ID 与 pminfo -s 的 Source 一致,可衔接时序查询),-q 静默模式只留退出码(实测无发现时 rc=1,可用作脚本探活):
root@pcp-server:~# pmfind -m probe=127.0.0.1/32 -s pmcd -S -t 2
4e41f76ccfa4df86d26c81dca5a2dc4c9c9cf14d pcp-server
root@pcp-server:~# pmfind -m probe=10.89.58.0/24 -s pmcd -q -t 5; echo rc=$?
rc=1
4.7 关联工具速查
| 工具 | 用途 | 实测命令与回显 |
|---|---|---|
pmstore | 在线写指标(受 [access] 约束) | pmstore pmcd.control.timeout 10 → pmcd.control.timeout old value=5 new value=10;改回 5 同理 |
pmprobe | 轻量探测:指标可用性+实例数+值 | pmprobe -v kernel.all.load → kernel.all.load 3 1.86 1.73 1.67(3=实例数);pmprobe -v mem.util.free → mem.util.free 1 401368;不带指标名则遍历全 PMNS(实测数千行,-V 附带 PDU 统计尾行 Total: 862) |
pmseries | 时序库查询(连 pmproxy/键值库) | pmseries -h localhost -p 6379 -m "kernel.all.load" → kernel.all.load;值查询 -v 实测空(时序值需 pmproxy 持续摄取或显式装载) |
pmlogconf | 生成/维护 pmlogger 配置 | pmlogconf -g <组标签> 查组状态(-g 必须带组标签参数,实测裸用打 usage) |
pmie/pmieconf | 规则推理引擎及其规则库管理 | 配置与实测见 《配置参数详解》 5.4 节 |
pmlogextract/pmlogreduce | 归档抽取/降采样 | 输入输出均为归档三文件 |
五、注意事项
- 所有采样工具默认永运行:
pmval/pmrep/pmstat不带-s/-T不会退出,脚本里务必限次;交互 Ctrl-C 即可。 - 计数器指标默认看到的是速率:cumulative 语义被差分换算(4.2.3),要原始累计值加
-r;反之瞬时指标加-r无意义。 - 首样本 N/A/No values 是常态:差分指标需要前值、归档起点在采样周期之间——分析窗口起点建议留 1-2 个采集周期余量(4.5 节实测)。
- pmrep 的
-o没有 json(7.2.2 实测),JSON 需求走 pmproxy REST;pmrep 写归档用-o archive -F,目标已存在会直接报错退出。 - pmlogger 配置先过 pmcpp 预处理器:旧式
$version行实测报错;-C对未知指标只给 Warning(rc=0),CI 里要 grepWarning而非只看退出码。 - pmcd 默认仅监听回环(4.6 节实测):远程
pminfo -h/pmlogger -h/跨机 pmfind 都要求目标机 pmcd 用-i绑定对外地址,并按需放行 44321 防火墙与[access]策略。 - 临时归档及时清理:
/tmp下取证归档(.0/.meta/.index)不在每日治理(pmlogger_daily)管辖范围,用完手删。 - 实例名含空格的过滤差异:pmval
-i按空白拆词(用实例编号绕行),pmrep-i支持带空格全名——跨工具迁移脚本时注意。
六、常见问题
Q1:pminfo "kernel.*" 报 Unknown metric name,怎么按前缀找指标?
A:pminfo 不支持通配符(实测)。名字检索走时序库:pmseries -h localhost -p 6379 -m "<模式>";或从 PMDA 帮助体系(pminfo -T)逐点确认。批量校验一组已知名用 pminfo -v。
Q2:pmval -i "1 minute" kernel.all.load 报 instance minute not available?
A:pmval 的 -i 列表按空白拆词,带空格实例名被拆成 1 和 minute。用实例内部编号:pmval -i 1 kernel.all.load(编号见 pminfo -f 的 inst [1 or "1 minute"]);或改用 pmrep -i "1 minute"(实测支持)。
Q3:pmrep -o json 报错?
A:7.2.2 实测 -o 仅 stdout|csv|archive。要 JSON 用 pmproxy 的 /metrics REST 端点(OpenMetrics 格式,配置篇 5.5 节实测)。
Q4:pmlogger -V 报 option requires an argument?
A:pmlogger 的 -V 是归档版本号参数(非版本显示)。查版本用 pminfo -f pmcd.version 或 dpkg -l pcp。
Q5:pmfind -m probe=192.168.1.5 报 No subnet mask provided?
A:probe 机制强制 CIDR,写 probe=192.168.1.5/32 或 probe=192.168.1.0/24(实测语法)。
Q6:pmfind 探测本机网段发现不到 pmcd?
A:实测 PCP 7.2.2 的 pmcd 默认只绑 127.0.0.1,网卡地址探测为空。在 pmcd.options 加 -i <对外地址> 并重启 pmcd 后,同网段 pmfind -m probe=<网段>/24 -s pmcd 才能发现(pcp://<ip>:44321)。
Q7:pmstat 重放归档第一行全是 ??
A:差分语义指标在归档起点无前值,实测行为(4.5 节)。把 -S 窗口起点后移一个采样周期即可。
Q8:pmseries -v 查不到值?
A:键值库里只有元数据/少量摄取数据时,名字查询(-m)有结果、值查询(-v)为空属实测现象。值数据依赖 pmproxy [keys] 的持续摄取与归档装载(配置篇 5.5 节),离线分析请直接对归档用 pmlogsummary/pmval -a。