SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-09-13

Rocky和AlmaLinux如何使用Performance Co-Pilot

Rocky Linux 9和AlmaLinux 9自带PCP 6.3。本文演示启动pmcd、用pminfo查找指标、用pmrep实时查看,并限制pmlogger的磁盘占用。

Rocky 或 Alma 系统已自带 Performance Co-Pilot

Performance Co-Pilot(PCP)位于 Rocky Linux 和 AlmaLinux 的 AppStream 仓库中,因此只需执行一个 dnf 命令和两个 systemctl 命令,即可获得带有磁盘历史记录的完整指标收集器。无需添加厂商代理,也无需向中央服务器开放端口。本指南基于 Rocky Linux 9 和 AlmaLinux 9 中的 AppStream 版本 PCP 6.3 编写,并于 2026 年 8 月完成验证。下面的每条命令都需要您在自己的服务器上执行。

使用人数很少的原因在于命名方式。这些命令是隐藏具体功能的简短缩写。了解这 4 个组成部分的名称后,您就能通过命令行发现其余组件。

Rocky 和 Alma 提供相同版本的 PCP 软件包,因为两者都基于相同的源代码重新构建。该源代码来自 Red Hat。CentOS 停止重新构建该源代码后,Rocky 和 AlmaLinux 才出现;这一转变在从 Red Hat 到 CentOS,再到 Rocky 和 AlmaLinux 的发展路径中有说明。如果您仍在 Rocky Linux 和 AlmaLinux 之间进行选择,请参阅Rocky Linux 与 AlmaLinux 的比较。在 Debian 和 Ubuntu 上,同一套组件打包为 pcp,命令名称完全相同,因此只需更换安装命令即可;请参阅dnf 和 apt 命令对照。

Performance Co-Pilot 的组成

PCP 由 4 个部分组成,每个部分只负责一项工作。

  • pmcd 是性能指标收集守护进程。它监听 TCP 44321 端口,只回答一个问题:当前这个指标的值是多少。它不保留历史数据。
  • PMDA(性能指标域代理)是向 pmcd 提供指标的插件。每个代理负责一个指标域。linux 代理负责内核,因此 CPU、内存、磁盘和网络数据都来自该代理。其他代理负责 systemd 日志、NGINX、PostgreSQL、磁盘的 SMART 数据,或任何支持 OpenMetrics 的 exporter。还有一个 docker 代理,因此在已在 Rocky 或 Alma 上安装 Docker的服务器上,每个容器的 CPU 和内存读数会与主机自身的读数位于同一个命名空间中。pmcd 加载的代理列在 /etc/pcp/pmcd/pmcd.conf 中,每个代理的安装脚本都会自动修改该文件。
  • pmlogger 按固定间隔采集指标,并将其写入磁盘上的归档文件。这样,实时读数就会变成可在以后回放的历史数据。
  • pmie 是性能指标推理引擎。它根据实时指标计算表达式,并在某个表达式变为 true 时执行操作。

指标名称是同一命名空间中的点分隔路径,例如 kernel.all.load 或 disk.dev.read。指标可以包含实例:disk.dev.read 为每个块设备提供一个值,filesys.full 为每个已挂载文件系统提供一个值。后文还会用到这一概念,因为报告工具和 pmie 规则都按实例处理数据。

由于 pmcd 不存储任何数据,查询结果始终反映当前状态。任何需要在明天查看的数据,今天都必须写入 pmlogger 归档文件。该分工解释了本指南中的大多数配置。

安装并启动 Performance Co-Pilot

sudo dnf install -y pcp pcp-system-tools
sudo systemctl enable --now pmcd pmlogger
systemctl is-active pmcd pmlogger

is-active 应输出 active 两次。安装 pcp 软件包不会启动任何服务,因此跳过 enable --now 行会导致工具无法连接到 collector。现在确认命名空间可以正常响应:

pminfo | wc -l
pcp

不带参数的 pminfo 会输出 pmcd 已知的所有指标名称。在标准安装中,这通常会产生几千行输出。pcp 会输出一屏主机摘要。如果错误信息提到 Cannot connect to PMCD,说明 pmcd 没有响应,请查看 journalctl -u pmcd -n 30 和 /var/log/pcp/pmcd/pmcd.log。

第二个软件包 pcp-system-tools 提供用于读取这些指标的报告命令:pmrep、pcp-atop、pcp-iostat 和 pcp-dstat。

