1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

上一篇文章,我们学习了 Linux 中非常经典的性能工具包 sysstat。通过 iostat、mpstat、pidstat 和 sar,我们已经可以完成大量日常性能排查工作,比如:

  • 查看历史 CPU 使用率
  • 分析磁盘 IO 是否存在瓶颈
  • 定位单个进程的资源消耗
  • 查看系统负载变化
  • 分析网络流量
  • 回放某个时间段的系统状态

对于一台普通 Linux 服务器来说,sysstat 已经非常够用了。但是,服务器数量一多,问题就开始出现了。

比如现在公司有 50 台服务器,我们不仅要看 CPU、内存、磁盘和网络,还想进一步监控:

  • 容器
  • NFS
  • 数据库
  • Web 服务
  • 应用程序
  • KVM 虚拟化
  • 文件系统
  • 其他业务指标

这个时候,如果还完全依赖 sar、iostat、pidstat 这一套工具,就会慢慢感觉有点力不从心。所以这一篇,我们再认识一个 Linux 性能领域非常经典的工具:PCP —— Performance Co-Pilot。

sar、iostat、pidstat 都能看性能了,我为什么还要学一个 PCP?这个问题没有错。实际上,如果你只是维护一台或者几台 Linux 服务器,遇到问题临时排查一下,sysstat 确实已经非常好用。但是,当环境开始变复杂之后,sysstat 的一些局限性就会慢慢暴露出来。

  1. 指标比较分散

CPU、内存、磁盘、网络、进程分别对应不同命令。

比如:

1
2
3
4
CPU      → mpstat
磁盘 IO → iostat
进程 → pidstat
历史数据 → sar

平时排查问题当然没什么。但是如果现在出现一个复杂问题:

“下午 2 点左右服务器开始变卡,到底是 CPU、内存、磁盘还是网络导致的?”

这时候你可能需要不断切换不同工具。

  1. 历史数据虽然有,但管理方式比较传统

sar 可以保存历史数据,这一点非常好。但是这些数据主要还是以 sysstat 自己的日志文件形式存在。当服务器数量越来越多以后:

1
2
3
4
5
6
服务器1
服务器2
服务器3
服务器4
……
服务器50

你会发现:

“我到底应该去哪台机器找哪一天的数据?”

这时候就开始有点麻烦了。


  1. 可视化能力比较有限

sar、iostat 等工具非常适合命令行排查。但是如果你想把下面这些全部画在一个页面上,然后观察它们之间的变化关系,传统命令行工具就不是特别擅长了:

1
2
3
4
5
CPU
内存
磁盘 IO
网络
Load

  1. 复杂指标之间的关联分析比较麻烦

实际生产环境中,性能问题很少只有一个指标异常。

比如:

1
2
3
4
5
6
7
磁盘 IO 上升
↓
iowait 上升
↓
Load 上升
↓
业务响应变慢

如果只看 CPU,很可能会误判。如果只看 Load,也只能知道系统确实忙,但不知道为什么忙。真正排查的时候,需要把多个指标放到一起分析。而这恰恰就是 PCP 比传统性能工具更有价值的地方。


  1. 多服务器环境需要更加统一的性能数据体系

假设你现在管理 100 台 Linux 服务器。

你肯定不希望每天:

1
2
3
4
5
6
7
8
ssh server01
sar ...

ssh server02
sar ...

ssh server03
sar ...

然后自己把这些数据拼到一起。这时候,就需要一个更加统一的性能数据体系。而 PCP,就是专门解决这一类问题的。

PCP 到底是什么?

PCP 全称:

Performance Co-Pilot

它是一套开源的系统性能监控与分析框架。PCP 最早由 SGI 发展而来,后来进入 Linux 生态,现在已经成为 Linux 性能分析领域比较经典的一套工具体系。

它和 sysstat 最大的区别在于:

PCP 不只是提供几个性能命令,而是围绕“性能指标”建立了一套完整的采集、查询、存储、回放和可视化体系。

PCP 可以采集很多类型的性能数据,例如:

  • CPU
  • 内存
  • 磁盘
  • 网络
  • 进程
  • 文件系统
  • NFS
  • 容器
  • 数据库
  • Web 服务
  • KVM
  • 应用程序

而且 PCP 采用了一套非常灵活的扩展机制,这套机制就是 PMDA。

从整体上来看,可以把 PCP 理解成这样:

flowchart TB
    A[Linux / 应用 / 容器 / 数据库] --> B[PMDA<br/>性能指标采集代理]
    B --> C[pmcd<br/>性能指标管理服务]

    C --> D[pminfo<br/>查询指标名称]
    C --> E[pmval<br/>查询指标值]
    C --> F[pcp dstat<br/>综合性能查看]

    C --> G[pmlogger<br/>历史数据采集]
    G --> H[PCP Archive<br/>历史性能数据]

    H --> I[pmval -a<br/>历史数据回放]
    H --> J[pmchart<br/>图形分析]

    C --> K[pmproxy<br/>访问代理]
    K --> L[Grafana<br/>可视化监控]

