Systemtap Begginers Guide の1章と2章のメモ
1.1 ドキュメントの目標
SystemTapは実行中のカーネルを監視するための機構を提供する。
SystemTap無しでは、実行中のカーネルを監視するのに非常に手間がかかる。
また、SystemTapは知識のあるユーザを対象にして作られているので、初心者には使い辛い。
既存のドキュメントも同様であるため、ツールの学習が難しくなっている。
それら2つの問題点から、SystemTap Begginers Guideは以下の目標に対して書かれた。
1.2 SystemTapの機能
SystemTapは既存のLinux監視ツールにカーネルの状況を追跡するための機能を付与する事を目的としている。
SystemTapはこの機能を以下の2つと組み合わせている。
- 柔軟性
SystemTapは、簡単なスクリプトで広範なカーネル内部の探査や監視が出来るようになっている。
このため、あなた自身が開発している専門的なカーネル向けのツールには適さない。
- 使いやすさ
SystemTapは手間いらず。
制限
現在のSystemTapは、ユーザー空間の探査をする際にutraceを必要としている。 utraceはほとんどのカーネルで利用出来ない。このため、一部のカーネルのバージョンでしかユーザー空間の探査が出来ない。 現在もユーザー空間の探査に関する開発が熱心に行われている。
SystemTapの使用
2.1
SystemTapを使うためには、各カーネル用の-devel, -debuginfo, -debuginfo-commonパッケージが必要である。
別バージョンのカーネルを入れたら、それ用の-devel, -debuginfo, -debuginfo-commonパッケージをインストールしなければならない。
重要 debuginfoパッケージはデバッグ用カーネルの事ではない。
2.1.1 SystemTapのインストール
SystemTapを使うには、systemtapとsystemtap-runtimeパッケージが必要である。
2.1.2 カーネル情報RPMのインストール
SystemTapにはカーネル情報のインストールが必要なので、各カーネル用の
- kernel-debuginfo
- kernel-debuginfo-common
- kernel-devel
をインストールすること。現在使っているカーネルはuname -rで確認できる。
例えば、i686向けのカーネル2.6.18-53.el5 を使っているなら、以下のファイルをダウンロードしてインストールすること。
- kernel-debuginfo-2.6.18-53.1.13.el5.i686.rpm
- kernel-debuginfo-common-2.6.18-53.1.13.el5.i686.rpm
- kernel-devel-2.6.18-53.1.13.el5.i686.rpm
重要 devel,-debuginfo, -debuginfo-commonのバージョンやアーキテクチャなどは、 カーネルと正確に一致していなければならない。
簡単にインストールする方法は、yum installとdebuginfo-installコマンドを使う事である。
以下のようにしてコマンドを実行すればよい。ただしkernelname-devel-versionは適宜変更する事。
- yum install kernelname-devel-version
- debuginfo-install kernelname-version
yumが使えない場合には、以下のスクリプトを使ってURLを確認し、必要なパッケージをダウンロードしてインストールする。
#! /bin/bash echo -n "Enter nvr of kernel-debuginfo (e.g. 2.6.25-14.fc9.x86_64) " ; \ read NVR; \ BASE=`uname -m` ; \ NVR=`echo $NVR | sed s/.$BASE//` ; \ VERSION=`echo $NVR | awk -F- '{print $1}'` ; \ RELEASE=`echo $NVR | awk -F- '{print $2}'` ; \ echo "http://kojipkgs.fedoraproject.org/\ packages/kernel/$VERSION/$RELEASE/$BASE/"
ダウンロードしたrpmファイルは以下のコマンドでインストール出来る。
rpm --force -ivh package_names
package_namesは適宜変更すること。
インストールしたら、stap -v -e 'probe vfs.read {printf("readperformed\n"); exit()}'を実行してテスト出来る。
run completedと出れば実行出来る。
2.2 他のコンピュータ用に計測モジュールを生成する
debuginfoなどをインストール出来ない場合には、別のコンピュータで作成した計測モジュールを使う事が出来る。
ただし、systemtap-runtimeはsystemtapを実行するすべてのコンピュータにインストールされていなければならない。
stap -r カーネルバージョン -e 'スクリプト' -m モジュール名
のように実行すると モジュール名.ko というファイルが作られる。
この.koファイルをstapを実行したいコンピュータに持っていき、
staprun モジュール名.koと実行すればよい。
2.3 SystemTapスクリプトの実行
SystemTapはstapかstaprunコマンドで実行出来る。
SystemTapの実行には権限が必要である。
stapでモジュールを作るユーザはstapdevグループに追加すること。
stapを実行するだけのユーザはstapusrグループに追加することで、
/lib/modules/kernel_version/systemtap/にあるモジュールだけ、実行することが出きるようになる。
2.3.1 SytemTap Flight Recorder Mode
- Fを使うことで、SystemTapをバックグラウンドで実行する事が出来る。
2.3.1.1 In-memory Flight Recorder Mode
stap -F -v -e 'probe vfs.read {printf("readperformed\n"); exit()}'のように実行すると、
Disconnecting from systemtap module. To reconnect, type "staprun -A stap_5dd0073edcb1f13f7565d8c343063e68_19556"
といった内容が表示されてバックグラウンドで実行される。ログはバッファに保存される。
バックグラウンドのSystemTapに再接続してログを確認する場合には、
staprun -A stap_5dd0073edcb1f13f7565d8c343063e68_19556を実行すればよい。