此外还有 pcp-zeroconf。其自身说明称,该软件包会调整配置以提高指标采集频率,并为本地主机提供扩展的 pmlogger 配置和自动化 pmie 告警。其安装后脚本会自动启用并重启 pmcd、pmlogger 和 pmie。请注意相应代价:该软件包的配置每 10 秒采样一次,而 pmlogger 自身的默认值为 60 秒,因此归档文件的增长速度会快数倍。在小型套餐上,安装前请先阅读保留策略部分。

我的 VPS 实际暴露了哪些指标?

pminfo 是发现工具。向它提供一个子树,它会列出其中的叶节点。向它提供一个标志,它会说明某个指标的含义或当前值。

pminfo disk
pminfo -t kernel.all.cpu
pminfo -dfmtT disk.all.read_bytes
pminfo -f kernel.all.load
pminfo -f kernel.all.cpu.steal

-t 会为每个指标输出一行帮助信息,-T 输出详细帮助,-d 输出描述符,-m 输出内部指标 ID,-f 获取每个实例的当前值。描述符经常被跳过,之后用户就会误读自己的图表。它会说明数据类型、单位和语义:该值是瞬时读数、离散计数,还是只会递增的计数器。

最后一种情况很重要。disk.all.read 统计的是自启动以来的操作次数,因此单次获取无法说明最近一分钟的情况。连续获取两次,并记录两次获取之间的时间,才能得到相关信息。报告工具会为您完成减法,因此 pmrep 默认显示速率;要显示原始计数器,必须先使用 -r。

kernel.all.cpu.steal 是共享硬件上需要了解的指标。它统计虚拟 CPU 已准备好运行、但物理核心被主机分配给其他用户的时间。因此,steal 值上升并不是您的工作负载导致的。其工作机制以及可采取的措施,请参阅 CPU steal time 和 noisy neighbours。

同时运行 pminfo kernel.all.pressure。如果它列出指标,说明您的内核发布了 pressure stall information;kernel.all.pressure.io.full.avg 会告诉您主机上的每个任务因等待存储而被阻塞了多长时间。如果名称未知,说明您的内核未暴露 /proc/pressure,此时应改用磁盘指标。

实时使用 pmrep 监控指标

pmrep -t 2sec -p kernel.all.load mem.util.available disk.all.read disk.all.write
pmrep -p -b MB :vmstat
pmrep -t 5sec -s 12 -p -o csv kernel.all.cpu.steal filesys.full

-t 设置采样间隔,-p 添加时间戳,-s 在采集指定数量的样本后停止,-b 缩放字节单位,-o csv 写入可保存的逗号分隔输出。以冒号开头的名称(例如 :vmstat)是 pmrep 自身配置中保存的指标集,因此无需输入指标名称即可获得熟悉的列布局。

同一条命令也可以读取其他来源。在 -h 后指定地址,可从另一台主机上的 pmcd 获取数据;在 -a 后指定归档路径,则读取记录的历史数据,而不是实时守护进程的数据。两种数据源使用同一个工具和同一种语法。当服务器数量超过几台后,使用 -h 形式可以低成本地从一个位置查看所有服务器;更完整的方法请参阅管理多台 Linux 服务器。

保留策略:pmlogger 会占满小磁盘

归档文件位于 /var/log/pcp/pmlogger/<hostname>。每组归档的基本名称为 YYYYMMDD.HH.MM,包含一个 .index 文件、一个 .meta 文件,以及一个或多个带编号的数据卷。

ls -l /var/log/pcp/pmlogger/$(hostname)
du -sh /var/log/pcp/pmlogger/$(hostname)
systemctl list-timers 'pm*'

两个 systemd 定时器负责维护工作。pmlogger_check.timer 会重启已退出的日志记录器。pmlogger_daily.timer 会在 00:10 使用 Persistent=true 执行,因此系统重启后也能补执行任务;它会将当天的归档合并为一个文件、压缩归档,并删除超过保留期限的内容。默认保留期限为 14 天。

调整参数前先测量。让它运行一天,然后再次运行 du -sh。归档大小取决于采样间隔和记录的指标数量,因此其他服务器发布的数值不适用于你的服务器。

在 /etc/pcp/pmlogger/control.d/local 中设置时间限制和大小限制。保留现有控制行不变,并在其上方添加这两个赋值,因为该文件从上到下读取,赋值只对其下方的控制行生效。

