Performance Co-Pilot 7.2.2 配置参数详解

Performance Co-Pilot 7.2.2 配置体系全景解读:/etc/pcp.conf 全局路径、pmcd/pmlogger/pmie/pmproxy 四大守护进程参数逐项详解、采样间隔三级覆盖闭环实测、访问控制规则语法、派生指标加载机制与排障实录,附生产配置模板。

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

Performance Co-Pilot 7.2.2 配置参数详解

目标:把 Performance Co-Pilot(PCP)7.2.2 的整套配置体系讲透——全局路径文件 /etc/pcp.conf、pmcd 采集守护进程、pmlogger 归档器、pmie 推理引擎、pmproxy Web 代理四大组件的配置文件逐项解读,采样间隔三级覆盖机制的闭环实测,访问控制([access])规则,派生指标(derived metrics)的加载机制与排障实录,最后给出生产配置模板。本篇所有配置文件原文与命令输出均来自真实服务器实测。

一、环境信息

本篇在一台已完成 PCP 安装的服务器上实测(安装过程见 《Ubuntu 22.04 安装 Performance Co-Pilot 7.2.2 指南》),环境信息如下:

项目值
主机名pcp-server
操作系统Ubuntu 22.04.5 LTS
PCP 版本7.2.2(Packagecloud 官方仓库,7.2.2-1)
核心服务pmcd / pmlogger / pmie / pmproxy 全部 active
pmcd 监听端口TCP 44321(默认)
pmproxy 监听端口TCP 8139(经 pmproxy.options 的 -p 修改,默认 44322)
键值库redis-server active(供 pmproxy [keys] 时序索引使用)

四大服务状态实测:

root@pcp-server:~# systemctl is-active pmcd
active
root@pcp-server:~# systemctl is-active pmlogger
active
root@pcp-server:~# systemctl is-active pmie
active
root@pcp-server:~# systemctl is-active pmproxy
active

PCP 的"每日归档治理"依赖 systemd timer 定时任务,实测排班:

root@pcp-server:~# systemctl list-timers --all | grep -E "pmlogger|pmie"
Sun 2026-11-01 09:20:00 UTC 13min left  Sun 2026-11-01 08:50:30 UTC 15min ago pmlogger_check.timer         pmlogger_check.service
Sun 2026-11-01 09:20:10 UTC 13min left  Sun 2026-11-01 08:50:30 UTC 15min ago pmlogger_farm_check.timer    pmlogger_farm_check.service
Sun 2026-11-01 09:28:00 UTC 21min left  Sun 2026-11-01 08:58:34 UTC 7min ago  pmie_check.timer             pmie_check.service
Sun 2026-11-01 09:28:10 UTC 21min left  Sun 2026-11-01 08:58:34 UTC 7min ago  pmie_farm_check.timer        pmie_farm_check.service
Mon 2026-11-02 00:08:00 UTC 15h left    n/a                         n/a       pmie_daily.timer             pmie_daily.service
Mon 2026-11-02 00:10:00 UTC 15h left    n/a                         n/a       pmlogger_daily.timer         pmlogger_daily.service

解读:pmlogger_check 实测按 OnCalendar=*-*-* *:20:00 与 *:50:00 每小时两次"巡检拉起",pmie_check 同机制错峰在 *:28:00 / *:58:00(两者均有 OnBootSec=1min 开机首跑;守护进程挂了会自动重启,并在启动时重新生成配置);pmlogger_daily(每天 00:10)与 pmie_daily(每天 00:08)负责归档合并、压缩、裁剪等每日治理。pmlogger_daily.timer 的定义实测为 OnCalendar=*-*-* 00:10:00。

二、前置条件

  1. PCP 已安装且核心服务运行:配置体系围绕 /etc/pcp/ 下的文件展开,未安装时这些目录不存在。最小验证:
root@pcp-server:~# pminfo -f pmcd.version

pmcd.version
    value "7.2.2"
  1. root 权限:/etc/pcp/ 下配置文件属主为 root,修改与重启服务都需要 root。
  2. 理解 PCP 进程模型(详见 《Performance Co-Pilot 介绍与选型指南》第三章):pmcd 是指标汇聚中枢,pmlogger/pmie 是 pmcd 的两个"消费者"(分别负责归档与规则评估),pmproxy 把 pmcd 能力开放为 REST API。四个进程的配置相互独立,改哪个进程的配置就重启哪个进程。

三、参数查看与修改方式

PCP 的配置分散在四类载体上,先建立"改哪里、怎么生效、怎么验证"的全局地图:

配置载体位置作用生效方式
全局路径文件/etc/pcp.conf定义所有 PCP_* 路径与全局变量保存即生效(各程序启动时读取)
守护进程命令行选项/etc/pcp/<svc>/<svc>.optionspmcd/pmproxy 的启动参数systemctl restart <svc>
守护进程配置文件/etc/pcp/<svc>/ 下(pmcd.conf、control、pmproxy.conf 等)各进程专属配置systemctl restart <svc>
运行时动态参数pmcd 的 pmcd.* 指标不重启在线改参pmstore 即时生效

查看配置文件路径的权威方法:所有路径集中定义在 /etc/pcp.conf,不要凭记忆找文件:

root@pcp-server:~# grep -E "PMCDCONF|PMCDRCLOCAL|OPTIONS|CONTROL" /etc/pcp.conf
PCP_PMCDCONF_PATH=/etc/pcp/pmcd/pmcd.conf
PCP_PMCDOPTIONS_PATH=/etc/pcp/pmcd/pmcd.options
PCP_PMCDRCLOCAL_PATH=/usr/lib/pcp/services/local
PCP_PMPROXYOPTIONS_PATH=/etc/pcp/pmproxy/pmproxy.options
PCP_PMIECONTROL_PATH=/etc/pcp/pmie/control
PCP_PMSNAPCONTROL_PATH=/etc/pcp/pmsnap/control
PCP_PMLOGGERCONTROL_PATH=/etc/pcp/pmlogger/control

查看运行参数的方法:PCP 把大量守护进程自身状态暴露为指标,用 pminfo 直接查:

root@pcp-server:~# pminfo -f pmcd.numagents pmcd.numclients pmcd.pmie.numrules

pmcd.numagents
    value 11

pmcd.numclients
    value 5

pmcd.pmie.numrules
    inst [0 or "primary"] value 26
    inst [11836 or "11836"] value 26

