2013/05/21

FreeBSD 9.1-RELEASEでDTraceの機能を有効にする

はじめに

FreeBSD 9.1でDTraceを試してみようとと思い、その機能を有効にしてみました。その手順をまとめてみます。
※ここでは、DTraceの機能を有効にする手順を記載しており、使い方などは記載していません。

DTraceとは

DTraceとは,Sun Microsystems社(現Oracle社)によって開発された、実行中のプログラムのトレース(解析や診断)を動的に行なうためのフレームワークです。DTraceを使うことで、動作中のプログラムの実行状況をリアルタイムに確認することができるため、その時のHWリソースの使用状況やボトルネックの特定、それによるチューニングなどを行えます。

ライセンス形態はSun Microsystems社(現Oracle社)が策定したフリーソフトウェア向けのCommon Development and Distribution Licenseというもので、ライセンス上問題ないことからFreeBSDでは7.1-RELEASEから取り込まれていました。当時はカーネルのみのサポートだったようですが、FreeBSD 9系からはユーザランドもサポートされたものが組み込まれているようです。

DTrace機能の有効化

デフォルトではDTraceの機能は無効になっていますので、有効にしてみます。

環境

環境は以下の通りです。

プラットフォーム さくらのVPS(2Gモデル)
OS FreeBSD 9.1-RELEASE amd64 (64bit)
事前準備

前述の通り、DTraceは標準では有効になっていません。

# dtrace -l | head
dtrace: failed to initialize dtrace: DTrace device not available on system

DTraceを有効にするには、カーネルのコンフィグレーションファイルに必要なオプションを追記し、カーネルの再構築を行う必要があります。公式手順を参考にカーネルの再構築を実施します。

既存のカーネルコンフィグレーションファイル(GENERIC)を直接編集してはいけませんので、事前準備として、既存のカーネルコンフィグレーションファイル(GENERIC)を適当な別名(ここではGENERIC-CUSTOM)でコピーして、それをDTraceを有効にするための新カーネルコンフィグレーションファイルとして利用します。ファイルの作成先はどこでも構いませんが、公式手順通りに/root/kernelsとしています。新カーネルコンフィグレーションファイルを/usr/src/sys/amd64/confにシンボリックリンクとして作成します。

# mkdir /root/kernels 

# cd /usr/src/sys/amd64/conf 
# cp -p GENERIC /root/kernels/GENERIC-CUSTOM
# ln -s /root/kernels/GENERIC-CUSTOM
# ls -l /usr/src/sys/amd64/conf
total 37
-rw-r--r--  1 root  wheel    491  1月  1 23:38 DEFAULTS
-rw-r--r--  1 root  wheel  14189  1月  1 23:38 GENERIC
lrwxr-xr-x  1 root  wheel     28  5月 19 21:27 GENERIC-CUSTOM -> /root/kernels/GENERIC-CUSTOM
-rw-r--r--  1 root  wheel    791  1月  1 23:38 GENERIC.hints
-rw-r--r--  1 root  wheel    143  1月  1 23:38 Makefile
-rw-r--r--  1 root  wheel  16552  1月  1 23:38 NOTES
-rw-r--r--  1 root  wheel    646  1月  1 23:38 XENHVM
カーネルコンフィグレーションファイルへDTraceオプションの追加

公式手順を参考に、新カーネルコンフィグレーションファイル(GENERIC-CUSTOM)にDTraceを有効にするためのカーネルオプションを追加します。

FreeBSD 9系の場合は以下のオプションを追記します。

# vim /root/kernels/GENERIC-CUSTOM
…
### USE DTrace ###
options         KDTRACE_HOOKS
options         DDB_CTF
options         KDTRACE_FRAME
makeoptions     WITH_CTF=1
カーネルの再構築とインストール

カーネルの再構築(コンパイル)を実行します。KERNCONFオプションに、新カーネルコンフィグレーションファイル(ここではGENERIC-CUSTOM)を指定します。

# cd /usr/src
# make buildkernel KERNCONF=GENERIC-CUSTOM
--------------------------------------------------------------
>>> Kernel build for GENERIC-CUSTOM started on Sun May 19 22:35:01 JST 2013
--------------------------------------------------------------
===> GENERIC-CUSTOM
…
…
…
objcopy --only-keep-debug zlib.ko.debug zlib.ko.symbols
objcopy --strip-debug --add-gnu-debuglink=zlib.ko.symbols zlib.ko.debug zlib.ko
--------------------------------------------------------------
>>> Kernel build for GENERIC-CUSTOM completed on Sun May 19 22:10:11 JST 2013
--------------------------------------------------------------

新カーネルをインストールします。

# make installkernel KERNCONF=GENERIC-CUSTOM

※ここで、新カーネルは /boot/kernelに/boot/kernel/kernelという名前で保存され、古いカーネルは/boot/kernel.old/kernelという名前で保存されます。

# ls -l /boot/kernel*
/boot/kernel:
total 376898
…

/boot/kernel.old:
total 357491
…

システムを再起動して、新カーネルで起動します。

# shutdown -r now
カーネルモジュールの読み込み

システムを再起動しても、この時点ではまだDTraceは有効化されていません。

# dtrace -l | head
dtrace: failed to initialize dtrace: DTrace device not available on system

再起動後にDTrace関連のカーネルモジュールが作成されます。dtraceall.koモジュールを読み込むことで、DTrace関連のモジュールが全て読み込まれ、DTraceの機能が有効化されます。

# kldload dtraceall

確認
DTraceが有効になっていることを確認します。

# dtrace -l 
   ID   PROVIDER            MODULE                          FUNCTION NAME
    1     dtrace                                                     BEGIN
    2     dtrace                                                     END
    3     dtrace                                                     ERROR
    4   dtmalloc                                       nfsclient_req malloc
    5   dtmalloc                                       nfsclient_req free
…
…
…
55380    profile                                                     tick-1
55381    profile                                                     tick-10
55382    profile                                                     tick-100
55383    profile                                                     tick-500
55384    profile                                                     tick-1000
55385    profile                                                     tick-5000

以上で、DTraceの機能が有効化ができました。

※ユーザランドDTraceの設定(参考)

ユーザランドDTraceをより有効に活用できるように以下の設定をしておきます。これによって、スタックトレースが動作し、より多くの情報を表示できるようになります。

# vim /etc/make.conf
STRIP=
CFLAGS+=-fno-omit-frame-pointer
WITH_CTF=1

ベースシステムを再構築します。

# cd /usr/src
# make buildworld
# shutdown -r now
# boot -s

ベースシステムをインストールします。

# make installworld

システムを再起動して、さくらのVPSコントロールパネルからシングルユーザモードで起動します。

# shutdown -r now

さくらのコントロールパネル上からVNCコンソールを開き、以下の画面で「6」キーを入力します。"[S]ingle User"項目がOnになったことを確認して、起動させます。

以下はシングルユーザモードでのオペレーションとなります。

ファイルシステムを読み書き可能な状態にします。

# mount -u /

ベースシステムのインストールを行います。

# cd /usr/src
# make installworld

以上で、ユーザランドDTraceの機能を拡張できました。

おわりに

ここでは、DTraceを有効化する手順を記載しました。実際の使用法や動作についてはまだきちんと確認できていませんが、Solarisでも導入されているこの機能を有効に使っていければと思います。

0 Comments:

コメントを投稿