$version=1.1
$ PCP_CULLAFTER=3
$ PCP_SPACELIMIT=200M

PCP_CULLAFTER=3 会删除超过三天的归档,这等同于向 pmlogger_daily 传递 -k 3。PCP_SPACELIMIT=200M 是硬性上限:每日任务发现主机的归档目录超过该大小时,会从最旧的归档开始删除,直到目录大小符合限制,并且不会删除当天的归档。两个限制都会在 pmlogger_daily 运行时应用,因此某一天产生的数据可能会一直超出限制,直到 00:10。现在立即应用更改,不要等待定时器:

sudo systemctl start pmlogger_daily
du -sh /var/log/pcp/pmlogger/$(hostname)

另一个方法是减少日志记录量。主日志记录器使用的指标列表为 /var/lib/pcp/config/pmlogger/config.default,因为 pmlogger 会在 /var/lib/pcp/config/pmlogger 下解析非绝对的 -c 名称。使用 pmlogconf 按日志记录组进行编辑,而不要手动编辑:

sudo pmlogconf -r /var/lib/pcp/config/pmlogger/config.default
sudo systemctl restart pmlogger

该命令会遍历各个组并逐一询问,因此应拒绝那些你永远不会查看的组。proc agent 提供的每进程指标是开销最大的组,因为它会为主机上的每个进程记录一组数值。

从归档重放事件

ls /var/log/pcp/pmlogger/$(hostname)
pmlogdump -l /var/log/pcp/pmlogger/$(hostname)/20260816
pmrep -a /var/log/pcp/pmlogger/$(hostname)/20260816 -S '@08:00' -T '@09:00' -t 5min -p :vmstat

传入不带后缀的基本文件名,因此应使用 20260816,而不是 20260816.0。pmlogdump -l 会输出归档标签,其中包含归档来源主机和所覆盖的时间范围。如果系统中没有该命令,较旧的 PCP 版本将其称为 pmdumplog。然后,-S 和 -T 从归档中截取一个时间窗口,-t 设置该窗口内每行数据的时间间隔。

保留归档的意义就在于此。告警会告诉你 08:40 发生了故障。归档则会显示 steal time 先升高,随后磁盘活动增加;这与自行运行的服务发生内存泄漏是不同的结论。事后无法再收集这些数据。如果服务器还会按计划自动安装补丁,那么可以使用同样的时间窗口判断夜间变慢是否与 dnf-automatic 应用安全更新 同步,还是由你自己的某项操作导致。

VPS 虚拟磁盘上的 SMART PMDA 是否可用?

SMART(自我监测、分析和报告技术)计数器位于物理磁盘上。在 VPS 中,您是租户,而您的 /dev/vda 通常是虚拟块设备。虚拟块设备背后是否能看到真实设备由主机决定,您无法控制。因此,在安装读取 SMART 数据的代理前,应先检查您自己的服务器报告了什么。

lsblk -d -o NAME,SIZE,ROTA,TRAN,MODEL
sudo dnf install -y smartmontools
sudo smartctl --scan
sudo smartctl -i /dev/vda
sudo smartctl -H /dev/vda

读取实际返回的内容,不要直接假设。如果 -i 输出设备型号和序列号,且 -H 输出健康评估,则底层设备已暴露,PCP 代理可以读取数据。如果它报告无法检测设备类型,或 SMART 支持不可用,则表示主机未透传该设备,修改 PCP 配置也无法改变这一点。如果磁盘不是 /dev/vda,请使用 --scan 报告的设备名称。

如果可以获取 SMART 数据,请添加该代理:

sudo dnf install -y pcp-pmda-smart
cd /var/lib/pcp/pmdas/smart
sudo ./Install
pminfo smart
pminfo -f smart.health
pminfo -f smart.info.device_model
pminfo -f smart.attributes.reallocated_sector_count.raw

./Install 脚本会向 pmcd 注册该代理,并将 smart 子树添加到命名空间,因此可以立即查询这些指标。该代理通过运行 smartctl 读取数据,其自身的错误会写入 /var/log/pcp/pmcd/smart.log,而不会输出到您的终端。在 NVMe 设备上,可用名称位于 smart.nvme_attributes 下,其中包括 percentage_used 和 media_and_data_integrity_errors。如果某个指标存在但没有对应数据,pminfo -f 会返回 No value(s) available!,这表示代理已运行,但设备没有提供数据。

