硬派な高解像度パフォーマンスモニタリングツール Performance Co-Pilot と PCP.CONF 2018

こんにちは。CTOの馬場です。 Performance Co-Pilotというモニタリングツールをご存知でしょうか?

先日、Performance Co-Pilotのカンファレンス PCP.CONF 2018 に行ってきました。

Performance Co-Pilot Conference 2018

正直かなりマニアックなツールなので、カンファレンス!そんなにユーザいたの!すごい!みたいな気持ちで参加したところ、 参加者は15人くらいで、だいたいはお互いに知り合いっぽい、みたいな感じで驚きました。 (ぱっとみですが、半分くらいはRed Hatの方だったのかな?)

本エントリではユーザと日本語情報流通が増えることを祈念して Performance Co-Pilot の紹介をします。

PCPの特徴

Performance Co-Pilot

pcp-site.png

私の知る限り日本では知名度が低めだと思いますが、Performance Co-Pilotは老舗のモニタリングツールです。 GitHub上で確認できる初回commitは2007/6/13でした。

以下の特徴があり、特にパフォーマンスを追求していくシーンでの活用度が高いです。

PCP.CONF 2018でもアプリケーションプロファイルとPCP(Vector)で性能問題を改善した事例が発表されていました。

高解像度!リアルタイムモニタリング & レトロスペクティブモニタリング!

多くのメトリクス収集プロダクトと同様に、 メトリクス収集デーモン(pmcd)がメトリクス取得対象ごとのプログラム(pmda)が収集した値を集約する形です。

多くのメトリクス収集プロダクトはメトリクス取得対象ごとのプログラムを都度実行(fork/exec)してメトリクスを収集する形式ですが、 PCPはメトリクス収集対象ごとのプログラムがDSOまたはデーモン(pipeでデータをやりとり)です。 高頻度・低負荷のメトリクス収集への気合を感じます。

pcp-atoppcp-dstatpcp-pidstat などのサブツールもあり、リアルタイムに状況を把握することに長けています。 またレトロスペクティブモニタリング(過去データの振り返り)も可能なので、 たとえば負荷テスト中にどの指標がどのように変動したかを詳細に比較しながら振り返るのが容易です。

低レイヤーに強い!

豊富なメトリクス収集プラグインが用意されています。 私が特徴的だと感じたのは systemd、dm(Device Mapper)、infiniband、netfilter、mmv(Memory Mapped Values) などレイヤー低めのところを手厚くカバーしている点です。

docker、elasticsearch、nvidia-gpu、prometheusなど、新しいものもきちんとカバーしています。

