#chiroito ’s blog

Java を中心とした趣味の技術について

Oracle Linux で Dtrace を使う

性能分析をしていると、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のものしか読まれていなかったので、systraceprofileのプローブをロードしましょう。

> modprobe systrace
> modprobe profile

もう一度、dtrace -lするとsystraceprofileのプローブがロードされているのが確認できます。

> /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