性能分析をしていると、OS上で稼働しているプロセスがそれぞれどのくらいのデータ長を何回書いたのか、Java のスレッドのライフサイクルを測定したいということは無いでしょうか。ですが、これらの情報を取得することはアプリケーションを対応させたりなどしないといけないため大変です。DTrace を使用するとカーネルが対応していればカーネルの情報を簡単に取得できるようになり、Javaが対応してればJavaの情報を簡単に取得できるようになります。
DTraceでは情報を取得するポイントをプローブと言い、プローブの単位でどの様な情報を取得するかを指摘できます。プローブにはディスクの読み書き、Javaのスレッドのライフサイクルやクラスローディングなどがあります。
今回は、Oracle Linux 7.3 UEK 4 の環境に DTrace をインストールします。
> cat /etc/oracle-release Oracle Linux Server release 7.3 > uname -r 4.1.12-61.1.19.el7uek.x86_64
Dtrace をインストール
以下のサイトから dtrace-utils をダウンロードします。
Oracle Linux DTrace
今回は次のバージョンのものをダウンロードします。
DTrace utilities for development with Unbreakable Enterprise Kernel R4
DTrace utilities, Oracle Linux 7 (x86_64)
ダウンロードが終わったら root ユーザでインストールしましょう。依存関係のあるパッケージがあるため、yum
でインストールします。
> yum localinstall dtrace-utils-*.rpm (略) インストール: dtrace-utils.x86_64 0:0.5.1-3.el7 依存性関連をインストールしました: dtrace-modules-shared-headers.x86_64 0:0.5.3-2.el7 libdtrace-ctf.x86_64 0:0.5.0-3.el7 完了しました!
測定ポイントのロード
DTrace を使うには測定のポイントとなるプローブ(Probe)が必要となります。インストールして直ぐは DTrace 自体のプローブのみがロードされていて測定したいもののプローブはロードされていません。
dtrace に -l オプションを付けるとロードされているプローブを一覧表示します。
> /usr/sbin/dtrace -l Downloading DTrace module... ID PROVIDER MODULE FUNCTION NAME 1 dtrace BEGIN 2 dtrace END 3 dtrace ERROR
プローブはdtrace
のものしか読まれていなかったので、systrace
とprofile
のプローブをロードしましょう。
> modprobe systrace > modprobe profile
もう一度、dtrace -l
するとsystrace
とprofile
のプローブがロードされているのが確認できます。
> /usr/sbin/dtrace -l ID PROVIDER MODULE FUNCTION NAME 1 dtrace BEGIN 2 dtrace END 3 dtrace ERROR 4 syscall vmlinux read entry 5 syscall vmlinux read return
試しに情報取得
稼働しているプロセスがどのくらいのデータ長を何回書いたかを取得してみます。DTrace の詳細は割愛しますが、この結果では、プロセス名、データ長、書込回数、の順で出力されます。実行してからctrl+c
を押すまでの間、情報を収集し、その収集結果を出力します。
> /usr/sbin/dtrace -n 'syscall::write:entry /execname != NULL/ { @writes[execname, arg2] = count(); }' dtrace: description 'syscall::write:entry ' matched 1 probe ^C agent 6 1 agent 99 1 agent 2115 1 docker-proxy 2 1 docker-proxy 6 1 dockerd 7 1 dockerd 4096 1 dockerd 18312 1 dtrace 1 1 healthcheck 10 1