SystemTapとは何ですか? どのように使用しますか?
前提条件
以下の Linux バージョンを対象としています。
- RHEL 5.3 Server 以降
- RHEL 6.0 Server 以降
- RHEL 7.0 Server 以降
SystemTapについての概要説明が以下のソリューションに記載されています。この文書は、これを補足することを目的としています。
1. 必要なパッケージ
SystemTapを利用して情報取得を行う環境には、以下のパッケージ(および、依存している他のパッケージ)をインストールする必要があります。
- systemtap-runtime (*1)
以下に、確認結果例を示します。手順の中でカーネルのバージョンが必要になるので、一緒に確認しておいてください。
$ rpm -q systemtap-runtime systemtap-runtime-2.3-4.el6_5.x86_64 $ uname -r 2.6.32-431.11.2.el6.x86_64 |
SystemTap は内部でカーネルモジュールを使用しているため、カーネルモジュールをコンパイルするために以下のパッケージ(および、依存している他のパッケージ)が必要となります。商用環境など、情報取得対象のサーバにこれらのパッケージをインストールすることができない場合は、これらのパッケージをインストールして、カーネルモジュールをコンパイルするための環境を別途用意しても構いません。
以下に、確認結果例を示します。
$ rpm -q systemtap gcc kernel-devel kernel-debuginfo systemtap-2.3-4.el6_5.x86_64 gcc-4.4.7-4.el6.x86_64 kernel-devel-2.6.32-431.11.2.el6.x86_64 kernel-debuginfo-2.6.32-431.11.2.el6.x86_64 |
(*1) SystemTap はデバッグ用途で使用するパッケージであるため、以下に示す通り、RHELのマイナーリリース間であってもメジャーアップデートが採用されるほど、急速に開発が進められています。systemtap関連パッケージのバージョンが古いと、特定の構文やオプションがサポートされていなかったり、挙動が異なる場合があります。情報取得を行う環境でパッケージのアップデートが許容できるならば、ご利用のRHELメジャーリリースでサポートされている最新版のsystemtap関連パッケージを使用することを推奨します。
RHEL リリースのバージョン | 同梱されている systemtap 関連パッケージのバージョン |
---|---|
5.0 | 0.5.12-1.el5 |
5.1 | 0.5.14-1.el5 |
5.2 | 0.6.2-1.el5 |
5.3 | 0.7.2-2.el5 |
5.4 | 0.9.7-5.el5 |
5.5 | 1.1-3.el5 |
5.6 | 1.3-4.el5 |
5.7 | 1.3-8.el5 |
5.8 | 1.6-6.el5 |
5.9 | 1.8-6.el5 |
5.10 | 1.8-6.el5 |
5.11 | 1.8-6.el5 |
6.0 | 1.2-9.el6 |
6.1 | 1.4-6.el6 |
6.2 | 1.6-4.el6 |
6.3 | 1.7-5.el6 |
6.4 | 1.8-7.el6 |
6.5 | 2.3-3.el6 |
6.6 | 2.5-5.el6 |
7.0 | 2.4-14.el7 |
7.1 | 2.6-8.el7 |
(*2)RHEL向けパッケージへのダウンロードリンクを以下に示します。情報取得を行う環境で使用しているカーネルのバージョンおよびアーキテクチャに合致するパッケージをダウンロードしてインストールする必要がある点にご注意ください。
RHEL 7 / x86_64 | |
---|---|
kernel-devel kernel-debuginfo kernel-debuginfo-common-x86_64 |
|
RHEL 6 / x86_64 | RHEL 6 / i386 |
kernel-devel kernel-debuginfo kernel-debuginfo-common-x86_64 |
kernel-devel kernel-debuginfo kernel-debuginfo-common-i686 |
RHEL 5 / Xen 以外 / x86_64 | RHEL 5 / Xen 以外 / i386 |
kernel-devel kernel-debuginfo kernel-debuginfo-common |
kernel-devel kernel-debuginfo kernel-debuginfo-common |
RHEL 5 / Xen / x86_64 | RHEL 5 / Xen / i386 |
kernel-xen-devel kernel-xen-debuginfo kernel-debuginfo-common |
kernel-xen-devel kernel-xen-debuginfo kernel-debuginfo-common |
2. SystemTapスクリプトの作成およびコンパイル
作成するSystemTapスクリプトの内容は、取得したい情報や使用するカーネルのバージョンにより異なります。この文書は手順の説明を目的とするため、以下の内容を持つ「example.stp」というスクリプトを使うものと仮定します。
プロセスの終了時に通知を行うための example.stp |
---|
probe begin { printf("Probe started.¥n"); } probe kernel.function("do_exit") { printf("%s PID=%u TID=%u COMM=%s exited.¥n", ctime(gettimeofday_s()), pid(), tid(), execname()); } probe end { printf("Probe ended.¥n"); } |
コンパイルを行うには、以下のように stap コマンドを実行します。
$ stap -p4 -r カーネルバージョン -m stap_example example.stp |
-p4は、カーネルモジュールのコンパイルまでを行うためのオプションです。コンパイルまでであれば、root以外のユーザで実行することも可能です。
-r の次には、情報取得を行う環境で使用しているカーネルのバージョンを指定します。
-m の次には、生成されるカーネルモジュールのモジュール名を指定します。
モジュール名として有効であれば好きな名前を指定することができますが、SystemTapで使用するカーネルモジュールであることが判りやすいようにするために、stap_ で始まる名前を指定することをお勧めします。コンパイルに成功した場合、 -m オプションで指定したモジュール名に .ko を追加したファイル名を持つカーネルモジュールが出力されます。
以下に、カーネル 2.6.32-431.11.2.el6.x86_64 向けにコンパイルする場合の例を示します。
スクリプトの内容によっては、他にもオプションを指定する場合があります。
$ stap -p4 -r 2.6.32-431.11.2.el6.x86_64 -m stap_example example.stp stap_example.ko |
コンパイルを行う環境と情報取得を行う環境とが異なる場合は、コンパイルにより生成されたカーネルモジュール(上記の例では stap_example.ko )を、情報取得を行う環境にコピーしてください。
ヒント
stapコマンドを実行している環境で使用しているカーネルのバージョンと情報取得を行う環境で使用しているカーネルのバージョンとが同じである場合には、stapコマンド実行時の「-r カーネルバージョン」の部分を省略することができます。
systemtap-1.1-3.el5 以降であれば、stapコマンドを実行している環境で使用しているカーネルのアーキテクチャと情報取得を行う環境で使用しているカーネルのアーキテクチャとが異なる場合に、stapコマンド実行時に-aオプションでアーキテクチャ名(uname -iの実行結果)を指定することができます。
3. SystemTap スクリプトの実行
root ユーザとして、カーネルモジュールのパス名を指定して staprun コマンドを実行します。
# staprun カーネルモジュールのパス名 |
以下に、実行結果例を示します。
[root@localhost ‾]# staprun stap_example.ko Probe started. Wed Apr 23 03:50:01 2014 PID=2486 TID=2486 COMM=sadc exited. Wed Apr 23 03:50:01 2014 PID=2485 TID=2485 COMM=crond exited. Wed Apr 23 03:50:06 2014 PID=1875 TID=1875 COMM=sleep exited. Wed Apr 23 03:50:06 2014 PID=2488 TID=2488 COMM=awk exited. Wed Apr 23 03:50:06 2014 PID=2487 TID=2487 COMM=ksmtuned exited. Wed Apr 23 03:50:06 2014 PID=2491 TID=2491 COMM=pgrep exited. |
staprunプロセスは、 Ctrl-C で終了させることができます。
SystemTapには安全装置が埋め込まれているため、安全装置による保護が働いたり、処理できない量のイベントが発生したりすることにより、 staprunプロセスが自動的に終了してしまう場合もあります。もし、収集したい情報や捕捉したい事象が発生するよりも前にstaprunプロセスが終了してしまう場合には、SystemTapスクリプトの見直しやコンパイルオプションの変更が必要になります。
ヒント
コンパイルを行う環境と情報取得を行う環境とが同じである場合には、stapコマンドの実行時に、-p4オプションを省略することにより、自動的にstaprunコマンドの実行まで行うことができます。
# stap example.stp |
staprun コマンドの標準出力の内容をファイルに保存したい場合は、-oオプションに出力先ファイル名を指定します。
# staprun -o 出力先ファイル名 カーネルモジュールのパス名 |
参考情報
SystemTapのサンプルプログラムが以下の場所にあります。SystemTapを使ってどのようなことができるのかを知るための参考としてください。
これらのサンプルをコンパイルするには、お使いのRHELバージョンに同梱されているものよりも新しいバージョンのsystemtap関連パッケージのインストールが必要になったり、実行できたとしても期待通りの結果が得られない可能性があることをご了承の上、自己責任にてご利用ください。
Comments