はじめに
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でも導入されているこの機能を有効に使っていければと思います。