如果你第一次接触 PCP,不需要急着把这些命令全部背下来。

先记住一条主线:

1
2
3
4
5
6
7
8
9
10
11
12
13
PMDA
↓
pmcd
↓
性能指标
↓
pmlogger
↓
历史数据
↓
pmproxy
↓
Grafana

理解这条链路以后,后面的命令就很好理解了。

PCP 的核心架构

PCP 里面有几个名字非常容易让初学者混淆:

1
2
3
4
5
6
7
pmcd
PMDA
pmlogger
pminfo
pmval
pmchart
pmproxy

我们先不要急着记命令,可以用一个比较生活化的方式理解。

假设现在有一家大型医院。医院里面有:

1
2
3
4
5
心电图科
CT科
血液科
影像科
超声科

不同科室负责不同的数据。PCP 也是一样。不同的 PMDA 就像医院里面的不同科室,它们负责不同领域的性能指标。而 pmcd 可以理解成医院的总服务台。

客户端过来:

“我要查 CPU。”

pmcd 就去找对应的指标来源。

客户端又说:

“我要查磁盘。”

pmcd 再去找负责磁盘指标的 PMDA。

而 pmlogger 就像一个录像机。

它把这些性能数据持续保存下来。

以后出现问题,我们就可以把过去某个时间段的数据重新调出来分析。

整个关系可以用下面这张图理解:

flowchart LR
    subgraph Collect[指标采集]
        A[Linux PMDA]
        B[proc PMDA]
        C[XFS PMDA]
        D[KVM PMDA]
        E[其他 PMDA]
    end

    A --> F[pmcd]
    B --> F
    C --> F
    D --> F
    E --> F

    F --> G[pminfo]
    F --> H[pmval]
    F --> I[pcp dstat]

    F --> J[pmlogger]
    J --> K[PCP Archive]

    K --> L[历史回放]
    K --> M[pmchart]

    F --> N[pmproxy]
    N --> O[Grafana]

安装pcp

1
2
3
4
5
6
[root@localhost ~]#  dnf install pcp pcp-doc -y
...
Installed:
pcp-7.0.3-5.el10_2.x86_64 pcp-doc-7.0.3-5.el10_2.noarch pcp-selinux-7.0.3-5.el10_2.x86_64 zstd-1.5.5-9.el10.x86_64

Complete!

启动一下服务

1
[root@localhost ~]# systemctl enable --now pmcd

除了 PCP 基础软件包之外,我建议再安装:

1
2
3
4
5
6
[root@localhost ~]#  dnf install pcp-system-tools -y
...
Installed:
pcp-system-tools-7.0.3-5.el10_2.x86_64

Complete!

这个软件包提供了一些非常实用的 PCP 工具。

对于刚从 sysstat 转过来的同学来说,这里面有一个地方非常友好:PCP 提供了一些和传统 Linux 性能工具使用习惯比较接近的命令。

例如:

传统工具PCP 对应工具
iostatpcp iostat
freepcp free
dstatpcp dstat

所以学习 PCP 并不是说以前学过的 Linux 性能工具全部作废。

相反,原来的性能分析思路依然非常有用,只不过底层的数据体系换成了 PCP。

举个例子来看,查看内存

例如传统 Linux 中我们经常执行:

1
[root@localhost ~]# free

现在 PCP 也提供了类似的工具:

1
2
3
4
[root@localhost ~]#  pcp free
total used free shared buff/cache available
Mem: 8092768 380256 7040272 9636 672240 7438596
Swap 8224764 0 8224764

从使用方式上看,和传统 free 非常接近。但是这里的数据已经进入 PCP 的指标体系,所以后续可以和 PCP 的其他指标结合起来分析。


pcp dstat:快速观察系统整体性能

1
2
3
4
5
6
7
8
9
[root@localhost ~]# pcp dstat
You did not select any stats, using -ucdngy by default.
-system- ----total-usage---- -dsk/total- -net/total- ---paging-- ---system--
times |usr sys idl wai stl| read writ| recv send| in out | int csw
11:51:40| | | | |
11:51:41| 0 0 100 0 0| 0 0 |4694B 5376B| 0 0 | 305 238
11:51:42| 0 0 100 0 0| 0 0 |2948B 3022B| 0 0 | 282 218
11:51:43| 0 0 100 0 0| 0 0 | 190B 376B| 0 0 | 131 107
11:51:44| 0 0 100 0 0| 0 0 | 64B 322B| 0 0 | 125 102

