Hatena::ブログ(Diary)

mmitouの日記

2012-07-17 Systemtap Begginers Guide の1章と2章のメモ

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

| 02:50

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にはカーネル情報のインストールが必要なので、各カーネル用の

インストールすること。現在使っているカーネルuname -rで確認できる。

例えば、i686向けのカーネル2.6.18-53.el5 を使っているなら、以下のファイルをダウンロードしてインストールすること。 

重要
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

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

トラックバック - http://d.hatena.ne.jp/mmitou/20120717/1342547435
リンク元