ログイン / 登録 アカウント

前回の記事の続きですが、この記事の目的はPerformance Co-Pilot (PCP)とbpftraceを使って、通常のLinuxのツールでは表示することが難しい低レベルのカーネルメトリクスをグラフ化する方法を紹介することです。実際には、カーネルから取得した値をbpftraceスクリプトでeBPFマップ(eBPF プログラムでデータを保存するために使われる汎用的なkey/value型のデータ構造)に格納することができれば、それをPerformance Co-Pilotでグラフ化できます。

まず、bpftraceとPerformance Co-Pilotを使用するための開発環境のセットアップ手順を見てみましょう。前回の2つの記事の手順通り進めていれば、Performance Co-PilotとGrafanaがインストールされ動作しているはずです。次にserver-1で、pcp-pmda-bpftraceをインストールします。

yum install bpftrace pcp-pmda-bpftrace -y
cd /var/lib/pcp/pmdas/bpftrace
./Install

bpftrace pmdaが正しくインストールされているか確認するため以下のコマンドを試してみましょう。

pmrep bpftrace.scripts.runqlat.data_bytes -s 5

するとランキュー(run queue)のレイテンシーがマイクロ秒単位で、5サンプル分表示されるはずです。

  b.s.r.data_bytes
            byte/s
               N/A
           586.165
           590.276
           588.141
           589.113

これでbpftrace pmdaがPerformance Co-Pilotで動くようになったので、次に開発環境のGrafanaと統合する作業を進めます。まず開発環境から始めるのは、bpftraceスクリプトを改良した上で本番環境に持っていく必要があるためです。

さらに、pcp bpftraceをGrafanaで有効にするにはGrafana用の‘metrics’ユーザーを作成する必要があり、このユーザーは有効なbpftraceスクリプトをrootで実行できる必要があります。本番環境でこれを行うのは避けたほうがいいでしょう。この記事ではのちほどbpftraceスクリプトをpcpとGrafanaと組み合わせて本番環境で使う方法を説明します。

‘metrics‘ Performance Co-Pilotユーザーを作ってアクセスを許可しましょう。

yum install cyrus-sasl-scram cyrus-sasl-lib -y
useradd -r metrics
passwd metrics
saslpasswd2 -a pmcd metrics
chown root:pcp /etc/pcp/passwd.db
chmod 640 /etc/pcp/passwd.db

saslpasswd2コマンドはパスワードを設定し、’metrics’ユーザーをpmcdのsaslグループに追加し、pcpのデータへのアクセスを可能にします。

以下の2行が/etc/sasl2/pmcd.confに設定されていることも確認してください。

mech_list: scram-sha-256
sasldb_path: /etc/pcp/passwd.db

さてここまで完了したところで pcp を再起動する必要があります。 systemctl を実行します。

systemctl restart pmcd

次に、この新しいユーザーがbpftrace pmdaを使用できるよう設定を行います。この手順は開発環境用であり、本番環境用ではないことに注意してください。/var/lib/pcp/pmdas/bpftrace/bpftrace.confを編集し、以下の2つの項目が [dynamic_scripts] に設定されていることを確認します。

enabled=true
allowed_users=root,metrics

これらの変更が完了したら、bpftrace pmdaを再インストールする必要があります。

cd /var/lib/pcp/pmdas/bpftrace
./Remove
./Install

これで http://server-1:3000 でgrafanaを表示しPart1の記事で設定したadminパスワードでログインする準備が整いました。

歯車アイコン(Configuration)、そしてData Sourcesをクリックします。Add Data Sourceをクリックし、ページの一番下までスクロールしPCP bpftraceをマウスオーバーし、Selectをクリックします。

フォームのURLフィールドには、http://localhost:44322/ と入力し、Authの項目でBasic authをクリックします。Basic Auth Detailsセクションが表示されるので、metricsユーザー名と、前のステップでsaslpasswd2で設定したパスワードを入力します。ここまで完了したら、Save & Testをクリックすると Data source is working というメッセージが表示されます。

pcp grafana part 3 data sources

ここでDashboardsアイコンをクリックし、Manageを選択します。このリストの中にPCP bpftrace System Analysisという名前のダッシュボードが表示されています。これをクリックしてください。このダッシュボードにはいくつかのメトリクスが表示されます。 CPU usageの隣にあるドロップダウンをクリックしEditをクリックします。これが表示されると、クエリが実際のbpftraceスクリプトであり、この場合は、@cpuというbpfマップに、CPU使用率を表すCPUデータのヒストグラムが入力されていることがわかります。Grafanaはこのbpfマップを取り込み、グラフとして表示します。

pcp grafana part 3 bpf map

bpftraceスクリプトを使用して、カーネルデータを、例えばforkで生成される1秒あたりの pid の数をグラフ化する方法を見てみましょう。Brendan Greggは、まさにそれを行うためのpidpersec.btを書きましたが、そのスクリプトの中で私たちが必要とする重要な部分は以下の通りです。

