SystemTap00

SystemTap が以前から気になってたので、ちゃんと調べてみることに。

ざっとググってみた感じだと、SystemTap Beginners Guide がしっかりまとまっていてわかりやすそうなので、これをベースに調べたことをメモしていく。PDF 版もあるので Kindle に入れて持ち運べるし。

SystemTap とは?

といったもののようです。DTrace を知ってる方なら、それに似たようなもの、と言えばわかりやすいのかもしれません。(自分は DTrace よく知りませんが。)

SystemTap の利用

CentOS 5 でインストールした際のメモ。

利用している kernel と同じバージョンの kernel-devel パッケージをインストール。(systemtap パッケージを入れると依存で勝手に入るけど、利用中の kernel バージョンと異なる場合もあるので、先に入れておくといいです。)

$ sudo yum install kernel-devel-2.6.18-164.el5

systemtap パッケージをインストール。

$ sudo yum install sytemtap

kernel-debuginfo と kernel-debuginfo-common のインストールのために、debuginfo-install コマンドが含まれる yum-utils パッケージをインストール。

$ sudo yum install yum-utils

kernel-debuginfo と kernel-debuginfo-common を yum で取得できるように、以下のような /etc/yum.repos.d/CentOS-debuginfo.repo を作成。

[debuginfo]
name=CentOS debuginfo
baseurl=http://debuginfo.centos.org/$releasever/$basearch/
gpgcheck=0
enabled=1

kernel-debuginfo と kernel-debuginfo-common を インストール。

$ sudo debuginfo-install kernel

kernel-headers も必要かも?

あとは stap コマンドを実行すれば OK。(root 権限が必要だけど、stapdev グループに属しているユーザであれば、権限は不要。)

$ stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'
Pass 1: parsed user script and 65 library script(s) using 43932virt/19448res/1752shr kb, in 170usr/50sys/210real ms.
Pass 2: analyzed script: 1 probe(s), 10 function(s), 2 embed(s), 1 global(s) using 116696virt/75204res/41808shr kb, in 310usr/50sys/369real ms.
Pass 3: using cached /home/miya/.systemtap/cache/eb/stap_ebec3e35e1d3f3f5cd90569c6319bd2f_4795.c
Pass 4: using cached /home/miya/.systemtap/cache/eb/stap_ebec3e35e1d3f3f5cd90569c6319bd2f_4795.ko
Pass 5: starting run.
read performed
Pass 5: run completed in 20usr/50sys/96real ms.

-v オプションで詳細表示。v を増やすと更に詳細に。

表示されるメッセージを見るとなんとなくわかるけど、SystemTap スクリプトをコンパイルしてカーネルモジュールを生成して実行してる。なので gcc や make なんかも必要。(なはず。)

他のマシンで実行できる SystemTap モジュールを生成

上で見たように、SystemTap の利用には、コンパイラや debuginfo パッケージのインストールが必要なんだけど、ポリシー的にそれが許されない環境ではどうするか?実は SystemTap にはコンパイル済みのモジュールを実行する仕組みもある。(このコンパイル済みモジュールのことを、ドキュメントでは Instrumentation と呼んでいる。)

コンパイル済みモジュールは以下のように stap コマンドで生成できる。(-r と -m オプションを指定する。)

$ stap -r 2.6.18-164.el5 -e 'probe vfs.read {exit()}' -m simple -v  [miya@h026]
Pass 1: parsed user script and 65 library script(s) using 43932virt/19448res/1752shr kb, in 180usr/20sys/205real ms.
Pass 2: analyzed script: 1 probe(s), 10 function(s), 2 embed(s), 1 global(s) using 116816virt/75200res/41808shr kb, in 320usr/40sys/364real ms.
Pass 3: translated to C into "/tmp/stapPGBW7a/simple.c" using 116816virt/75940res/42548shr kb, in 230usr/10sys/269real ms.
Pass 4: compiled C into "simple.ko" in 3820usr/790sys/4619real ms.
Pass 5: starting run.
Pass 5: run completed in 20usr/50sys/97real ms.

simple.ko が生成されるので、これを実行したいマシンにコピーする。そのマシン上では、systemtap-runtime パッケージがインストールされていれば良い。で、以下のように staprun コマンドを叩いてモジュールを実行する。

$ staprun simple.ko -v
stapio:cleanup_and_exit:400 detach=0
stapio:cleanup_and_exit:417 closing control channel
staprun:remove_module:205 Module simple removed.

これも root 権限が必要だけど、stapusr グループに属していれば権限は必要ない。(stapdev グループでももちろん実行できる。)

今日はここまで。