可以看到它同时把 CPU、磁盘、网络、分页、中断、上下文切换等信息放到了一个界面中。这对于快速判断服务器当前到底“忙在哪里”非常方便。


  1. 每 2 秒采样一次,总共采集 10 次

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# pcp dstat 2 10
You did not select any stats, using -ucdngy by default.
-system- ----total-usage---- -dsk/total- -net/total- ---paging-- ---system--
times |usr sys idl wai stl| read writ| recv send| in out | int csw
11:53:13| | | | |
11:53:15| 0 0 100 0 0| 0 0 |4683B 5059B| 0 0 | 252 189
11:53:17| 0 0 100 0 0| 0 0 | 613B 813B| 0 0 | 88 74
11:53:19| 0 0 100 0 0| 0 0 | 64B 318B| 0 0 | 64 70
11:53:21| 0 0 100 0 0| 0 0 | 64B 318B| 0 0 | 76 65
11:53:23| 0 0 100 0 0| 0 0 | 64B 318B| 0 0 | 84 78
11:53:25| 0 0 100 0 0| 0 0 | 64B 318B| 0 0 | 84 76
11:53:27| 0 0 100 0 0| 0 0 | 64B 318B| 0 0 | 96 90
11:53:29| 0 0 100 0 0| 0 0 | 64B 318B| 0 0 | 72 62
11:53:31| 0 0 100 0 0| 0 0 | 64B 318B| 0 0 | 81 68
11:53:33| 0 0 100 0 0| 0 18k| 64B 322B| 0 0 | 97 86

整个命令大概会持续 20 秒。这种方式非常适合临时观察服务器状态。

比如业务人员说:

这台服务器最近有点卡,你帮我看看。用这个命令观察几十秒,看看 CPU、磁盘、网络等指标有没有明显异常。


  1. 只查看 CPU 和磁盘

如果现在只想关注 CPU 和磁盘:

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# pcp dstat -c -d
----total-usage---- -dsk/total-
usr sys idl wai stl| read writ
0 0 100 0 0| 0 0
0 0 100 0 0| 0 0
0 0 100 0 0| 0 0
0 0 100 0 0| 0 0
0 0 100 0 0| 0 0
0 0 100 0 0| 0 0

  • -c:CPU统计
  • -d:磁盘读写统计
  1. 查看网络

只查看网络:

1
2
3
4
5
6
7
[root@localhost ~]# pcp dstat -n
-net/total-
recv send
4666B 4616B
4671B 4549B
504B 506B

pmcd:PCP 的核心服务

接下来正式进入 PCP 的核心组件。

第一个要理解的就是:

pmcd

pmcd 全称是:

Performance Metrics Collection Daemon

可以把它理解成 PCP 的核心服务。它负责管理各种性能指标来源,并为 PCP 客户端提供统一的指标访问入口。

前面我们已经启动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost ~]# systemctl enable --now pmcd
[root@localhost ~]# systemctl status pmcd.service
● pmcd.service - Performance Metrics Collector Daemon
Loaded: loaded (/usr/lib/systemd/system/pmcd.service; enabled; preset: enabled)
Active: active (running) since Sun 2026-09-27 12:00:11 CST; 1h 2min ago
Invocation: 636b5a83280848518eebf97f729c724d
Docs: man:pmcd(1)
Main PID: 7998 (pmcd)
Tasks: 6 (limit: 50278)
Memory: 9.5M (peak: 10.4M)
CPU: 1.136s
CGroup: /system.slice/pmcd.service
├─7998 /usr/libexec/pcp/bin/pmcd -A
├─8002 /var/lib/pcp/pmdas/root/pmdaroot
├─8003 /var/lib/pcp/pmdas/proc/pmdaproc -d 3
├─8004 /var/lib/pcp/pmdas/xfs/pmdaxfs -d 11
├─8005 /var/lib/pcp/pmdas/linux/pmdalinux
└─8006 /var/lib/pcp/pmdas/kvm/pmdakvm -d 95

Sep 27 12:00:11 localhost.localdomain systemd[1]: Starting pmcd.service - Performance Metrics Collector Daemon...
Sep 27 12:00:11 localhost.localdomain systemd[1]: Started pmcd.service - Performance Metrics Collector Daemon.

注意看这里:

1
2
3
4
5
pmda/root
pmda/proc
pmda/xfs
pmda/linux
pmda/kvm

这些就是不同的 PMDA。

所以可以简单理解成:

1
2
3
4
5
6
pmcd
│
├── PMDA
├── PMDA
├── PMDA
└── PMDA

pmcd 负责统一管理这些指标来源。


PMDA:负责不同领域的性能指标

PMDA 全称:

Performance Metrics Domain Agent

