Translated message

A translation of this page exists in English.

SystemTap とは何ですか? どのように使用しますか?

Solution Verified - Updated -

Issue

対象リリース: Red Hat Enterprise Linux 4 Update 2 以降

SystemTap は、実行している Linux カーネルで簡易情報を取得できるようにする革新的なツールです。SystemTap は、パフォーマンスまたは機能 (バグ) の問題に関する情報を取得するために使用します。開発者およびシステム管理者は SystemTap を使用すると、インストール機能を備えたカーネルなどのパッケージを作成しなくても、問題をデバッグして、プロファイルおよびパフォーマンスデータを取得することができます。

要するに、SystemTap は、情報を収集するのに必要な機能 (コマンドラインインターフェイスおよびスクリプト言語) を提供します。SystemTap が実際に実行するジョブは、特定の目的に合わせてお客様が作成したスクリプトに依存しています。現在は、一般的に利用できる SystemTap のサンプルスクリプトがたくさんあります。その結果、お客様が独自に開発できない場合は、これらのスクリプトの数はより多くなります。

SystemTap の操作は非常に簡単です。stap コマンドを使用すると、SystemTap ファイルの名前 (プローブ) を引数として取得します。追加で渡されるコマンドラインの引数は、プローブによって異なります。SystemTap はプローブを C に翻訳し、C プログラムをコンパイルします。したがって、結果のカーネルモジュールを実行カーネルに挿入し、スクリプトに定義したprobe 関数を実行します。出力結果をコンソールに表示するか、ファイルにリダイレクトすることができます。

要件:

SystemTap は、C コードからスクリプトをコンパイルして、カーネル計測のプローブを起動するため、機能するにはいくつかのパッケージが必要になります。systemtap パッケージのほかに、以下のパッケージもインストールする必要があります。

  • 実行しているカーネルの kernel-devel

  • 実行しているカーネルの kernel-debuginfo

  • 実行しているカーネルの kernel-debuginfo-common

  • gcc

  • systemtap

たとえば、2.6.32-71.18.2.el6.x86_64 カーネルの場合は、以下が必要になります。

kernel-debuginfo-2.6.32-71.18.2.el6.x86_64
kernel-debuginfo-common-x86_64-2.6.32-71.18.2.el6.x86_64
kernel-devel-2.6.32-71.18.2.el6.x86_64

また、gcc および systemtap パッケージも必要になります。

gcc および kernel-devel パッケージは Red Hat Network で利用でき、up2date または yum を使用してインストールすることができます。Red Hat Enterprise Linux (RHEL) 4 の場合は、up2date 経由で kernel-debuginfo パッケージを利用することはできず、Red Hat Network または ftp://ftp.redhat.com/pub/redhat/linux/updates/enterprise/4{AS,WS,ES,Desktop}/en/os/Debuginfo/ で利用可能な ISO イメージからインストールする必要があります。RHEL 5 の場合は、kernel-debuginfo および kernel-debuginfo-common パッケージを ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/ からダウンロードすることができます。RHEL 6 の場合は、RHN yum ツールを使用してダウンロードすることができます。

注意: RHEL4 には、kernel-debuginfo-common パッケージがありません。

以下は、サンプルスクリプトになります。

    #!/usr/bin/env stap

    # Using statistics and maps to examine kernel memory allocations

    global kmalloc

    probe kernel.function("__kmalloc") {
            kmalloc[execname()] <<< $size
    }

    # Exit after 10 seconds
    probe timer.ms(10000) { exit () }

    probe end {
            foreach ([name] in kmalloc) {
                    printf("Allocations for %s\\n", name)
                    printf("Count:   %d allocations\\n", @count(kmalloc[name]))
                    printf("Sum:     %d Kbytes\\n", @sum(kmalloc[name])/1000)
                    printf("Average:%d bytes\\n", @avg(kmalloc[name]))
                    printf("Min:     %d bytes\\n", @min(kmalloc[name]))
                    printf("Max:     %d bytes\\n", @max(kmalloc[name]))
                    print("\\nAllocations by size in bytes\\n")
                    print(@hist_log(kmalloc[name]))
                    printf("-------------------------------------------------------\\n\\n");
            }
    }

SystemTap プロジェクトの wiki ページから取得したこのスクリプトは、システムのカーネルメモリー割り当ての情報を出力するために使用することができます。このスクリプトは以下のように呼び出します。

    #stap kmalloc2.stp

stap コマンド内でモジュールのコンパイルまたはロード時の問題については、 "-vv" パラメータを追加して、より詳細な結果を表示します。

SystemTap は、次にプローブを C に翻訳し、C プログラムをコンパイルし、実行しているカーネルにプローブを挿入します。省略されてる出力結果は以下のようになります。

    -------------------------------------------------------

    Allocations for httpd
    Count:   10 allocations
    Sum:     0 Kbytes
    Average:0 bytes
    Min:     0 bytes
    Max:     0 bytes

    Allocations by size in bytes
    value |-------------------------------------------------- count
        0 |@@@@@@@@@@                                         10
        1 |                                                    0
        2 |                                                    0

    -------------------------------------------------------

    Allocations for sendmail
    Count:   2 allocations
    Sum:     0 Kbytes
    Average:24 bytes
    Min:     24 bytes
    Max:     24 bytes

    Allocations by size in bytes
    value |-------------------------------------------------- count
        4 |                                                   0
        8 |                                                   0
       16 |@@                                                 2
       32 |                                                   0
       64 |                                                   0

    -------------------------------------------------------

これは、SystemTap が提供するごく一部の機能だけを使用する簡単なサンプルです。システム管理者がこの情報を使用すると、実行しているシステムのカーネルメモリー割り当ての理解を深め、カーネルの調整パラメータを徐々に調整することができます。アプリケーション開発者は、どのアプリケーションがカーネルメモリー割り当てを受け取るか、そしてどのパラメータがより深いアプリケーション分析の出発点として使用できるかについて、この情報を使用することができます。

SystemTap の詳細については、以下のリンクを参照してください。

SystemTap プロジェクトの Wiki ページ:http://sourceware.org/systemtap/wiki/HomePage .

SystemTap プロジェクトのホームページ: http://sourceware.org/systemtap/

SystemTap の Red Hat Magazine 概要: http://www.redhat.com/magazine/011sep05/features/systemtap/

Subscriber exclusive content

A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.

Current Customers and Partners

Log in for full access

Log In

New to Red Hat?

Learn more about Red Hat subscriptions

Using a Red Hat product through a public cloud?

How to access this content