tracepoint:sched:sched_process_fork
{
     @ = count();
}

こちらは基本的には、sched_process_forkが呼び出された回数をカウントし、bpfマップに保存してgrafanaでグラフ化します。

それではこのデータをグラフ化するパネルを作ってみましょう。メインのPCP bpftrace System Analysisダッシュボードのページに戻ると、Add Panelボタンがあります。これをクリックすると、2つのボタンを持つ新しいパネルが表示されます。Add Queryボタンをクリックします。

Queryという単語の隣にドロップダウンメニューがあります。このドロップダウンメニューを選択し、PCP bpftraceを選択します。次にQuery Aのテキストボックスにbpftraceスクリプトを入力します。

tracepoint:sched:sched_process_fork
{
     @ = count();
}

General設定ボタンをクリックして、TitleをProcesses Per Secondに設定します。メインのPCP bpftrace System Analysisダッシュボードに戻り、このメトリックがダッシュボードに表示されていることを確認します。必要であれば、このダッシュボードを保存することもできます。

pcp grafana part 3 PCP bpftrace System Analysis

これは非常にクールですが、metrics pcpユーザーに対し権限を与えてあらゆるbpftraceスクリプトをシステム上で実行できるようにする必要があったことを思い出してください。開発環境ではそれで問題ありませんが、本番環境ではそのようなことはしたくありません。本番環境のユーザーが好きにbpftraceスクリプトを実行することなく、先ほどの新しいbpftraceスクリプトProcesses Per Secondを使用できる方法が必要です。

bpftrace pmdaパッケージはそのための機能を提供してくれます。/var/lib/pcp/pmdas/bpftrace/autostartに格納されたbpftraceスクリプトは、bpftrace pmdaがロードされると、通常のPerformance Co-Pilot メトリクスとしてロードされます。

そこで、/var/lib/pcp/pmdas/bpftrace/autostart/pidpersec.btを編集して読み込ませてみましょう。

tracepoint:sched:sched_process_fork
{
     @ = count();
}

これを保存したら以下を実行します。

cd /var/lib/pcp/pmdas/bpftrace/
./Remove
./Install
pminfo | grep pidpersec

そうすると以下のような出力がみられるはずです。

bpftrace.scripts.pidpersec.data.root
bpftrace.scripts.pidpersec.data_bytes
bpftrace.scripts.pidpersec.code
bpftrace.scripts.pidpersec.probes
bpftrace.scripts.pidpersec.error
bpftrace.scripts.pidpersec.exit_code
bpftrace.scripts.pidpersec.pid
bpftrace.scripts.pidpersec.status

bpfマップに名前を付けていないので、pmdaは、そのbpfマップにrootという名前を付けます。これが知りたい値であり、以下のコマンドで値を検索できます。

pmrep bpftrace.scripts.pidpersec.data.root -s 5

以下のような出力が得られます。

  b.s.p.d.root
            /s
           N/A
         3.984
        31.049
         0.000
         0.000

これは1秒あたりにforkされたプロセス数を表しています。このメトリックは標準のPerformance Co-Pilotのメトリックとなったので、grafanaユーザーに特別な権限を与えることなくgrafanaでグラフ化することができます。

Grafanaに戻り、Dashboardsアイコンをクリックして、Manageをクリックします。次に、PCP Vector Host Overviewをクリックします。そしてAdd Panelボタンをクリックして、新しいパネルでAdd Queryをクリックします。

Queryという単語の横にドロップダウンメニューがあります。このメニューからPCP Vectorを選び、Aのクエリに単に次のように入力します。

bpftrace.scripts.pidpersec.data.root
pcp grafana part 3 pcp vector

Generalアイコンをクリックして、タイトルをProcesses per Secondに設定します。

PCP Vector Host Overviewダッシュボードに戻ると、bpftraceスクリプトのbpfマップがグラフ化されているのがわかります。これは特別な権限を持たない一般ユーザーによって行われており、本番環境で利用しても問題はありません。

pcp grafana part 3 pcp vector host overview

以上がpcp-pmda-bpftraceを使ってカーネルのメトリクスをGrafanaでグラフにして表示する方法でした。

ここでご紹介した方法では、bpftraceスクリプトが常時実行されることに注意してください。そのため、スクリプトが必要とするオーバーヘッドが許容できるものか確認しておく必要があります。Bpftraceスクリプトは、通常システムへのオーバーヘッドは少ないですが、大量のデータを収集しより大きなオーバーヘッドを発生させるスクリプトを作ることもできます。

以上でRed Hat Enterprise Linux (RHEL) 8でシステムパフォーマンスを可視化する方法についての連載は終了です。ご覧いただいたように、RHEL8ではシステムのパフォーマンスを可視化するためのモダンで優れたツールが提供されています。

以前の記事


About the author

Karl Abbott is a Senior Product Manager for Red Hat Enterprise Linux focused on the kernel and performance. Abbott has been at Red Hat for more than 15 years, previously working with customers in the financial services industry as a Technical Account Manager.