pmcd.numagents 是当前注册的 PMDA 数量(11 个,与 pmcd.conf 行数一致);pmcd.pmie.numrules 显示 pmie 已加载 26 条规则(实例名即 pmie 进程 PID)。

运行时改参(不重启):部分参数支持 pmstore 在线修改,实测把 pmcd 的 IPC 超时从默认 5 秒改为 10 秒再改回:

root@pcp-server:~# pminfo -f pmcd.control.timeout

pmcd.control.timeout
    value 5
root@pcp-server:~# pmstore pmcd.control.timeout 10
pmcd.control.timeout old value=5 new value=10
root@pcp-server:~# pminfo -f pmcd.control.timeout

pmcd.control.timeout
    value 10
root@pcp-server:~# pmstore pmcd.control.timeout 5
pmcd.control.timeout old value=10 new value=5

pmstore 回显同时给出 old/new 值,改后 pminfo 复核确认生效。注意 pmstore 属于写操作,受 [access] 访问控制约束(见 5.2 节)。

配置生成工具:pmlogger 与 pmie 的指标级配置(config.default)不是手写的,分别由 pmlogconf、pmieconf 生成与维护(见 5.3、5.4 节)。

四、参数总览

PCP 7.2.2 实测环境的配置文件全景:

文件归属内容
/etc/pcp.conf全局70+ 个 PCP_* 路径/程序/版本变量
/etc/pcp/pmcd/pmcd.optionspmcd启动命令行选项(超时、PDU 上限、访问接口等)
/etc/pcp/pmcd/pmcd.confpmcdPMDA 注册表 + [access] 访问控制
/etc/pcp/pmlogger/controlpmlogger全局变量($PCP_CULLAFTER 等)+ 主机记录规格表
/etc/pcp/pmlogger/control.d/localpmlogger本机主记录器规格行(发行版默认放这里)
/etc/default/pmloggerpmloggersystemd 环境变量(PMLOGGER_LOCAL、PMLOGGER_INTERVAL 等)
/var/lib/pcp/config/pmlogger/config.defaultpmlogger记录哪些指标、各组间隔(pmlogconf 生成,153 个组指令)
/etc/pcp/pmie/control 与 control.d/localpmie主机规格表(同 control 格式)
/var/lib/pcp/config/pmie/config.defaultpmie规则库(pmieconf 生成,26 条规则)
/etc/pcp/pmproxy/pmproxy.confpmproxyini 格式:REST 开关、键值库、时序检索参数
/etc/pcp/pmproxy/pmproxy.optionspmproxy启动命令行选项(端口等)
/etc/pcp/derived/*.confpmcd派生指标表达式(经符号链接由 pmcd 加载)

💡 技术拓展:control 类文件(pmlogger/pmie 共用格式)的目录机制——主文件 ${PCP_PMLOGGERCONTROL_PATH} 与其 .d 目录(control.d/)下的所有文件在求值前自动拼接。发行版把默认规格放 control.d/local,站点自定义放 control.d/<站点名>,升级包时不覆盖本地修改。这与 systemd 的 unit.d/ drop-in 思路一致。

五、核心参数分类详解

5.1 全局路径文件 /etc/pcp.conf

/etc/pcp.conf 是 PCP 的"注册表":所有守护进程、管理脚本、客户端库启动时都从这里取路径与程序位置。实测本机关键变量(完整文件 70+ 行,此处节选有运维含义的部分):

root@pcp-server:~# grep -E "^PCP_" /etc/pcp.conf | grep -E "VERSION|ARCHIVE|LOG_DIR|VAR_DIR|USER|GROUP|AWK|PMCDCONF"
PCP_PMCDCONF_PATH=/etc/pcp/pmcd/pmcd.conf
PCP_VAR_DIR=/var/lib/pcp
PCP_LOG_DIR=/var/log/pcp
PCP_ARCHIVE_DIR=/var/log/pcp/pmlogger
PCP_REMOTE_ARCHIVE_DIR=/var/log/pcp/pmproxy
PCP_ARCHIVE_VERSION=3
PCP_AWK_PROG="/usr/bin/gawk --posix"
PCP_VERSION=7.2.2
PCP_USER=pcp
PCP_GROUP=pcp

逐项解读:

  • PCP_ARCHIVE_DIR=/var/log/pcp/pmlogger:归档落盘根目录,control.d/local 规格行里的 PCP_ARCHIVE_DIR/LOCALHOSTNAME 就是它展开后的 /var/log/pcp/pmlogger/pcp-server/。
  • PCP_REMOTE_ARCHIVE_DIR=/var/log/pcp/pmproxy:其他主机经 pmproxy 推送过来的归档存放处(配合 5.3 节 logpush)。
  • PCP_ARCHIVE_VERSION=3:新建归档使用第 3 版格式(自描述、支持增量标签),升级 PCP 不会改写历史归档。
  • PCP_USER/PCP_GROUP=pcp:四个守护进程全部以 pcp 用户身份运行(实测 pmie 进程属主即 pcp),排查"权限拒绝"类问题先看这里。
  • PCP_VERSION=7.2.2:与 pminfo -f pmcd.version 一致,脚本做版本判断可 grep 此文件而非起进程。

⚠️ 修改建议:这个文件发行版升级时会被包管理器覆盖,且绝大多数变量是路径常量,没有改的必要;确需覆盖个别行为(如归档目录)时,优先用各守护进程自己的配置文件,而不是动 /etc/pcp.conf。

5.2 pmcd:采集守护进程

pmcd 的配置分三层:启动选项(pmcd.options)、PMDA 注册与访问控制(pmcd.conf)、运行时动态参数(pmcd.* 指标)。

5.2.1 pmcd.options:启动命令行选项

实测文件内容(发行版默认全部注释,即用内置默认值;节选):

# command-line options to pmcd, uncomment/edit lines as required

# longer IPC timeout delay for slow agents (default 5)
# -t 10

# or suppress timeouts
# -t 0

# longer timeout for slow agent startup (default 3)
# -q 10

# disable service advertising (comment out to enable)
-A

# maximum incoming PDU size (bytes, default 64K)
# -L 16384 

# maximum number of contexts per PMAPI client (default 64)
# -C 128

# maximum number of metrics per pmFetch (default 32K)
# -M 40000

# assume identity of some user other than "pcp"
# -U root

参数速查(默认值取自文件内注释与 man 手册,实测本机未启用任何选项):

选项默认值含义何时需要改
-i <addr>全部接口只监听指定网卡地址多网卡服务器限制 pmcd 只对内网口服务
-t <sec>5对 PMDA 取数的 IPC 超时秒数慢速自定义 PMDA(如查数据库的 agent)报 timeout 时调大
-q <sec>3PMDA 启动握手超时agent 初始化慢(Java/Python 类)时调大
-L <bytes>64K单个 PDU 上限一次 fetch 大量实例报 PDU 超限时调大
-C <n>64每个客户端的上下文上限大量并发分析连接时调大
-M <n>32K单次 pmFetch 指标数上限工具批量拉取整树指标报超限
-l <file>内置改日志位置日志需要单独收集时
-A本机启用关闭 mDNS 服务通告安全基线要求不广播 PCP 服务时保留注释状态即可(默认就是 -A 生效)

实测确认本机 pmcd 仅带默认注入的 -A(无其他选项):

root@pcp-server:~# ps -ef | grep [p]mcd | head -2
pcp        26378       1  0 09:09 ?        00:00:00 /usr/lib/pcp/bin/pmcd -A

改完 pmcd.options 后 systemctl restart pmcd 生效;pmlogger/pmie 会自动重连(实测重启 pmcd 后 pminfo -f pmcd.version 立即恢复,见 5.6 节排障过程)。

5.2.2 pmcd.conf:PMDA 注册表与访问控制

实测全文(去掉注释表头):

# Name  Id      IPC     IPC Params      File/Cmd
root    1       pipe    binary          /var/lib/pcp/pmdas/root/pmdaroot
pmcd    2       dso     pmcd_init       /var/lib/pcp/pmdas/pmcd/pmda_pmcd.so
pmimport 43     dso     pmimport_init   /var/lib/pcp/pmdas/pmimport/pmda_pmimport.so
proc    3       pipe    binary          /var/lib/pcp/pmdas/proc/pmdaproc -d 3
xfs     11      pipe    binary          /var/lib/pcp/pmdas/xfs/pmdaxfs -d 11
linux   60      pipe    binary          /var/lib/pcp/pmdas/linux/pmdalinux
mmv     70      dso     mmv_init        /var/lib/pcp/pmdas/mmv/pmda_mmv.so
pmproxy 4       dso     pmproxy_init    /var/lib/pcp/pmdas/mmv/pmda_mmv.so
jbd2    122     dso     jbd2_init       /var/lib/pcp/pmdas/jbd2/pmda_jbd2.so
cifs    121     dso     cifs_init       /var/lib/pcp/pmdas/cifs/pmda_cifs.so
kvm     95      pipe    binary          /var/lib/pcp/pmdas/kvm/pmdakvm -d 95

[access]
disallow ".*" : store;
disallow ":*" : store;
allow "local:*" : all;

逐列解读注册表:

  • Name/Id:PMDA 域名与数字编号,指标 PMNS 名字首段即 Name(kernel.*、disk.* 属 linux=60,pmcd.* 属 pmcd=2)。Id 是全局唯一常量,自研 PMDA 需在官方 wiki 注册避免冲突。
  • IPC:pipe 为独立进程(崩溃可被 pmcd 拉起,适合易出错的第三方 agent);dso 为动态库内嵌 pmcd(零 IPC 开销、性能最好,发行版内置 agent 多用 dso)。
  • File/Cmd:agent 的可执行文件/so 路径,-d 3 表示把 domain 编号传给独立进程 agent。

[access] 访问控制语义(实测本机默认策略):

规则含义
disallow ".*" : store;主机模式 .*(匹配任意主机)禁止 store(写指标)
disallow ":*" : store;空主机段 + 任意用户,兜底禁止 store
allow "local:*" : all;主机 local(本机,即 pminfo -h local: 的同一主机规格写法)任意用户全权限

⚠️ 主机规格语法(实测排障归纳,详见第七章 Q2):规则冒号前整体是主机模式,只接受精确主机名/IP、local、unix 或结尾带 * 的通配;user@host 写法、CIDR 网段、IP 中段通配均不被接受,其中非法通配还会直接导致 pmcd 启动失败。

也就是说 5.2.3 的 pmstore 只能在服务器本机执行;远程连接受首两条 disallow 约束、默认无写权限。规则可写多条、自上而下匹配。

安装/卸载 PMDA 不改这个文件,用注册脚本:cd /var/lib/pcp/pmdas/<name> && ./Install(需要 root),实测 pmcd.numagents 会随之变化。

5.2.3 运行时动态参数

pmcd 自身暴露一组可写指标,pmstore 在线调整、pminfo 复核(实测见第三章)。常用的有:

指标默认作用
pmcd.control.timeout5IPC 取数超时(对应 -t),改后立即生效、重启进程后回到选项值
pmcd.agent.status—各 PMDA 状态(按实例列出,排障第一入口)
pmcd.pmlogger.archive/host/port—当前活跃归档器实例(pmdumplog 的标签记录里可见其值)
pmcd.pmie.numrules—pmie 已加载规则数

排障第一入口 pmcd.agent.status 实测(value 0 即该 PMDA 正常):

root@pcp-server:~# pminfo -f pmcd.agent.status | head -6

pmcd.agent.status
    inst [1 or "root"] value 0
    inst [2 or "pmcd"] value 0
    inst [3 or "proc"] value 0
    inst [4 or "pmproxy"] value 0

实测归档器自描述信息(来自归档标签记录,pmdumplog -m 首段):

09:02:17.565476795 5 metrics
    2.3.3 (pmcd.pmlogger.host): inst [20472 or "20472"] value "pcp-server"
    2.3.0 (pmcd.pmlogger.port): inst [20472 or "20472"] value 4330
    2.3.2 (pmcd.pmlogger.archive): inst [20472 or "20472"] value "/var/log/pcp/pmlogger/pcp-server/20261101.09.02"
    2.0.23 (pmcd.pid): value 17311
    2.0.24 (pmcd.seqnum): value 12

每条归档都记录了"谁(host)、经哪个端口、写到哪个文件、pmcd 是哪个 PID",这是 PCP 归档可自证溯源的设计。

5.3 pmlogger:归档器配置体系

pmlogger 的配置是四层叠加:control 全局变量 → control.d 主机规格 → /etc/default 环境变量 → config.default 指标组。理解优先级是本章重点(5.3.5 有闭环实测)。

5.3.1 control:全局变量与主机规格表

实测 /etc/pcp/pmlogger/control 的变量段(去掉注释后的有效行):

$version=1.1

文件内注释给出的可调变量(默认全部注释,即用 pmlogger_daily 内置默认):

# Uncomment one of the lines below to enable/disable culling behaviour
# that is different to the pmlogger_daily default [14].
#$PCP_CULLAFTER=0
#$PCP_CULLAFTER=3
#$PCP_CULLAFTER=never

# Uncomment one of the lines below to enable/disable compression behaviour
# that is different to the pmlogger_daily default.
#$PCP_COMPRESSAFTER=0
#$PCP_COMPRESSAFTER=3
#$PCP_COMPRESSAFTER=never
  • $PCP_CULLAFTER:归档保留天数,超期删除;默认 14 天,0 为归档写完当天立即裁剪,never 永不清理。
  • $PCP_COMPRESSAFTER:几天前归档转 .gz 压缩;默认按 pmlogger_daily 内置策略,never 不压缩。
  • 规格表列格式(文件头注释实测原文归纳):Host P? S? Directory Args——P 是否主记录器、S 是否走 pmsocks、Directory 归档目录、Args 传给 pmlogger 的参数。LOCALHOSTNAME 是占位符,第一列展开为 local:、目录列展开为主机名。

5.3.2 control.d/local:本机主记录器规格行

实测发行版默认(/etc/pcp/pmlogger/control.d/local):

LOCALHOSTNAME	y   n	PCP_ARCHIVE_DIR/LOCALHOSTNAME	-r -T24h10m -c config.default -v 100Mb

参数行逐项解读(语义取自 pmlogger --help 实测):

参数含义
-r归档按时间滚动:每天 00:00 切新归档,配合 pmlogger_daily 合并
-T24h10m本归档存活 24 小时 10 分钟后主动结束(给 daily 治理留 10 分钟余量)
-c config.default使用配置文件 config.default(相对归档目录解析,实际为 /var/lib/pcp/config/pmlogger/config.default)
-v 100Mb单个归档卷超过 100MB 即切换下一卷(.0、.1、.2…)

同一文件里还有一条注释掉的远程推送模板(7.x 起 logpush 形态):

#LOCALHOSTNAME	y   n	+PCP_ARCHIVE_DIR/LOCALHOSTNAME	-r -T24h10m -c config.default -v 100Mb http://<remotehost>:44322 

目录列加 + 前缀表示本机不保留归档、直接推送到远端 pmproxy(7.2.2 支持 HTTPS 与 Basic Auth)。做"多机集中归档"时,中心机把各 agent 主机加进自己的 control 表即可反向拉取;两种拓扑二选一。

5.3.3 /etc/default/pmlogger:systemd 环境变量

实测有效行与注释默认值:

PMLOGGER_LOCAL=1
# PMLOGGER_MAXPENDING=5
# PMLOGGER_INTERVAL=60
# PMLOGGER_CHECK_SKIP_LOGCONF=yes
# PMLOGGER_CHECK_SKIP_JANITOR=yes
# PMLOGGER_JANITOR_ARGS='-V'
  • PMLOGGER_LOCAL=1:只接受本机连接(0 允许远程 pmlogger 客户端);删掉该变量则放开。
  • PMLOGGER_MAXPENDING:待连接队列长度,默认 5。
  • PMLOGGER_INTERVAL=60:默认采样间隔(秒)。注释明确:默认 60 秒,装了 pcp-zeroconf 则 10 秒;优先级低于 control 参数行的 -t,更低于 config 文件里的显式间隔组。
  • PMLOGGER_CHECK_SKIP_LOGCONF:置 yes 后 pmlogger_check 不再每次重生成 config.default(PMDA 配置稳定时可省 CPU 与意外变更)。
  • PMLOGGER_CHECK_SKIP_JANITOR / PMLOGGER_JANITOR_ARGS:控制巡检脚本对"游离归档进程/文件"的清理行为。

5.3.4 config.default:指标组与间隔(pmlogconf 生成)

实测文件头与两个典型组(/var/lib/pcp/config/pmlogger/config.default,共 1500+ 行):

#pmlogconf 2.0
#
# pmlogger(1) config file created and updated by pmlogconf
# Auto-generated by pmlogconf on: Sun Nov  1 07:58:12 2026

#
# DO NOT UPDATE THE INITIAL SECTION OF THIS FILE.
# Any changes may be lost the next time pmlogconf is used
# on this file.
#
#+ groupdir /var/lib/pcp/config/pmlogconf
#
#+ cpu/summary:y:default:
## utilization (usr, sys, idle, ...) over all CPUs
log advisory on default {
	kernel.all.cpu
}

实测全文含 153 个 #+ 组指令,格式 #+ <组名>:<y|n|x>:<间隔>:——第三列 y 启用、n 禁用、x 表示该组在本机不适用(如未装 apache 时 apache/*:x::)。实测间隔列取值分布:default 66 组、once 14 组、60 seconds 2 组、5 minutes 1 组,其余 70 组间隔为空(禁用/不适用组);另有手工追加的显式 1 second 组。

四种间隔关键字语义:

写法含义
log advisory on default { ... }用"默认间隔"(即 60 秒,或被 -t/PMLOGGER_INTERVAL 改写后的值)
log advisory on 5 minutes { ... }该组固定 300 秒(如 proc.memory.size 等进程内存组)
log advisory on once { ... }只在归档开头记录一次(适合 hinv.* 硬件清单类不变化指标)
log advisory on 1 second { ... }显式固定 1 秒,任何默认间隔设置都不影响它

实测本机文件尾部的手工追加区(注释明示这是唯一安全的手改位置):

# It is safe to make additions from here on ...
#

log advisory on 1 second {
	kernel.all.load
	mem.util.free
}
#----
[access]
disallow .* : all;
disallow :* : all;
allow local:* : enquire;

文件尾部还有一个 [access] 段:这是 pmlogger 进程自身的访问控制(与 pmcd.conf 的 [access] 无关),限制谁能连到这个记录器。

用 pmlogconf -g 查询某组的当前状态(实测):

root@pcp-server:~# pmlogconf -g cpu/summary /var/lib/pcp/config/pmlogger/config.default
#+ /var/lib/pcp/config/pmlogconf/cpu/summary:y:default:

含义:cpu/summary 组启用、走默认间隔。pmlogconf 的 -r 选项可强制重新探测所有组(装新 PMDA 后配置未更新时用)。

5.3.5 采样间隔三级覆盖:闭环实测

PCP 的间隔优先级:config.default 显式间隔组 > control 参数行 -t > /etc/default/pmlogger 的 PMLOGGER_INTERVAL > 内置默认 60 秒。三档逐一实测,验证手段统一用 pmlogger 启动时写入 /var/log/pcp/pmlogger/pcp-server/pmlogger.log 的摘要行(每组"实际生效间隔 + 字节量 + 折算日增"):

第一档:默认 60 秒(发行版开箱状态):

} logged every 60 sec: 36836 bytes or 50.59 Mbytes/day
} logged every 300 sec: 748 bytes or 0.21 Mbytes/day
} logged every 1 sec: 116 bytes or 9.56 Mbytes/day

第二档:PMLOGGER_INTERVAL=30(在 /etc/default/pmlogger 追加一行后 systemctl restart pmlogger):

} logged every 30 sec: 36836 bytes or 101.17 Mbytes/day
} logged every 300 sec: 708 bytes or 0.19 Mbytes/day
} logged every 1 sec: 116 bytes or 9.56 Mbytes/day

default 组从 60 秒变 30 秒、日增从 50.59 翻倍到 101.17 MB;300 秒组与 1 秒组纹丝不动——证明环境变量只改写 advisory on default 的"默认"值。

第三档:control.d/local 参数行加 -t 10sec(同时删除 PMLOGGER_INTERVAL 行,重启 pmlogger):

LOCALHOSTNAME	y   n	PCP_ARCHIVE_DIR/LOCALHOSTNAME	-r -T24h10m -t 10sec -c config.default -v 100Mb
} logged every 10 sec: 36836 bytes or 303.52 Mbytes/day
} logged every 300 sec: 724 bytes or 0.20 Mbytes/day
} logged every 1 sec: 116 bytes or 9.56 Mbytes/day

-t 10sec 压过了环境变量档;显式组依旧恒定。恢复默认再重启,摘要行回到第一档 60 秒输出,闭环完成。

磁盘量换算(实测数据):默认 60 秒全量约 50 MB/天/主机;加一个 1 秒组(2 个指标)约 9.6 MB/天;若整体提到 10 秒则 303 MB/天。生产上"全默认 + 关键指标单独 1~5 秒组"是性价比最高的形态。

⚠️ 验证间隔时不要用 pmval -a <归档> 直接看:pmval 对归档默认按 1 秒重采样,任何间隔都会显示 interval 1.00 sec,造成"配置没生效"的假象。正确方法要么给 pmval 显式 -t <期望间隔>,要么用 pmdumplog <归档> | grep -c "<指标名>" 数记录条数(本实测用摘要行 + 记录计数双重确认)。

5.3.6 pmlogger_daily:每日归档治理

timer 每天 00:10 执行的脚本实测位于 /usr/lib/pcp/bin/pmlogger_daily,其用法(实测 -? 输出节选):

Usage: pmlogger_daily [options]

Options:
  -c FILE, --control=FILE
                        pmlogger control file
  -E, --expunge         expunge metrics with metadata inconsistencies when merging archives
  -k TIME, --discard=TIME
                        remove archives after TIME (format DD[:HH[:MM]])
  -d fssize, --disk=fssize
                        set maximum disk usage for archives for each pmlogger instance
  -K                    compress, but no other changes
  -m ADDRs, --mail=ADDRs
                        send daily NOTICES entries to email addresses
  -N, --showme          perform a dry run, showing what would be done
  -n, --noerror         always exit with status 0 (for systemd services)
  -P, --noproxy         do not process archives pushed via pmproxy(1)
  -Q, --proxyonly       only process archives pushed via pmproxy(1)
  -r, --norewrite       do not process archives with pmlogrewrite(1)

要点:-k 就是 $PCP_CULLAFTER 的命令行形态;-N 干跑最安全(先看清会动哪些归档再接管默认 timer);-d 给每个记录器实例设归档磁盘配额。日常治理(合并昨日归档、压缩、裁剪、通知 pmlogger_check 拉起新实例)都在这一步完成——实测归档目录中已可见压缩后的历史卷(如 20261101.07.58.0.gz、.index 保持明文以便快速检索)。

5.4 pmie:推理引擎配置

pmie 用与 pmlogger 相同的 control/control.d 主机规格机制,规则库则由 pmieconf 生成。

5.4.1 control.d/local 与运行形态

实测 /etc/pcp/pmie/control.d/local 有效行:

LOCALHOSTNAME   y   n   PCP_LOG_DIR/pmie/LOCALHOSTNAME/pmie.log   -c config.default

对照实际进程命令行(实测 ps -ef):

pcp        11836       1  0 08:08 ?        00:00:00 /usr/bin/pmie -b -m pmie_check -F -P -l /var/log/pcp/pmie/pcp-server/pmie.log -c config.default

-P(主推理引擎)、-F(systemd 就绪通知)、-m pmie_check(标注由巡检脚本拉起)都是 pmie_check 包装注入的;-c config.default 即规则文件。

5.4.2 规则语法与内置规则实例

实测 /var/lib/pcp/config/pmie/config.default 中的高负载规则全文:

// 1 cpu.load_average
delta = 2 min;
cpu.load_average = 
some_host (
    // threshold scales with the number of CPUs (works better for
    // large systems) and there is an absolute lower bound,
    // especially for small systems
    kernel.all.load  #'1 minute' > hinv.ncpu  * 3
    && kernel.all.load  #'1 minute' > 4
) -> syslog 10 min "High 1-minute load average" " %vload@%h";

逐要素解读:

  • delta = 2 min;:该规则每 2 分钟评估一次(规则级频率,与采样间隔独立)。
  • some_host (...):多主机归档/查询时任一主机满足即触发;本机场景等价单条件。
  • kernel.all.load #'1 minute':实例选择符——只取"1 分钟"实例;hinv.ncpu * 3 让阈值随核数伸缩(本机 6 核即 18),&& > 4 给小机器兜底绝对下限。
  • -> syslog 10 min "..." "%vload@%h":动作写 syslog,10 分钟抑制窗口防告警风暴;%vload 输出变量值、%h 输出主机名。

5.4.3 pmieconf:规则管理 CLI

实测 pmieconf -? 用法(节选):

Usage: pmieconf [options] [ command [args...] ]

Commands:
  1. help  [ { . | all | global | <rule> | <group> } [<variable>] ]
  2. rules  [ enabled | disabled ]
  3. groups
  4. status
  5. enable  { . | all | <rule> | <group> }

(后续还有 disable、modify 子命令。)实测当前启用规则 24 条,节选:

root@pcp-server:~# pmieconf rules enabled | head -6
  cpu.context_switch  [High aggregate context switch rate]
  cpu.load_average  [High 1-minute load average]
  cpu.system  [Busy executing in system mode]
  cpu.util  [High average processor utilization]
  dmthin.data_high_util  [dmthin pool data is filling up]
  dmthin.metadata_high_util  [dmthin pool metadata is filling up]

改单条规则阈值用 pmieconf modify <rule> <变量> <值>(三个位置参数,实测用法行:8. modify { . | all | global | <rule> | <group> } <variable> <value>)。变量名与当前值用 pmieconf list 查,实测:

root@pcp-server:~# pmieconf list cpu.load_average | tail -3
  vars: enabled = yes
        per_cpu_load = 3
        min_load = 4

即 5.4.2 规则里 hinv.ncpu * 3 与 > 4 两个阈值的真身。把绝对下限改 8:pmieconf modify cpu.load_average min_load 8,改完 pmie_check 下一轮巡检(实测 :28/:58)或 systemctl restart pmie 生效;pmcd.pmie.numrules 可验证规则数。pmieconf status 实测:

root@pcp-server:~# pmieconf status
  verbose:  off
  enabled rules:  24 of 45
  pmie configuration file:  /etc/pcp/pmie/config.default
  pmie processes (PIDs) using this file:  (none found)

⚠️ 注意后两行的"名实差":status 报的默认路径 /etc/pcp/pmie/config.default 在本机并不存在(实测 ls 报 No such file),真实规则文件在 /var/lib/pcp/config/pmie/config.default(control 行 -c config.default 按 pmie 规则目录解析);路径不一致时 status 的 PID 探测也会落空显示 (none found),不代表 pmie 没在跑(以 ps -ef | grep [p]mie 为准,见 5.4.1)。显式指定真实文件即可对上,实测:

root@pcp-server:~# pmieconf -f /var/lib/pcp/config/pmie/config.default status
  verbose:  off
  enabled rules:  25 of 45
  pmie configuration file:  /var/lib/pcp/config/pmie/config.default
  pmie process (PID) using this file:  11836

(PID 11836 正是 5.4.1 实测的 pmie 进程;规则计数以文件内 enabled = yes 标记为准。)

5.4.4 自定义规则一次性评估实测

调试规则不必重启守护进程,pmie -c <文件> 前台跑。实测 /tmp/demo.pmie:

loadcheck = some_host ( kernel.all.load #'1 minute' >= 0 ) -> print "1-min load: %v";
root@pcp-server:~# pmie -c /tmp/demo.pmie -t 1sec -T 2sec
Sun Nov  1 09:07:52 2026: 1-min load: 3.53
Sun Nov  1 09:07:53 2026: 1-min load: 3.53
Sun Nov  1 09:07:54 2026: 1-min load: 3.32
[Sun Nov  1 09:07:54] pmie(21588) Info: evaluator exiting

-t 1sec -T 2sec 表示 1 秒间隔评估、2 秒后退出,三条输出即三次评估命中(条件 >= 0 恒真,用于验证语法与取值链路)。-C 选项可只解析不执行(语法检查)。

5.5 pmproxy:REST API 与时序检索

5.5.1 pmproxy.conf 各段详解

实测 /etc/pcp/pmproxy/pmproxy.conf 有效配置(ini 格式):

[pmproxy]
pcp.enabled = true
http.enabled = true
resp.enabled = false
secure.enabled = true
[http]
Access-Control-Allow-Headers = X-Grafana-Device-ID
[keys]
enabled = true
servers = localhost:6379
[discover]
enabled = true
exclude.metrics = proc.*,acct.*
exclude.indoms = 3.9,3.40,79.7
[pmsearch]
enabled = true
count = 10
[pmseries]
enabled = true
cursor.count = 256
stream.expire = 86400
stream.maxlen = 8640
[pmlogger]
enabled = true
段关键项含义
[pmproxy]pcp.enabledPCP 原生协议客户端接入(pmproxy 兼作 pmcd 的 Web 前置)
http.enabledREST API 开关
resp.enabledRESP 协议代理(文件内注释原文 "RESP proxying (key server serialisation protocol)",即把 pmproxy 作为键值库序列化协议的代理),本机为 false
secure.enabledSSL/TLS 协议封装支持(注释原文 "support SSL/TLS protocol wrapping"),证书/私钥在同文件的 certificates/private_key 注释项中配置
[keys]servers时序索引写入的键值库地址。实测本机 redis-server active,/proc/net/tcp 可见 0100007F:18EB(127.0.0.1:6379)LISTEN,且 pmproxy 已与其建立 ESTABLISHED 连接
[discover]exclude.metrics自动发现时跳过高基数指标(进程级 proc.* 实例太多会撑爆索引)
[pmseries]stream.expire = 86400时序流键 24 小时过期
stream.maxlen = 8640单流保留条目上限
[pmlogger]enabled = true接收远程主机 logpush 推送的归档(存到 PCP_REMOTE_ARCHIVE_DIR)

5.5.2 pmproxy.options:端口与监听

实测 /etc/pcp/pmproxy/pmproxy.options 启用了两行:

# serve REST API on TCP port 8139
-p 8139

# disable service advertising (comment out to enable)
-A

-p 把默认 44322 改到 8139(本机 REST 服务对外端口);其余选项(-i 限定接口、-L PDU 上限、-U 运行身份、-x 应急日志)保持注释默认。

5.5.3 REST API 实测

/metrics 端点输出 OpenMetrics 文本(实测节选):

root@pcp-server:~# curl -s "http://localhost:8139/metrics?name=kernel.all.load"
# PCP5 kernel.all.load 60.2.0 float 60.2 instant none
# HELP kernel_all_load 1, 5 and 15 minute load average
# TYPE kernel_all_load gauge
kernel_all_load{instid="1",instname="1 minute",hostname="pcp-server",agent="linux",domainname="localdomain",machineid="ddef1ec03ec94561a0468c1c9ce61c75"} 3.02
kernel_all_load{instid="5",instname="5 minute",hostname="pcp-server",agent="linux",domainname="localdomain",machineid="ddef1ec03ec94561a0468c1c9ce61c75"} 2.03
kernel_all_load{instid="15",instname="15 minute",hostname="pcp-server",agent="linux",domainname="localdomain",machineid="ddef1ec03ec94561a0468c1c9ce61c75"} 1.73

每个指标实例一行,标签自动带上 hostname、agent、machineid,可直接喂给 Prometheus 生态抓取。

/series/* 端点走时序索引(实测):

root@pcp-server:~# curl -s "http://localhost:8139/series/metrics?match=kernel.all.load"
["kernel.all.load"]

⚠️ 过滤参数是 match=(glob 模式),不是 name=:实测 ?name=kernel.all.load 不做过滤、返回全部指标名列表(数千条),?match= 才命中单条——这是对接自研面板时最容易踩的坑。

根路径探测(实测):curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8139/ 返回 400(响应体为 400 Bad Request 的 HTML 错误页),属预期行为——pmproxy 没有首页,一切请求须走 /metrics、/series/...、/search/... 等具体端点。

5.6 派生指标(derived metrics):表达式合成新指标

派生指标允许用已有指标的四则运算合成新指标,由 pmcd 加载后即注册为 PMNS 中的普通指标,各客户端命令一视同仁地查询(实测 pminfo 取值与 pmval 连续采样均正常)。这是 PCP 版的"虚拟指标",对标 Prometheus recording rules。

5.6.1 加载机制(实测确认的真实目录)

发行版把派生指标源文件放在 /etc/pcp/derived/,但 pmcd 实际加载目录是 /var/lib/pcp/config/derived/,前者靠符号链接挂过去。实测:

root@pcp-server:~# ls /etc/pcp/derived/
cpu-util.conf  demo.conf  denki.conf  iostat.conf  mssql.conf  openmetrics.conf  proc.conf
root@pcp-server:~# ls -l /var/lib/pcp/config/derived/
total 0
lrwxrwxrwx 1 root root 30 Oct  7 03:08 cpu-util.conf -> /etc/pcp/derived/cpu-util.conf
lrwxrwxrwx 1 root root 26 Nov  1 08:54 demo.conf -> /etc/pcp/derived/demo.conf
lrwxrwxrwx 1 root root 27 Oct  7 03:08 denki.conf -> /etc/pcp/derived/denki.conf
lrwxrwxrwx 1 root root 28 Oct  7 03:08 iostat.conf -> /etc/pcp/derived/iostat.conf
lrwxrwxrwx 1 root root 27 Oct  7 03:08 mssql.conf -> /etc/pcp/derived/mssql.conf
lrwxrwxrwx 1 root root 33 Oct  7 03:08 openmetrics.conf -> /etc/pcp/derived/openmetrics.conf
lrwxrwxrwx 1 root root 26 Oct  7 03:08 proc.conf -> /etc/pcp/derived/proc.conf

加载时机是 pmcd 启动:新增/修改文件后必须 ln -sf(新文件)并 systemctl restart pmcd 才会注册。

5.6.2 自定义指标实测

实测 /etc/pcp/derived/demo.conf:

demo.load_pct = (100 * kernel.all.load) / hinv.ncpu
demo.load_pct(oneline) = load averages as percentage of CPU count
demo.x2 = kernel.all.load * 2
demo.x2(oneline) = doubled load, all instances

语法:<域>.<名> = <表达式> 定义指标;<名>(oneline) = <文本> 挂单行帮助(属性名只认 oneline、units 等固定集合)。表达式里 kernel.all.load 是多实例指标,结果按实例展开。验证(本机 6 核):

root@pcp-server:~# pminfo -f demo.load_pct demo.x2

demo.load_pct
    inst [1 or "1 minute"] value 39.33333079020182
    inst [5 or "5 minute"] value 30.16666666666667
    inst [15 or "15 minute"] value 27.66666666666667

demo.x2
    inst [1 or "1 minute"] value 4.7199998
    inst [5 or "5 minute"] value 3.6199999
    inst [15 or "15 minute"] value 3.3199999

demo.load_pct 即"负载折算 CPU 占用百分比"(1 分钟负载 2.36/6 核 ≈ 39.3%),比裸 load 更可比。

5.6.3 排障实录:三个真实报错

派生指标报错不进 pmcd.log,进 journald,用 journalctl -u pmcd 看。三个实测踩坑:

① 帮助属性写错——把 (oneline) 写成 (help):

Nov 01 09:09:18 pcp-server pmcd[25391]: [/var/lib/pcp/config/derived/bad.conf:2] Error: pmLoadDerivedConfig: attribute (help) is unknown for metric (bad.a)
Nov 01 09:09:18 pcp-server pmcd[25391]: bad.a(help) = text help

解决:属性名用 oneline(单行帮助)或 units(单位)。

② 表达式里用 pmie 式实例选择符——#'1 minute' 在 derived 语法中不支持:

Nov 01 09:09:22 pcp-server pmcd[25886]: [/var/lib/pcp/config/derived/bad.conf:1] Error: pmRegisterDerived(bad.b, ...) syntax error
Nov 01 09:09:22 pcp-server pmcd[25886]: Illegal character

解决:derived 表达式对全部实例做算术(如 demo.x2 直接乘 2),"只取 1 分钟实例"这类需求放到消费端(pmie 规则、pmrep 实例过滤)做。

③ 文件放对目录仍不加载——只把文件写进 /etc/pcp/derived/ 而未建符号链接,pminfo demo.* 始终查不到。解决:

root@pcp-server:~# ln -sf /etc/pcp/derived/demo.conf /var/lib/pcp/config/derived/demo.conf
root@pcp-server:~# systemctl restart pmcd
root@pcp-server:~# pminfo -f demo.load_pct | head -3

demo.load_pct
    inst [1 or "1 minute"] value 49

六、生产配置模板

以下模板针对"单台服务器长期归档 + 本地告警 + REST 对外"的典型形态,标注内存/磁盘/场景预算,全部键值与默认值均经本篇实测核对。

1)归档(pmlogger)——/etc/pcp/pmlogger/control.d/local 保持发行版默认行即可:

LOCALHOSTNAME	y   n	PCP_ARCHIVE_DIR/LOCALHOSTNAME	-r -T24h10m -c config.default -v 100Mb

/etc/pcp/pmlogger/control 显式声明保留策略(覆盖默认 14 天):

$PCP_CULLAFTER=30
$PCP_COMPRESSAFTER=1

/etc/default/pmlogger 保持默认间隔(60 秒),高敏指标在 config.default 尾部安全区单加显式组:

log advisory on 5 second {
	disk.dev.read
	disk.dev.write
}

磁盘预算(实测换算):默认全量 50.6 MB/天;1 秒组每指标约 4.8 MB/天;30 天保留 + 1 天压缩,单主机约 2 GB 封顶。内存开销可忽略:实测 pmlogger 进程 RSS 8268 KB、pmie 进程 RSS 7108 KB(ps -o pid,rss,cmd 回显)。

2)告警(pmie)——保留内置规则(实测 24 条启用),按机器角色微调阈值(变量名先用 pmieconf list 确认):

pmieconf modify cpu.load_average min_load 8   # 高负载绝对下限 4 → 8
systemctl restart pmie
pminfo -f pmcd.pmie.numrules                  # 验证规则数不变(改阈值不增删规则)

3)访问控制(pmcd.conf [access])——默认策略已是安全基线(远程禁写、本机全权);确需对某台管理机放开 pmstore 时,主机规格用精确 IP 或主机名(实测 allow "127.0.0.1" : store; 可被正常加载;CIDR、user@host、IP 中段通配均非法,见第七章 Q8):

[access]
disallow ".*" : store;
disallow ":*" : store;
allow "local:*" : all;
allow "10.89.58.100" : store;

⚠️ 改完先用 pmcd -f 前台试跑一次(报错直接打到终端),确认无非法行再 systemctl restart pmcd——非法通配会让服务启动失败(实测实录见 Q8)。

4)REST(pmproxy)——保持 [keys] servers = localhost:6379 与 [discover] exclude.metrics = proc.*,acct.*(高基数排除是时序索引不爆内存的关键);对外端口用 pmproxy.options 的 -p 固定。

七、常见问题

Q1:改了 pmcd.options / pmproxy.options 不生效? A:options 文件只在进程启动时读取,必须 systemctl restart pmcd(或 pmproxy)。用 ps -ef | grep [p]mcd 核对进程命令行是否带上新选项(实测见 5.2.1)。

Q2:远程主机执行 pmstore 被拒? A:默认 [access] 前两条对所有主机模式 disallow store(实测原文见 5.2.2),这是设计行为。确需远程写按第六章模板 3 用精确 IP/主机名放开单条规则,或登录目标机本机执行。

Q3:pmie -c -t 1sec -T 2sec demo.pmie 报 extra filenames cannot be given after using -c? A:-c 需要紧跟配置文件参数,上面写法把 -t 当成了 -c 的值、demo.pmie 成了多余文件名。正确写法(实测通过):pmie -c /tmp/demo.pmie -t 1sec -T 2sec。

Q4:/series/metrics?name=xxx 返回几千条全量指标,过滤失效? A:pmseries REST 的过滤参数是 match=(glob),name= 不参与过滤。实测对比:?name=kernel.all.load 返回全量列表,?match=kernel.all.load 返回 ["kernel.all.load"](见 5.5.3)。

Q5:用 pmval 查归档,显示 interval 1.00 sec,是不是间隔配置没生效? A:不是。pmval 对归档默认按 1 秒重采样,与归档真实间隔无关。验证真实间隔用 pmdumplog <归档> | grep -c "<指标>" 数记录数除以时间跨度,或看 pmlogger.log 的 logged every N sec 摘要行(实测方法见 5.3.5)。

Q6:派生指标文件写好了 pminfo 查不到? A:按 5.6.3 三连查:① 文件必须在 /var/lib/pcp/config/derived/ 有符号链接;② systemctl restart pmcd;③ journalctl -u pmcd 看加载报错(语法错误不会让 pmcd 起不来,只静默跳过该文件)。

Q7:手工编辑 config.default 后担心被覆盖? A:文件头注释明确"DO NOT UPDATE THE INITIAL SECTION"——pmlogconf 重生成时初始段(含所有 #+ 组)会被重建;尾部 # It is safe to make additions from here on ... 之后的内容(含手工显式间隔组与 [access])实测在重生成后保留(用 pmlogconf -c <副本文件> 重生成副本验证,手工 1 秒组原样保留在第 1836 行)。自定义组一律加在安全区。

Q8:往 [access] 加了一条规则后 pmcd 起不来,还提示 Start request repeated too quickly? A:这是本篇实测踩过的坑,两类报错要分清。非法通配是致命的——主机模式里 * 不在结尾或 IP 带中段通配,pmcd 直接启动失败:

Nov 01 09:16:26 pcp-server pmcd[30322]: Error: Bad IP address wildcard, pcp-admin@10\.89\..*
Nov 01 09:16:26 pcp-server pmcd[30322]: pmcd config[line 21]: Warning: access control error for host 'pcp-admin@10\.89\..*': Invalid argument
Nov 01 09:24:22 pcp-server pmcd[35823]: Error: Wildcard in host pattern ".*@localhost" is not at the end

而 无法解析的主机(如 CIDR 10.89.0.0/16)是非致命的——只警告 the following access control specification will be ignored 并跳过该条,服务照常起。致命失败连续触发 systemd 重启限流后,改回正确配置还需先清计数:

root@pcp-server:~# systemctl reset-failed pmcd
root@pcp-server:~# systemctl restart pmcd
root@pcp-server:~# systemctl is-active pmcd
active

规避方法即第六章模板 3 的 ⚠️:改 [access] 后先 pmcd -f 前台试跑,报错立即可见,再重启服务。

八、参考链接

  1. pcp.conf(5)、pmcd(1)、pmcd.conf(5)(man 手册页;Ubuntu 包默认不装 man,可在线查 man7.org 对应页)
  2. pmlogger(1)、pmlogger.control(5)、pmlogger_daily(1)、pmlogconf(1)
  3. pmie(1)、pmieconf(1)、pmie.expression(5)、pmie.action(5)
  4. pmproxy(1)、pmproxy.conf(5)、pmseries(1)
  5. PCP 官方文档:https://pcp.readthedocs.io/
  6. PCP man 手册页合集:https://man7.org/linux/man-pages/dir_by_project.html#PCP
  7. 派生指标官方说明(pmcd.h / pmRegisterDerived(3))
  8. 本专栏部署篇:《Ubuntu 22.04 安装 Performance Co-Pilot 7.2.2 指南》
  9. 本专栏选型篇:《Performance Co-Pilot 介绍与选型指南》
  10. 本专栏 CLI 工具篇:《Performance Co-Pilot 7.2.2 常用 CLI 命令与工具详解》
Performance Co-Pilot 7.2.2 配置参数详解 - Quzuo