Performance Co-Pilot 7.2.2 常用 CLI 命令与工具详解

PCP 7.2.2 命令行工具链深度实测:pminfo 指标元数据与取值、pmval 实时采样、pmrep 报表与 90+ 内置指标集、pmlogger 归档创建与 pmdumplog/pmlogsummary 剖析、pmstat 整机总览、pmfind 服务发现,全部命令附真实回显与排障实录。

Performance Co-PilotPerformance Co-PilotPCP监控2026/11/01

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)。本文所有示例覆盖这三种来源。

三、前置条件

  1. pmcd 运行中(所有 live 查询的前提):
root@pcp-server:~# systemctl is-active pmcd
active
root@pcp-server:~# pminfo -f pmcd.version

pmcd.version
    value "7.2.2"
  1. 存在可分析的归档(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 做离线示例。

  1. 普通用户即可查询;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 / -MPMID / 含十进制与十六进制的 PMID
-l指标与实例标签(JSON)
-ssource/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归档抽取/降采样输入输出均为归档三文件

五、注意事项

  1. 所有采样工具默认永运行:pmval/pmrep/pmstat 不带 -s/-T 不会退出,脚本里务必限次;交互 Ctrl-C 即可。
  2. 计数器指标默认看到的是速率:cumulative 语义被差分换算(4.2.3),要原始累计值加 -r;反之瞬时指标加 -r 无意义。
  3. 首样本 N/A/No values 是常态:差分指标需要前值、归档起点在采样周期之间——分析窗口起点建议留 1-2 个采集周期余量(4.5 节实测)。
  4. pmrep 的 -o 没有 json(7.2.2 实测),JSON 需求走 pmproxy REST;pmrep 写归档用 -o archive -F,目标已存在会直接报错退出。
  5. pmlogger 配置先过 pmcpp 预处理器:旧式 $version 行实测报错;-C 对未知指标只给 Warning(rc=0),CI 里要 grep Warning 而非只看退出码。
  6. pmcd 默认仅监听回环(4.6 节实测):远程 pminfo -h/pmlogger -h/跨机 pmfind 都要求目标机 pmcd 用 -i 绑定对外地址,并按需放行 44321 防火墙与 [access] 策略。
  7. 临时归档及时清理:/tmp 下取证归档(.0/.meta/.index)不在每日治理(pmlogger_daily)管辖范围,用完手删。
  8. 实例名含空格的过滤差异: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。

七、参考链接

Performance Co-Pilot 7.2.2 常用 CLI 命令与工具详解 - Quzuo