如果主机隐藏了设备,请改为监控运行状态,而不是固件计数器:使用 disk.dev.avactive 查看虚拟磁盘的繁忙程度,使用 disk.all.read_bytes 和 disk.all.write_bytes 查看吞吐量,并使用 filesys.full 查看实际导致服务器停止运行的故障。租户可以或无法获取哪些存储信息,请参阅 VPS 上的磁盘健康监控。

编写一个触发分页通知的 pmie 规则

规则文件由一组表达式组成,每个表达式都关联一个操作。将以下内容写入 /var/lib/pcp/config/pmie/vps.rules:

// any mounted filesystem over 90 percent full
some_inst (
    filesys.full > 90
) -> syslog "pcp: filesystem %i is over 90 percent full"
   & shell 60 min "/usr/local/bin/pcp-alert";

当至少一个实例满足条件时,some_inst 会使表达式为真;消息中的 %i 会展开为使表达式为真的实例。shell 操作中的 60 min 是抑制时间:操作执行后,pmie 在 1 小时内不会再次执行它。这样可以避免磁盘已满时每次评估都触发分页通知。不要在 shell 命令中使用 %i,因为 pmie 会为每个匹配实例重复整个参数来展开这些选择器,而重复执行命令行并不是你需要的行为。syslog 字符串也可以以 -p 和 -t 开头,pmie 会提取它们,并像处理 logger 一样传递出去。

检查语法,然后在前台观察规则的评估过程:

sudo -u pcp pmie -C -c /var/lib/pcp/config/pmie/vps.rules
sudo -u pcp pmie -v -t 10sec -c /var/lib/pcp/config/pmie/vps.rules

-C 会解析文件,报告错误,然后退出而不进行评估。-v 会在每次采样时打印每个表达式的值,因此你可以看到规则读取到实际数值。暂时将阈值降低到 1,规则就会触发。这是验证操作是否有效的唯一方法。按 Ctrl+C 停止。

操作脚本可以执行任意任务。下面这个脚本会向推送服务器发送请求:

sudo tee /usr/local/bin/pcp-alert >/dev/null <<'EOF'
#!/bin/bash
curl -fsS -H 'Title: PCP alert' \
  -d 'filesystem over 90 percent full, see journalctl -t pmie' \
  https://ntfy.example.com/my-vps-alerts
EOF
sudo chmod 755 /usr/local/bin/pcp-alert

将其指向你自己的终端。有关自行运行接收端,请参阅自托管 ntfy 推送服务器。其中一个细节决定整个流程能否正常工作:作为守护进程运行时,pmie 使用无特权的 pcp 账户,因此 shell 操作会以 pcp 身份运行。该用户必须能够执行脚本,脚本读取的令牌文件必须对该用户可读,需要 root 权限的命令则会失败。失败原因会写入 pmie 的日志文件,因此告警未到达时应首先检查该文件。

将规则作为独立的 pmie 实例永久运行:

sudo install -d -o pcp -g pcp /var/log/pcp/pmie/$(hostname)
sudo tee /etc/pcp/pmie/control.d/vps >/dev/null <<'EOF'
$version=1.1
LOCALHOSTNAME   n   n   PCP_LOG_DIR/pmie/LOCALHOSTNAME/vps.log   -c /var/lib/pcp/config/pmie/vps.rules -t 2min
EOF
sudo chmod 600 /etc/pcp/pmie/control.d/vps
sudo systemctl start pmie_check
sudo tail /var/log/pcp/pmie/$(hostname)/vps.log

这 5 个字段依次表示要监控的主机、该实例是否为主实例、是否需要 pmsocks、日志文件,以及传递给 pmie 的参数。LOCALHOSTNAME 是一个保留字:在第一个字段中它会变为本地 pmcd,在路径中则会变为你的主机名。主实例字段有意设置为 n,因为 pmie.service 只会启动主实例。其他实例由 pmie_check 启动;它的定时器会在每小时的 28 分和 58 分运行,因此手动启动只会跳过等待时间。控制文件必须只能由 root 读取,这正是 chmod 600 的作用。

如果你不想手写表达式,可以使用 pmieconf 生成表达式。sudo pmieconf rules 会列出已打包的规则组,并显示哪些规则组已启用;主 pmie 会读取 pmieconf 在 /var/lib/pcp/config/pmie/config.default 维护的文件。这就是 pcp-zeroconf 启用的机制。手写规则适用于只有你了解的条件,例如某个应用导致某个目录持续增长并最终占满磁盘。

