Performance Co-Pilotでパフォーマンス測定を簡単にしよう

Red Hat Enterprise Linux 7(そして6.7)にはパフォーマンス監視や記録のために、従来のsysstatなどに加えてPerformance Co-Pilot(PCP)が含まれました。PCPは特に複数台からなる大規模なシステムのパフォーマンス監視に便利な特長を多くもっています。今回はPCPをご紹介します。

レッドハットの森若です。Red Hat Enterprise Linux 7(そして6.7)にはパフォーマンス監視や記録のために、従来のsysstatなどに加えてPerformance Co-Pilot(PCP)が含まれました。

PCPは2000年にSGIがIRIX用に出荷してから現在まで15年ほどの歴史があリ、特に複数台からなる大規模なシステムのパフォーマンス監視に便利な特長を多くもっています。

Performance Co-Pilot(PCP)とは?

Performance Co-PilotはCPU使用率やディスクアクセスなどのパフォーマンスメトリクスを収集、分析するためのフレームワークです。データ収集のためのデーモンと、さまざまな形で出力するためのクライアントが提供されています。

PCPのアーキテクチャはデータ収集をするデーモンとクライアントにわかれています。クライアントはローカルホストだけでなく、リモートサーバへの接続ができるので、リモート環境や複数台からなる環境のパフォーマンス監視をごく自然におこなうことができます。

データ収集デーモンには、収集をおこないクライアントからの接続を受けつけるpmcdと、実際に測定対象からパフォーマンスデータを収集するpmdaの2種類のプログラムが登場します。pmdaは測定対象ごとに、kernel, linux, cisco, mounts, などのコンポーネントに分かれていて必要なものだけを選択して利用します。pmdaはユーザが新しく作成して拡張することもできます。

 

PCPの名前空間

PCPであつかうメトリクスは名前、データ型、単位の組み合わせで定義されており、名前はツリー状の構造を持っています。たとえばCPUの使用量であれば、kernel.percpu.cpu.user のようにPMDAの名前からはじまり、順に分類が細かくなっていきます。現在のシステムで利用可能な測定値の名前一覧はpminfoコマンドで取得できます。

各項目の説明はpminfo -t で、現在の値はpminfo -fで取得できます。各項目には複数のインスタンスを持つことができるので、たとえばディスク性能の項目についてはパーティション毎などのインスタンスが含まれます。以下はpminfoで項目の意味と値や単位を確認する例です。

$ pminfo -dtf disk.partitions.read

disk.partitions.read [read operations metric for storage partitions]
    Data Type: 32-bit unsigned int  InDom: 60.10 0xf00000a
    Semantics: counter  Units: count
    inst [0 or "sdb1"] value 29668
    inst [1 or "sda1"] value 257
    inst [2 or "sda2"] value 2
    inst [3 or "sda5"] value 120259
    inst [4 or "sr0"] value 0
    inst [5 or "sdc1"] value 358

特殊な項目としてハードウェアインベントリhinvがあり、この項目はCPU数やメモリの総量など基本的に変化しないメトリクスを保持します。

PCPのクライアント

PCPではあらかじめ様々な種類のクライアントが用意されています。クライアントの一部を眺めてみましょう。

GUIでグラフを作成するpmchart

vmstat風の出力を出してくれるpmstat

top風の出力をおこなうpmatop

オプションのクエリにしたがって任意のメトリクスを定期的に表示するpmval

トリガの設定とコマンド実行

クライアントの1つであるpmieでは専用の言語によりメトリクスを使った各種の条件でトリガーを設定し、コマンド実行やログ出力を行います。pmieconfコマンドであらかじめ用意されたテンプレートをカスタマイズしてpmieの設定を作成することもできます。

以下はpmieconfが生成する設定の例です。2分おきに測定し、ネットワークインタフェースのどれか1つでも帯域利用率が85%を越えていれば利用率とインタフェースをログに出力します。1度出力を行うと10分間は警告の出力を抑制します。

delta = 2 min;
per_netif.util =
some_inst (
    ( 100 * network.interface.total.bytes   /
       network.interface.baudrate   )
          > 85
    && network.interface.baudrate   > 0
) -> syslog 10 min "High network interface utilization" " %v%util[%i]@%h";

PCPのアーカイブ

PCPはsarとおなじように定期的に測定したパフォーマンスメトリクスをアーカイブへ保存することができます。クライアントとして実装されたpmloggerがアーカイブを作成します。それぞれのメトリクス毎にアーカイブへ記録する頻度を設定でき、たとえばCPU使用率は30秒ごとに、ディスク使用率は10分ごとに記録するような設定が可能です。pmloggerもリモート接続が可能なので、測定対象のサーバ上でもデータ収集用のサーバでも実行できます。

sarのアーカイブでは残念ながらバージョンやアーキテクチャによる非互換がありますが、PCPのアーカイブはOSやアーキテクチャから独立したフォーマットが策定されています。さらにPCPのバージョンからも独立しており、ドキュメントによれば15年前に保存されたアーカイブであっても最新版のPCPで問題なく読み込むことができるとのことです。このような特徴があるため、複数のバージョンやOSが混在している環境のパフォーマンス監視にも活躍します。

クライアントライブラリはリアルタイムの情報収集とアーカイブ参照の両方に対応しているので、ほとんどのクライアントはリアルタイムの確認と過去データのリプレイのどちらにも対応しています。過去のデータも現在のデータと同じように確認できるため、現在の性能と過去の性能を比較するような作業が容易になります。

他プログラムとの連携

PCPでは各種言語のライブラリが整備されており、たとえばLinuxサーバやDockerの管理インタフェースとしてRHEL7.1から導入されたcockpitも性能情報はPCP経由で取得しているなど、他のプログラムからの利用が容易になっています。ベンチマークなどで高度な分析をおこないたい場合にも、アーカイブをPythonなどのプログラムから読み込むことで様々な活用が可能となります。

関連情報

  • man PCPIntro