这个名字看起来比较复杂,其实可以简单理解成:PMDA 就是负责某一个性能指标领域的数据采集代理。

例如:

PMDA作用
linuxLinux 系统基础指标
proc进程相关指标
xfsXFS 文件系统指标
jbd2JBD2 相关指标
kvmKVM 虚拟化指标
dockerDocker 相关指标
mysqlMySQL 相关指标
postgresqlPostgreSQL 相关指标
nginxNginx 相关指标

不过需要注意:

不同发行版、不同 PCP 版本以及不同安装方式,默认安装和启用的 PMDA 并不完全一样。

所以网上看到别人服务器有:

1
2
3
mysql
docker
nginx

并不意味着你的服务器安装 PCP 后一定会自动拥有这些 PMDA。

具体还是要以当前系统实际安装和加载情况为准。

PCP 的核心组件

PCP 体系中有几个关键组件,理解它们非常重要。

  1. pmcd:性能采集调度守护进程

pmcd 是 PCP 的核心守护进程,负责统一管理所有性能指标。

你可以把它理解成一个性能数据总线:

  • 各个采集器把指标交给 pmcd
  • 客户端工具从 pmcd 获取数据
  • 历史记录器通过 pmcd 采集数据

没有 pmcd,PCP 工具就无法正常工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost ~]# systemctl status pmcd.service
● pmcd.service - Performance Metrics Collector Daemon
Loaded: loaded (/usr/lib/systemd/system/pmcd.service; enabled; preset: enabled)
Active: active (running) since Sun 2026-09-27 10:44:45 CST; 5min ago
Invocation: 63d8bbc701cd443994ef867e3d543ad4
Docs: man:pmcd(1)
Main PID: 2154 (pmcd)
Tasks: 6 (limit: 50278)
Memory: 8.9M (peak: 13M)
CPU: 129ms
CGroup: /system.slice/pmcd.service
├─2154 /usr/libexec/pcp/bin/pmcd -A
├─2158 /var/lib/pcp/pmdas/root/pmdaroot
├─2159 /var/lib/pcp/pmdas/proc/pmdaproc -d 3
├─2160 /var/lib/pcp/pmdas/xfs/pmdaxfs -d 11
├─2161 /var/lib/pcp/pmdas/linux/pmdalinux
└─2162 /var/lib/pcp/pmdas/kvm/pmdakvm -d 95

Sep 27 10:44:45 localhost.localdomain systemd[1]: Starting pmcd.service - Performance Metrics Collector Daemon...
Sep 27 10:44:45 localhost.localdomain systemd[1]: Started pmcd.service - Performance Metrics Collector Daemon.
  1. pmdaconfig / 各个 PMDA:性能指标采集代理

PMDA 全称是 Performance Metrics Domain Agent,可以理解为不同领域的“指标采集插件”。

常见 PMDA 包括:

PMDA作用
linux采集 Linux 系统基础指标
proc从 /proc 文件系统采集进程、内存、CPU 等数据
disk采集磁盘 IO 指标
network采集网络指标
nfs采集 NFS 指标
xfs采集 XFS 文件系统指标
docker采集容器指标
mysql采集 MySQL 指标
postgresql采集 PostgreSQL 指标
nginx采集 Nginx 指标

这就是 PCP 强大的原因,它不是固定写死几个指标,而是通过 PMDA 不断扩展监控范围。

我们直接打开pmcd的主配置文件,就能看到本机预设的PMDA列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# cat /etc/pcp/pmcd/pmcd.conf
# Performance Metrics Domain Specifications
#
# This file is automatically generated during the build
# 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
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
pmproxy 4 dso pmproxy_init /var/lib/pcp/pmdas/mmv/pmda_mmv.so
mmv 70 dso mmv_init /var/lib/pcp/pmdas/mmv/pmda_mmv.so
jbd2 122 dso jbd2_init /var/lib/pcp/pmdas/jbd2/pmda_jbd2.so
kvm 95 pipe binary /var/lib/pcp/pmdas/kvm/pmdakvm -d 95
[access]
disallow ".*" : store;
disallow ":*" : store;
allow "local:*" : all;

配置文件里,第一列就是PMDA名称:root、pmcd、proc、xfs、linux、mmv、jbd2、kvm。

⚠️ 重点区分:
这个配置文件写的是待加载清单,不等于已经成功运行。
配置里写了只是代表pmcd尝试去加载它;有没有加载成功,要结合journalctl -u pmcd日志判断。

前面说了,PMDA 负责提供不同领域的指标。那么问题来了:

“这么多指标,我怎么知道具体叫什么?”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# pminfo | more
jbd2.njournals
jbd2.transaction.count
jbd2.transaction.requested
jbd2.transaction.max_blocks
jbd2.transaction.total.blocks
jbd2.transaction.total.blocks_logged
jbd2.transaction.total.handles
jbd2.transaction.total.time.waiting
jbd2.transaction.total.time.request_delay
jbd2.transaction.total.time.running
jbd2.transaction.total.time.being_locked
jbd2.transaction.total.time.flushing_ordered_mode_data
jbd2.transaction.total.time.logging

输出开头出现了jbd2.*,就说明 jbd2这个PMDA已经加载成功,并且对外提供指标。
同理,如果看到proc.*、linux.*、xfs.*开头的指标,就代表对应的PMDA插件正常工作。

✅ 小技巧:单独查看某个PMDA的全部指标
想单独看proc(进程相关)所有指标:

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# pminfo proc
proc.nprocs
proc.psinfo.cwd
proc.psinfo.exe
proc.psinfo.oom_score
proc.psinfo.tgid
proc.psinfo.ngid
proc.psinfo.cpusallowed
proc.psinfo.nvctxsw
proc.psinfo.vctxsw
proc.psinfo.labels
proc.psinfo.cgroups

pmlogger:记录历史性能数据

现在我们已经知道如何查询实时指标了。但是还有一个非常重要的问题:

如果服务器凌晨 2 点出现故障,而你凌晨 3 点才发现,怎么办?

这时候实时数据已经过去了。所以 PCP 需要一个负责“录像”的组件。

它就是:

pmlogger

pmlogger 的作用就是持续读取 PCP 性能指标,并把它们保存为 PCP Archive。

整个过程可以理解成:

flowchart LR
    A[PMDA] --> B[pmcd]
    B --> C[pmlogger]
    C --> D[PCP Archive]
    D --> E[历史数据回放]

也就是说:

如果没有 pmlogger,就没有后面的历史数据回放。

安装PCP后,pmlogger默认会作为系统服务运行,配合pmcd采集指标。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# systemctl enable pmlogger --now
[root@localhost ~]# systemctl status pmlogger
● pmlogger.service - PCP primary archive logger
Loaded: loaded (/usr/lib/systemd/system/pmlogger.service; enabled; preset: enabled)
Active: active (running) since Sun 2026-09-27 11:01:26 CST; 8s ago
Invocation: 011e26cbebbd4306ae2b3da41e6d4513
Docs: man:pmlogger(1)
Main PID: 2770 (pmlogger)
Tasks: 1 (limit: 50278)
Memory: 2.8M (peak: 10.3M)
CPU: 728ms
CGroup: /system.slice/pmlogger.service
└─2770 /usr/libexec/pcp/bin/pmlogger -N -P -d "\"/var/log/pcp/pmlogger/LOCALHOSTNAME\"" -r -T24h10m -c config.default -v 100mb -m pmlogger_check %Y%m%d.%H.%M

Sep 27 11:01:26 localhost.localdomain systemd[1]: Starting pmlogger.service - PCP primary archive logger...
Sep 27 11:01:26 localhost.localdomain systemd[1]: Started pmlogger.service - PCP primary archive logger.

默认的性能归档日志放在 /var/log/pcp/pmlogger/本机主机名/

1
2
[root@localhost ~]# ls /var/log/pcp/pmlogger/$(hostname)/
20260927.11.01.0 20260927.11.01.index 20260927.11.01.meta Latest pmlogger.log

一套完整PCP归档集由3个配套文件组成,三者必须放在一起,不能单独删除或修改其中任意一个:

  • 20260927.11.01.0:核心性能数据主体文件
  • 20260927.11.01.index:索引文件,用于快速定位时间点
  • 20260927.11.01.meta:元信息文件,记录指标描述、单位等信息

Latest 是软链接,永远指向当前正在写入的归档集,方便直接调用。
pmlogger.log 是pmlogger自身的运行日志,排查采集异常时查看。

pmval:查看具体性能指标

前面:

1
[root@localhost ~]# pminfo

负责解决:

“指标叫什么?”

而:

1
[root@localhost ~]# pmval

负责解决:

“这个指标现在是多少?”

实战举例

  1. 实时查看CPU空闲率
1
2
3
4
5
6
7
8
9
10
11
[root@localhost localhost.localdomain]# pmval kernel.all.cpu.idle

metric: kernel.all.cpu.idle
host: localhost.localdomain
semantics: cumulative counter (converting to rate)
units: millisec (converting to time utilization)
samples: all
3.987
3.996
3.997
3.996

持续输出系统CPU空闲时间占比,对应top命令输出里的 id 字段。

  1. 实时查看CPU用户态占用
1
2
3
4
5
6
7
8
9
10
11
[root@localhost localhost.localdomain]# pmval kernel.all.cpu.user

metric: kernel.all.cpu.user
host: localhost.localdomain
semantics: cumulative counter (converting to rate)
units: millisec (converting to time utilization)
samples: all
0.0
0.0
0.0
0.0