[vagrant@work-c7 ~]$ sudo yum --disablerepo='*' --enablerepo='bintray--pcp-el7' search pcp-pmda-
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
================================= N/S matched: pcp-pmda- =================================
pcp-pmda-activemq.x86_64 : Performance Co-Pilot (PCP) metrics for ActiveMQ
pcp-pmda-apache.x86_64 : Performance Co-Pilot (PCP) metrics for the Apache webserver
pcp-pmda-bash.x86_64 : Performance Co-Pilot (PCP) metrics for the Bash shell
pcp-pmda-bind2.x86_64 : Performance Co-Pilot (PCP) metrics for BIND servers
pcp-pmda-bonding.x86_64 : Performance Co-Pilot (PCP) metrics for Bonded network interfaces
pcp-pmda-cifs.x86_64 : Performance Co-Pilot (PCP) metrics for the CIFS protocol
pcp-pmda-cisco.x86_64 : Performance Co-Pilot (PCP) metrics for Cisco routers
pcp-pmda-dbping.x86_64 : Performance Co-Pilot (PCP) metrics for Database response times and Availablility
pcp-pmda-dm.x86_64 : Performance Co-Pilot (PCP) metrics for the Device Mapper Cache and Thin Client
pcp-pmda-docker.x86_64 : Performance Co-Pilot (PCP) metrics from the Docker daemon
pcp-pmda-ds389.x86_64 : Performance Co-Pilot (PCP) metrics for 389 Directory Servers
pcp-pmda-ds389log.x86_64 : Performance Co-Pilot (PCP) metrics for 389 Directory Server Loggers
pcp-pmda-elasticsearch.x86_64 : Performance Co-Pilot (PCP) metrics for Elasticsearch
pcp-pmda-gfs2.x86_64 : Performance Co-Pilot (PCP) metrics for the GFS2 filesystem
pcp-pmda-gluster.x86_64 : Performance Co-Pilot (PCP) metrics for the Gluster filesystem
pcp-pmda-gpfs.x86_64 : Performance Co-Pilot (PCP) metrics for GPFS Filesystem
pcp-pmda-gpsd.x86_64 : Performance Co-Pilot (PCP) metrics for a GPS Daemon
pcp-pmda-haproxy.x86_64 : Performance Co-Pilot (PCP) metrics for HAProxy
pcp-pmda-infiniband.x86_64 : Performance Co-Pilot (PCP) metrics for Infiniband HCAs and switches
pcp-pmda-json.x86_64 : Performance Co-Pilot (PCP) metrics for JSON data
pcp-pmda-kvm.x86_64 : Performance Co-Pilot (PCP) metrics for KVM
pcp-pmda-lio.x86_64 : Performance Co-Pilot (PCP) metrics for the LIO subsystem
pcp-pmda-lmsensors.x86_64 : Performance Co-Pilot (PCP) metrics for hardware sensors
pcp-pmda-logger.x86_64 : Performance Co-Pilot (PCP) metrics from arbitrary log files
pcp-pmda-lustre.x86_64 : Performance Co-Pilot (PCP) metrics for the Lustre Filesytem
pcp-pmda-lustrecomm.x86_64 : Performance Co-Pilot (PCP) metrics for the Lustre Filesytem Comms
pcp-pmda-mailq.x86_64 : Performance Co-Pilot (PCP) metrics for the sendmail queue
pcp-pmda-memcache.x86_64 : Performance Co-Pilot (PCP) metrics for Memcached
pcp-pmda-mic.x86_64 : Performance Co-Pilot (PCP) metrics for Intel MIC cards
pcp-pmda-mounts.x86_64 : Performance Co-Pilot (PCP) metrics for filesystem mounts
pcp-pmda-mysql.x86_64 : Performance Co-Pilot (PCP) metrics for MySQL
pcp-pmda-named.x86_64 : Performance Co-Pilot (PCP) metrics for Named
pcp-pmda-netfilter.x86_64 : Performance Co-Pilot (PCP) metrics for Netfilter framework
pcp-pmda-news.x86_64 : Performance Co-Pilot (PCP) metrics for Usenet News
pcp-pmda-nfsclient.x86_64 : Performance Co-Pilot (PCP) metrics for NFS Clients
pcp-pmda-nginx.x86_64 : Performance Co-Pilot (PCP) metrics for the Nginx Webserver
pcp-pmda-nvidia-gpu.x86_64 : Performance Co-Pilot (PCP) metrics for the Nvidia GPU
pcp-pmda-oracle.x86_64 : Performance Co-Pilot (PCP) metrics for the Oracle database
pcp-pmda-papi.x86_64 : Performance Co-Pilot (PCP) metrics for Performance API and hardware counters
pcp-pmda-pdns.x86_64 : Performance Co-Pilot (PCP) metrics for PowerDNS
pcp-pmda-perfevent.x86_64 : Performance Co-Pilot (PCP) metrics for hardware counters
pcp-pmda-postfix.x86_64 : Performance Co-Pilot (PCP) metrics for the Postfix (MTA)
pcp-pmda-postgresql.x86_64 : Performance Co-Pilot (PCP) metrics for PostgreSQL
pcp-pmda-prometheus.x86_64 : Performance Co-Pilot (PCP) metrics from Prometheus endpoints
pcp-pmda-redis.x86_64 : Performance Co-Pilot (PCP) metrics for Redis
pcp-pmda-roomtemp.x86_64 : Performance Co-Pilot (PCP) metrics for the room temperature
pcp-pmda-rpm.x86_64 : Performance Co-Pilot (PCP) metrics for the RPM package manager
pcp-pmda-rsyslog.x86_64 : Performance Co-Pilot (PCP) metrics for Rsyslog
pcp-pmda-samba.x86_64 : Performance Co-Pilot (PCP) metrics for Samba
pcp-pmda-sendmail.x86_64 : Performance Co-Pilot (PCP) metrics for Sendmail
pcp-pmda-shping.x86_64 : Performance Co-Pilot (PCP) metrics for shell command responses
pcp-pmda-slurm.x86_64 : Performance Co-Pilot (PCP) metrics for NFS Clients
pcp-pmda-smart.x86_64 : Performance Co-Pilot (PCP) metrics for S.M.A.R.T values
pcp-pmda-snmp.x86_64 : Performance Co-Pilot (PCP) metrics for Simple Network Management Protocol
pcp-pmda-summary.x86_64 : Performance Co-Pilot (PCP) summary metrics from pmie
pcp-pmda-systemd.x86_64 : Performance Co-Pilot (PCP) metrics from the Systemd journal
pcp-pmda-trace.x86_64 : Performance Co-Pilot (PCP) metrics for application tracing
pcp-pmda-unbound.x86_64 : Performance Co-Pilot (PCP) metrics for the Unbound DNS Resolver
pcp-pmda-vmware.x86_64 : Performance Co-Pilot (PCP) metrics for VMware
pcp-pmda-weblog.x86_64 : Performance Co-Pilot (PCP) metrics from web server logs
pcp-pmda-zimbra.x86_64 : Performance Co-Pilot (PCP) metrics for Zimbra
pcp-pmda-zswap.x86_64 : Performance Co-Pilot (PCP) metrics for compressed swap

  Name and summary matches only, use "search all" for everything.