Performance Co-Pilot 的适用范围

基础安装不提供 Web 仪表板,也不能查看多台主机。pmproxy 在相同指标之上提供 REST API,Grafana 的 PCP 数据源会读取该 API;图表需要通过这条路径生成。带值班排班的告警路由也不属于 pmie 的职责:pmie 执行动作,而动作就是您的脚本。

PCP 用于高分辨率地回答“这台主机发生了什么”,并且已经安装。集中式监控服务器承担的是另一类工作,包括按服务检查、用户界面和跨主机告警。Zabbix 监控服务器承担这一角色,而 Uptime Kuma 用于回答更简单的问题:服务是否仍能响应。两者并不冲突:pmcd 是监听 44321 端口的本地 daemon,同一台服务器上的其他 agent 不会因此了解或受影响。

最有用的第一步是什么都不做,持续一周。让 pmcd 和 pmlogger 保持运行,限制归档目录的大小。下次主机在 03:00 变慢时,您就能获得 03:00 的实际数据,而不是凭猜测判断。

FAQ

是否需要在 Rocky Linux 或 AlmaLinux 上安装任何软件才能使用 Performance Co-Pilot?

相关软件包位于 AppStream 仓库中,因此 sudo dnf install -y pcp pcp-system-tools 就完成了全部下载步骤,不会从发行版之外获取任何内容。安装 pcp 不会启动该服务,因此接下来运行 sudo systemctl enable --now pmcd pmlogger,然后运行 pminfo | wc -l,确认采集器可以响应。pcp-zeroconf 软件包会自动完成启用,并将采样间隔提高到 10 秒。在将其添加到磁盘空间较小的服务器之前,应了解这一点。

pmlogger 将归档存储在哪里,会保留多长时间?

存储在 /var/log/pcp/pmlogger/<hostname> 中,归档集按日期和时间命名。pmlogger_daily.timer 在 00:10 运行,合并当天的归档、压缩归档,并默认删除超过 14 天的归档。若要缩短保留时间,请将 $ PCP_CULLAFTER=3 添加到上方控制行中的 /etc/pcp/pmlogger/control.d/local;同时添加 $ PCP_SPACELIMIT=200M 作为大小上限。每日任务会优先删除最旧的归档,直到目录符合大小限制,并且不会删除当天的归档。使用 du -sh /var/log/pcp/pmlogger/$(hostname) 查看当前占用情况。

为什么 SMART PMDA 在我的 VPS 上不报告任何值?

因为 SMART 计数器来自物理磁盘,而您的磁盘很可能是虚拟块设备。在判断 PCP 有问题之前运行 sudo smartctl -i /dev/vda:如果 smartctl 无法检测设备类型,或报告不支持 SMART,说明主机没有公开底层硬件,代理就没有可读取的数据。在这种情况下,指标仍存在于命名空间中,并且 pminfo -f smart.health 会响应 No value(s) available!。代理自身的错误会写入 /var/log/pcp/pmcd/smart.log。应改为监控 disk.dev.avactive 和 filesys.full,因为它们描述的是您实际使用的磁盘。

为什么我的 pmie 规则始终不触发?

按顺序排查。pmie -C -c <file> 可确认文件能够解析。sudo -u pcp pmie -v -t 10sec -c <file> 会在每个采样点输出表达式的值,因此您可以查看条件是否曾为真;将阈值降到 1 也可以强制触发。操作设置 60 min 这样的抑制时间后,每小时最多触发一次。如果规则在前台运行时有效,但作为服务运行时无效,请注意 pmie.service 只会启动主实例,其他控制文件由 pmie_check 启动;此外,守护进程以无特权的 pcp 用户运行,因此需要 root 权限的 shell 操作会失败。原因会出现在控制行中指定的日志文件里。

可以将 Performance Co-Pilot 与 Zabbix 或 Prometheus 同时运行吗?

可以。pmcd 是监听 TCP 44321 的本地守护进程,不会影响其他代理收集的数据,因此 Zabbix agent 或 node exporter 可以继续正常工作。PCP 也可以从另一个方向获取数据:OpenMetrics 代理会将现有 exporter 输出的数值导入 PCP 命名空间,而 pmproxy 会通过 REST API 向 Grafana 发布 PCP 指标。常见的分工是:PCP 负责本地高分辨率历史数据,中心服务器负责跨主机告警。

#performance-co-pilot#rocky-linux#almalinux#监控#metrics