这条命令持续输出用户态CPU时间,对应top里us字段。业务进程大量计算的时候,这个指标会明显上涨。

  1. 实时查看CPU内核态占用
1
2
3
4
5
6
7
8
9
10
11
12

[root@localhost localhost.localdomain]# pmval kernel.all.cpu.sys

metric: kernel.all.cpu.sys
host: localhost.localdomain
semantics: cumulative counter (converting to rate)
units: millisec (converting to time utilization)
samples: all
0.0
9.991E-03
0.0
0.0

对应top里sy,如果这个数值很高,说明大量消耗在内核系统调用、内核处理逻辑。

  1. 查看空闲内存指标
1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost localhost.localdomain]# pmval mem.util.free

metric: mem.util.free
host: localhost.localdomain
semantics: instantaneous value
units: Kbyte
samples: all
7389864
7389864
7389864
7389864

直接读取系统空闲内存,和free命令里的free字段对应。

  1. 查看磁盘读指标
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost localhost.localdomain]# pmval disk.dev.read

metric: disk.dev.read
host: localhost.localdomain
semantics: cumulative counter (converting to rate)
units: count (converting to count / sec)
samples: all

nvme0n1
0.0
0.0
0.0

查看磁盘读请求,排查磁盘大量读IO场景,相当于iostat的读相关指标。

  1. 自定义采样间隔
    pmval默认每秒输出一次。用-t参数设置采样间隔,单位秒。
1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost localhost.localdomain]# pmval -t 5 kernel.all.cpu.idle

metric: kernel.all.cpu.idle
host: localhost.localdomain
semantics: cumulative counter (converting to rate)
units: millisec (converting to time utilization)
samples: all
3.98591
3.97802
3.98793
3.99690

每5秒输出一次CPU空闲指标,适合长期观察缓慢变化的指标,减少屏幕刷屏。

实际工作中非常推荐大家养成一个习惯:

不知道指标叫什么,就先用 pminfo 找;找到之后,再用 pmval 看。

5. pmchart:图形化实时监控