Install / Setup

PCP(Performance Co-Pilot)は複数のプロセスで構成されます。

  • pmcd (Performance Metrics Collection Daemon) : メトリクス収集を統括し各PMDAからデータを集める
    • PMDA (Performance Metrics Domain Agent) : メトリクス収集対象ごとの計数取得プログラム
    • PMDAはデーモンまたはDSO。デーモンの場合はpmcdの子プロセスとしてpmcdに管理される
    • デーモンとしてはpmdaproc, pmdalinux, pmdadm(Device Mapper), pmdaxfsなどがある
  • pmlogger : pmcdが集めたデータを保存する

RHEL7/CentOS7の場合、yumでインストールできますが少し古いです。 最新版はbintrayのリポジトリからインストールできます。 ここでは最新版を利用してみます。

pcp-zeroconf というお勧め設定セットも一緒にインストールしておきましょう。

sudo curl -L https://bintray.com/pcp/el7/rpm -o /etc/yum.repos.d/bintray-pcp-el7.repo
sudo yum install pcp pcp-zeroconf

デフォルトで少しプラグインがインストールされますが、 追加でプラグインをインストールする場合は、 yum install してからインストールスクリプトを実行します。

例えば netfilter のプラグインをインストール・セットアップする方法は以下のとおりです。 他のプラグインも概ね yum install => ディレクトリに移動して./Install でよさそうです。 (ディレクトリは rpm -ql pcp-pmda-netfilter などで探すとよいです)

[vagrant@work-c7 ~]$ sudo yum install pcp-pmda-netfilter
...
[vagrant@work-c7 ~]$ sudo bash -c "cd /var/lib/pcp/pmdas/netfilter ;  ./Install"
Please specify parent proc netfilter directory[/proc/sys/net/]:
Updating the Performance Metrics Name Space (PMNS) ...
Terminate PMDA if already installed ...
Updating the PMCD control file, and notifying PMCD ...
Check netfilter metrics have appeared ... 2 warnings, 2 metrics and 0 values
[vagrant@work-c7 ~]$ pcp
Performance Co-Pilot configuration on work-c7:

 platform: Linux work-c7 3.10.0-862.3.2.el7.x86_64 #1 SMP Mon May 21 23:36:36 UTC 2018 x86_64
 hardware: 2 cpus, 1 disk, 1 node, 991MB RAM
 timezone: UTC
 services: pmcd
     pmcd: Version 4.1.0-1, 11 agents, 1 client
     pmda: root pmcd proc xfs linux nfsclient mmv netfilter systemd
           jbd2 dm
 pmlogger: primary logger: /var/log/pcp/pmlogger/work-c7/20180628.05.31
     pmie: work-c7: /var/log/pcp/pmie/work-c7/pmie.log

前述のとおり多くのプラグインが用意されているのでご活用ください。

フロントエンド

モニタリングにはフロントエンドが重要です。

硬派なところでは pmchart というQtベースの可視化ソフトウェアがあります。

もちろんWebベースもあり、 pcp-webapp-graphitepcp-webapp-vector が利用できます。

Vector

Vector

vector-site.png

VectorはNetflixが公開しているPCPのフロントエンドです。 pmwebd 経由でPCPのデータを取得しグラフィカルに表示できます。

sudo yum install pcp-webapi pcp-webapp-vector
sudo systemctl start pmwebd

vector自体はデーモンではないので、 インストール後にApacheやNginxでドキュメントルートを /usr/share/pcp/webapps/vector に指定して画面を表示します。

vector-ss.png

高解像度のデータがリアルタイムに流れていく様子が確認できます。 なんかワクワクしますね。


クラウドの時代になりシステムを群体として捉えることが多くなりましたが、 システム規模を大きくしやすくなったからこそパフォーマンス追求の価値はむしろ大きくなっています。 PCPを引き出しとして持つエンジニアが増えたら幸いです。

株式会社ハートビーツのインフラエンジニアから、ちょっとした情報をお届けします。