Systemtap Begginers Guide の1章と2章のメモ

Introduction

SystemTapは、主にカーネルに対するトレースと探査をするツールである。

1.1 ドキュメントの目標

SystemTapは実行中のカーネルを監視するための機構を提供する。
SystemTap無しでは、実行中のカーネルを監視するのに非常に手間がかかる。
また、SystemTapは知識のあるユーザを対象にして作られているので、初心者には使い辛い。
既存のドキュメントも同様であるため、ツールの学習が難しくなっている。

それら2つの問題点から、SystemTap Begginers Guideは以下の目標に対して書かれた。

  1. SystemTapを紹介し、アーキテクチャに慣れさせ、セットアップ方法を提供する
  2. 既に書かれた監視用SystemTapスクリプトを元に、どのように実行して分析されるのか説明する

1.2 SystemTapの機能

SystemTapは既存のLinux監視ツールにカーネルの状況を追跡するための機能を付与する事を目的としている。
SystemTapはこの機能を以下の2つと組み合わせている。

  • 柔軟性

SystemTapは、簡単なスクリプトで広範なカーネル内部の探査や監視が出来るようになっている。
このため、あなた自身が開発している専門的なカーネル向けのツールには適さない。

  • 使いやすさ

SystemTapは手間いらず。

ほとんどのSystemTapスクリプトは5章に列挙して、説明している。

制限

現在のSystemTapは、ユーザー空間の探査をする際にutraceを必要としている。
utraceはほとんどのカーネルで利用出来ない。このため、一部のカーネルのバージョンでしかユーザー空間の探査が出来ない。
現在もユーザー空間の探査に関する開発が熱心に行われている。

SystemTapの使用

2.1

SystemTapを使うためには、各カーネル用の-devel, -debuginfo, -debuginfo-commonパッケージが必要である。
別バージョンのカーネルを入れたら、それ用の-devel, -debuginfo, -debuginfo-commonパッケージをインストールしなければならない。

重要
debuginfoパッケージはデバッグカーネルの事ではない。

2.1.1 SystemTapのインストール

SystemTapを使うには、systemtapsystemtap-runtimeパッケージが必要である。

yum install systemtap systemtap-runtime

と実行すればインストール出来る。
SystemTapを使うには、カーネル情報RPMのインストールが必要である。

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を実行すればよい。

2.3.1.2 File Flight Recorder

ログをファイルに出力することも出来る。
ファイル名の指定に-oを用いる。また、-Sがファイル上限サイズ(メガバイト),とファイル数の上限である。
stap -F -v -e 'probe vfs.read {printf("readperformed\n"); exit()}' -o /tmp/stap.log -S 1,2
停止するときはkillコマンドでSIGTERMを送ればよい。
kill -s SIGTERM PID