PCP 自带一个轻量级图表工具 pmchart,可以把多个指标画成曲线图。,不过这个需要安装dnf install pcp-gui -y
`

比如同时监控:

1
pmchart kernel.all.cpu.idle disk.dev.read network.interface.in.bytes

你就可以直观看到:

  • CPU 空闲率如何变化
  • 磁盘读取是否有峰值
  • 网络流量是否同步增长

这对于分析问题发生时的指标关联性非常有帮助。

实战提示:生产 Linux 服务器大多是最小化无图形部署,一般不会安装桌面环境,pmchart更多是本地工作站调试使用,线上服务器优先用命令行工具。

PCP 与 sysstat 的区别

很多人会问:既然有了 sysstat,为什么还要用 PCP?

这里做一个简单对比:

维度sysstatPCP
定位轻量性能工具包完整性能监控框架
采集方式cron / systemd timer 调用 sa1/sadcpmcd + pmlogger 统一采集
指标范围系统、磁盘、网络、进程等基础指标系统、容器、数据库、应用等多领域指标
历史数据sa 日志文件归档日志仓库
可视化弱,需二次导出原生 pmchart,也可对接 Grafana
分布式较弱支持多节点集中分析
适用场景单机问题排查复杂系统、集群、性能分析平台

总结一句话:

sysstat 适合快速排查单机问题,PCP 适合构建长期、统一、可回放的性能监控体系。


常用 PCP 命令实战

1. 实时查看 CPU 空闲率

1
2
3
4
5
6
7
8
9
[root@localhost ~]# pmval kernel.all.cpu.idle

metric: kernel.all.cpu.idle
host: localhost.localdomain
semantics: cumulative counter (converting to rate)
units: millisec (converting to time utilization)
samples: all
3.987
3.987

输出会持续显示 CPU 空闲率变化。

2. 查看系统平均负载

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# pmval kernel.all.load

metric: kernel.all.load
host: localhost.localdomain
semantics: instantaneous value
units: none
samples: all

1 minute 5 minute 15 minute
0.0 0.0 0.0
0.0 0.0 0.0

这里通常会看到 1 分钟、5 分钟、15 分钟负载。

3. 查看磁盘 IO 操作次数

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# pmval disk.dev.read

metric: disk.dev.read
host: localhost.localdomain
semantics: cumulative counter (converting to rate)
units: count (converting to count / sec)
samples: all

nvme0n1
0.0
0.0

4. 查看网络接收流量

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# pmval network.interface.in.bytes

metric: network.interface.in.bytes
host: localhost.localdomain
semantics: cumulative counter (converting to rate)
units: byte (converting to byte / sec)
samples: all

lo ens160
0.0 4883.
0.0 4855.
0.0 2476.

5. 查看内存可用空间

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# pmval mem.physmem

metric: mem.physmem
host: localhost.localdomain
semantics: discrete instantaneous value
units: Kbyte
samples: all
8092768
8092768
8092768

注意:不同版本的指标名称可能略有差异,可以使用 pminfo 查找。

PCP 历史数据回放

PCP 的真正威力在于历史数据回放。

如果 pmlogger 已经配置并运行,你就可以回放过去某个时间段的性能数据。

例如:

1
[root@localhost ~]# pmval -a /var/log/pcp/pmlogger/localhost.localdomain/20260927.11.01 kernel.all.cpu.idle

使用 Grafana 可视化 PCP 指标

PCP 本身已经具备不错的分析能力,但在企业环境中,更常见的做法是:

PCP 负责采集和存储,Grafana 负责统一展示。

通过 PCP 的 Grafana 数据源,你可以把历史指标展示成更美观的仪表盘,例如:

  • CPU 使用率趋势
  • 内存占用趋势
  • 磁盘 IO 峰值
  • 网络流量变化
  • 系统负载曲线
  • 容器资源开销
  • NFS 延迟分析

这样,运维、开发、测试人员都可以通过浏览器查看系统历史状态,而不需要登录服务器敲命令。

我们可以把 PCP 和 Grafana 结合起来。整体架构就是:

flowchart LR
    A[Linux服务器] --> B[PMDA]
    B --> C[pmcd]
    C --> D[pmlogger]
    D --> E[PCP Archive]

    C --> F[pmproxy]
    E --> F
    F --> G[Grafana]
    G --> H[浏览器 Dashboard]

PCP 负责性能数据体系。Grafana 负责可视化。两者结合以后,就可以通过浏览器统一查看性能指标。

想要让 Grafana 读取 PCP 的指标,有一步必不可少:在已经跑着 pmcd 的服务器上,把 pmproxy 服务启动并设置开机自启。
pmproxy 相当于一个代理。Grafana 没法直接连 pmcd,就靠 pmproxy 中转请求。默认情况下 pmproxy 会对外提供 REST API,访问地址 http://localhost:44322/metrics,Grafana 就是从这个地址拉取PCP指标。

实战举例

  1. 先启动 pmproxy 服务
    在部署了 pmcd 的这台服务器执行下面命令,直接启动+设置开机自启:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# systemctl enable --now pmproxy
Created symlink '/etc/systemd/system/multi-user.target.wants/pmproxy.service' → '/usr/lib/systemd/system/pmproxy.service'.
[root@localhost ~]# systemctl status pmproxy
● pmproxy.service - Proxy for Performance Metrics Collector Daemon
Loaded: loaded (/usr/lib/systemd/system/pmproxy.service; enabled; preset: disabled)
Active: active (running) since Sun 2026-09-27 11:58:04 CST; 2s ago
Invocation: d594b0e8abf84ca0a5185fad8f2e26f0
Docs: man:pmproxy(1)
Main PID: 6458 (pmproxy)
Tasks: 1 (limit: 50278)
Memory: 1.7M (peak: 3M)
CPU: 56ms
CGroup: /system.slice/pmproxy.service
└─6458 /usr/libexec/pcp/bin/pmproxy -F -A

Sep 27 11:58:04 localhost.localdomain systemd[1]: Starting pmproxy.service - Proxy for Performance Metrics Collector Daemon...
Sep 27 11:58:04 localhost.localdomain systemd[1]: Started pmproxy.service - Proxy for Performance Metrics Collector Daemon.

这个服务默认监听 44322 端口。如果你的 Grafana 部署在别的机器,记得防火墙放开这个端口。好在 firewalld 自带 pmproxy 服务规则,不用手动敲端口号:

1
2
3
4
[root@localhost ~]# firewall-cmd --add-service=pmproxy --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
  1. 安装 Grafana 和 PCP 插件
    grafana-pcp 就是对接PCP的Grafana插件。在RHEL系统里,grafana 和 grafana-pcp 包都放在 AppStream 软件源,直接dnf安装就行:
1
2
3
4
5
6
7
8
9
[root@localhost ~]# dnf install grafana grafana-pcp -y
...
Installed:
checkpolicy-3.10-1.el10.x86_64 grafana-10.2.6-28.el10_2.5.x86_64 grafana-pcp-5.3.0-8.el10_2.1.x86_64 grafana-selinux-10.2.6-28.el10_2.5.x86_64
policycoreutils-python-utils-3.10-1.el10.noarch python3-audit-4.0.3-5.el10.x86_64 python3-distro-1.9.0-5.el10.noarch python3-libsemanage-3.10-1.el10.x86_64
python3-policycoreutils-3.10-1.el10.noarch python3-setools-4.6.0-3.el10.x86_64 shared-mime-info-2.3-8.el10.x86_64

Complete!

启动一下服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# systemctl enable --now grafana-server
Created symlink '/etc/systemd/system/multi-user.target.wants/grafana-server.service' → '/usr/lib/systemd/system/grafana-server.service'.
[root@localhost ~]# systemctl status grafana-server
● grafana-server.service - Grafana instance
Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; enabled; preset: disabled)
Active: active (running) since Sun 2026-09-27 12:00:36 CST; 3s ago
Invocation: d9a9515eb23045c9a6a8dde70e8ba964
Docs: http://docs.grafana.org
Main PID: 9152 (grafana)
Tasks: 20 (limit: 50278)
Memory: 81.6M (peak: 82.4M)
CPU: 554ms
CGroup: /system.slice/grafana-server.service
├─9152 /usr/sbin/grafana server --config=/etc/grafana/grafana.ini --pidfile=/var/run/grafana/grafana-server.pid --packaging=rpm cfg:default.paths.logs=/var/log/grafana cf>
└─9162 /usr/libexec/grafana-pcp/datasources/valkey/pcp_valkey_datasource_linux_amd64
1
2
3
4
[root@localhost ~]# firewall-cmd --add-service=grafana --permanent
success
[root@localhost ~]# firewall-cmd --reload
success

打开浏览器,访问地址 http://ip:3000,就能进入 Grafana 的网页管理界面。

默认账号和密码都是 admin,直接用这套凭据登录就行。
这里要注意,第一次登录的时候,系统会强制要求你修改密码,按照页面提示设置新密码保存即可。

grafana-login

装好 grafana-pcp 软件包之后,PCP对应的数据源插件会自动安装好,不用我们手动上传插件文件。

接下来只需要在Grafana网页里把插件启用:
打开Grafana界面,点左上角菜单,依次进入 Administration › Plugins and data › Plugins。

grafana-plugin

在已安装插件列表里找到 Performance Co-Pilot,点进插件详情页,再点右上角的 Enable 按钮,插件就开启完成了。

grafana-plugin-enable

进到Grafana网页界面,打开 Connections › Data Sources,点「Add new data source」新增数据源,在列表里找到 PCP Vector。

grafana-source-add-1

grafana-source-add-2

来到PCP数据源的配置页面,先给这个数据源起个名字,最重要的是URL这一栏,填部署了pmproxy那台服务器的地址。
简单测试环境的话,剩下所有选项都不用改动,保持默认就行。填完点 Save & Test,保存配置同时测试连通性,看到提示连接成功就代表没问题。

grafana-source-add-4

最后一步就是创建监控大盘。Grafana的仪表板有几种玩法:可以在网页里从头手动新建,也可以直接上传JSON文件导入,还能从Grafana公共仪表板库直接导入现成模板。
grafana-pcp插件页面自带了不少预制好的仪表板,拿来直接用很省事。切换到Dashboards标签,挑选符合你需求的PCP Vector仪表板打开就能用。

grafana-source-add-5

grafana-source-add-6

实战小例子
假设pmproxy跑在192.168.1.100这台机器,端口默认44322,URL就填写 [http://192.168.1.100:44322](http://192.168.1.100:44322)。
点Save & Test,如果提示连接失败,优先排查两件事:第一,服务器上pmproxy服务有没有正常跑;第二,防火墙有没有放行44322端口。

前面咱们用 pmval、pcp dstat,只能在服务器命令行看文字,长时间看趋势特别不方便,翻历史数据更是麻烦。
把PCP接入Grafana之后,网页上直接出CPU、内存、磁盘、网络的曲线图,做成监控大盘。值班的时候不用一台台ssh登录服务器,打开网页就能看所有主机性能。再搭配pmlogger的归档功能,出问题之后直接拖动时间轴回看过去的曲线,找业务卡顿的时间点,排查起来省事很多。

补充小提示
Grafana 可以和PCP装在同一台机器,也可以单独部署。远程访问的时候,要保证Grafana服务器可以正常访问 http://服务器IP:44322/metrics,防火墙、云服务器安全组都要记得放行44322端口。


总结:什么时候该用 PCP?

如果你只是想快速排查一台服务器为什么卡,sysstat 通常足够。

但在以下场景中,PCP 更合适:

  1. 需要长期保存详细历史性能数据
  2. 需要关联分析多个指标
  3. 需要统一监控系统、数据库、容器、网络等不同层次
  4. 多台服务器需要集中性能分析
  5. 希望对接 Grafana 做可视化展示
  6. 需要更灵活的指标扩展能力

对于中大型环境、集群环境、需要事后深度分析的场景,PCP 是非常值得投入学习的工具。