リネオブログ

Linux システムを見える化する kernelshark の使い方 第 1 回

2022 年 11 月 07 日   Linux 技術ネタ

目次

1. はじめに

組込み Linux 開発において、以下のケースに直面することはよくあるのではないでしょうか ?

  • 優先度が高いアプリケーションが意図通り動作しているか確認したい
  • 定周期のリアルタイムプロセスが期待する周期内に実行完了しないことがあるが何が悪いのかわからない
  • 優先度逆転が発生するが原因がわからない
  • 開発したドライバの挙動がおかしい。関数経路を調査したい。

このような解析をサポートするために、Linux カーネルには ftrace というトレーサーが搭載されています。様々な情報を取り出せる反面、コマンドラインでの制御が必要なため、使用性が低く、結果ファイルがテキストであるため、可読性が悪いです。この欠点を補うために、OSS ツールとして、ftrace のユーザーインターフェース trace-cmd と結果ファイルをビジュアル表示する kernelshark が用意されています。

このブログエントリでは、組込み Linux からトレースログを取得し、kernelshark で表示する一連の流れと kernelshark の機能概要を紹介します。

本ブログは全 3 部構成となります。
第 1 回目は、kernelshark の概要とその使い方について解説します。

2. kernelshark とは

kernelshark は、ftrace のユーザーインターフェース trace-cmd のフロントエンドです。ftrace のビジュアライザと言えます。いつどのプロセスがどの CPU で実行されたか(コンテキストスイッチトレース)、いつどのイベントがどの CPU で実行されたか(イベントトレース)、いつどのカーネル関数がどの CPU で実行されたか(関数トレース)などをグラフィカルに表示できます。

kernelsharkの説明図

3. kernelshark の使い方

3.1 UI

kernelshark は、以下5つの UI から構成されます。

No. UI 概要
1 Menu ファイルのロード、kernelshark 終了を行います。
2 Graph Info Area グラフ上でマウスポインタが指している位置のタイムスタンプと、その位置にあるイベントの情報を表示します。
3 Graph Control Area グラフの拡大、縮小、マーカーの設定、グラフの表示方法を設定します。
4 Graph Window イベントの発生が時系列でプロットされたグラフが表示されます。
5 List Area イベント情報が表示されます。

以下5つの UI から構成の図

3.2 トレースログを開く

  1. メニュー File ⇒ Open をクリックします。
  2. Open File 画面でトレースログファイルを選択します。

Open File 画面でトレースログファイルを選択

3.3 グラフの見方

Graph Windowには、イベントの発生が時系列でプロットされたグラフが表示されます。
縦軸が表示項目です。CPU とタスクが対象です。後述の Plots メニューで表示する CPU とタスクを設定可能です。横軸は時間です。

イベントの発生が時系列でプロットされたグラフ

3.3.1 マウス操作

グラフ上にマウスを置くと、マウスポインタが指している位置のタイムスタンプと、その位置にあるイベントの情報が GraphInfoArea に表示されます(マウスポインタがグラフ外にある場合は、最後に指していた位置の情報を表示)。

マウスポインタが指している位置のタイムスタンプと、その位置にあるイベントの情報

また、グラフ上のイベントを左ダブルクリックすると、そのイベントにマーカーが付きます。
さらに、グラフ上をドラッグして領域選択すると、その範囲を拡大表示できます。

3.3.2 イベントの見え方
  • 色付きの太線は、タスクが実行中であることを示しています。
  • 突き出ている縦線は、個々のイベントを示しています。
  • 色付きの太線がある区間は、CPU で実行中を表します。一方、色付きの太線が無い区間は、CPU で実行されていないことを表します。

イベントの見え方

3.4 グラフを拡大縮小する

GraphControlArea の以下ボタン操作でグラフを拡大縮小します。また、上述の通り、グラフ上をドラッグして領域選択すると、その範囲を拡大表示できます。

ボタン 説明
左に移動
拡大
縮小
右に移動
グラフを最大まで拡大
(Graph Window 上でのドラッグでも拡大可能)
グラフを全体が映るまで縮小

3.5 イベント間の時間を計測する

GraphControlArea のボタンとマウス操作で 2 つの特定イベントにマーカーをつけ、その間の時間を計測することができます。例えば、A ⇒ B の順でマーカーをつけ、AB 間の時間を計測する手順は以下になります。

  1. Marker A ボタンの上で左クリックします。緑色に変わります。

    Marker A ボタン

  2. List Area の Graph followsにチェックを入れて、マーカーA をつけたいイベントログをクリックします。該当イベントが緑色で表示されます。また、Graph Window の対応箇所に緑色のカーソル線が表示されます。

    該当イベントが緑色で表示

  3. Marker B ボタンの上で左クリックします。青緑色に変わります。

    Marker B ボタン

  4. List Area でマーカー B をつけたいイベントログをクリックします。該当イベントが青緑色で表示されます。また、Graph Window の対応箇所に緑色のカーソル線が表示され、A,B Delta 欄にマーカー A, B 間の時間差が表示されます。

    該当イベントが緑色で表示1

    該当イベントが緑色で表示2

  5. Marker A または B ボタンを右クリックするとマーカーが解除されます。

3.6 表示する CPU、タスクを設定する

Plot メニューでグラフに表示する CPU とタスクを設定することができます。各設定は、組み合わせて使用することが可能です。

3.6.1 特定CPUのみを表示する
  1. メニュー Plot ⇒ CPU をクリックします。
  2. CPUs 画面でグラフ表示する CPU にのみチェックを入れ、Apply を押下します。

    CPUs 画面でグラフ表示する CPU にのみチェック

    例えば、CPU0 のみにチェックを入れると、CPU0 のみが表示されます。List Area も連動します。

    CPU0 のみが表示

3.6.2 特定タスクのみを表示する
  1. メニュー Plot ⇒ Tasks をクリックします。
  2. Tasks 画面でグラフ表示するタスクのみチェックを入れ、Apply を押下します。

    グラフ表示するタスクのみチェック

    例えば、3.8.1 の例の設定をした状態でidleタスクにチェックを入れると、CPU0 とidleタスクが表示されます。List Area も連動します。

    CPU0 とidleタスクが表示

3.7 表示するイベントを設定する(フィルタ)

Filter メニューでグラフに表示するイベントを設定することができます。各フィルタは、組み合わせて使用することが可能です。特定条件を指定してイベント抽出する Advanced Filtering 機能については、公式ドキュメントを参照ください。

3.7.1 特定イベントのみ表示する
  1. メニュー Filter ⇒ Show events をクリックします。
  2. Events 画面で表示するイベントにのみチェックを入れ、Apply を押下します。

    Events 画面で表示するイベントにのみチェック

3.7.2 特定タスクに関係するイベントのみを表示する
  1. メニュー Filter ⇒ Show tasks をクリックします。
  2. Tasks 画面で表示するタスクに関するイベントにのみチェックを入れ、Apply を押下します。

    Tasks 画面で表示するタスクに関するイベントにのみチェック

    例えば、<idle> のみにチェックを入れると、idle タスクで発生したイベントのみが表示されます。List Area も連動します。

    idle タスクで発生したイベントのみが表示

3.7.3 特定CPU にて発生したイベントのみを表示する
  1. メニュー Filter ⇒ Show CPUs をクリックします。
  2. CPUs 画面で表示する CPU に関するイベントにのみチェックを入れ、Apply を押下します。

    CPUs 画面で表示する CPU に関するイベントにのみチェック

    例えば、CPU0 のみにチェックを入れると、CPU0 で発生したイベントのみが表示されます。List Area も連動します。

    CPU0 で発生したイベントのみが表示

3.8 イベントを確認する、検索する

List Area ではイベントの確認、イベントとグラフの連動、イベントの検索を行うことができます。

3.8.1 イベントを確認する

イベント一覧からイベント情報を確認できます。

イベント一覧からイベント情報

# イベントの通し番号
CPU イベントが発生した CPU 番号
Time Stamp イベントのタイムスタンプ
Task イベントが発生したときに実行されていたプロセスの名前
PID イベントが発生したときに実行されていたタスクの PID
Latency

4 つのフィールドに分けられているが、カーネルバージョンによって異なる可能性があるので注意

詳しくは Latency trace format などを参照

第 1 フィールド
  • 割り込みが無効の場合:"d"
  • 割り込みが有効の場合:"."
第 2 フィールド
  • TIF_NEED_RESCHED と PREEMPT_NEED_RESCHED の両方がセットの場合:"N"
  • TIF_NEED_RESCHED のみセットの場合:"n"
  • PREEMPT_NEED_RESCHED のみセットされていない場合:"p"
  • どちらもセットされていない場合:"."
第 3 フィールド
  • Hardirq 内でNMIが発生した場合:"Z"
  • NMI の場合:"z"
  • softirq 内でhard irqが発生した場合:"H"
  • hard irq 中の場合:"h"
  • soft irq 中の場合:"s"
  • それ以外の通常のコンテキストの場合:"."
第 4 フィールド
  • プリエンプションカウンターのインデックス。0 ならば"."
Event イベントの名前
Info イベントに付随する情報
  • トレースログ取得の際に funcgraph を使用した場合、C 言語風の呼び出しツリー
  • syscall entry と exit イベントの場合、引数や戻り値
3.8.2 イベントを検索する

以下の検索ボックスを使用します。

検索ボックス

指定の条件でイベントを検索できます。検索は以下の流れで実行します。

  1. 検索対象の列を Column から選択します。
  2. contains (含む)、 full match(完全一致)、 does not have (含まない)から検索条件を1つ選択します。
  3. 検索文字列をボックスに入力します。
  4. 後方検索する場合は Next、前方検索する場合は Prev を押下します。
3.8.3 イベントとグラフを連動する

Graph follows のチェックを使用します。

Graph follows のチェックを入れている場合、List Area 上でイベントをクリックすると、アクティブなマーカーがそのイベントに移動します。さらに、Graph Window もその位置に追従します。 選択したイベントは、Graph Window に黄色い四角(小さいので少し見づらい)で表示されます。

Graph Window に黄色い四角で表示

参考文献

次回予告

第 2 回目は、kernelshark で表示するトレースログを ftrace で取得する手法について解説します。

組込みLinuxセキュリティ基礎講座
Vigiles サポート
Yocto Project よもやま話
Yocto よもやま話 第 14 回 「Yocto 4.3 Nanbield リリース」
Yocto よもやま話 第 14 回 「Yocto 4.3 Nanbield リリース」

2024 年 03 月 26 日 Yocto Project よもやま話

Yocto よもやま話 第 13 回 「Yocto Project の最新動向 2023 夏」
Yocto よもやま話 第 13 回 「Yocto Project の最新動向 2023 夏」

2023 年 07 月 25 日 Yocto Project よもやま話

Yocto よもやま話 第 12 回 「Yocto Project 始めます その 2」
Yocto よもやま話 第 12 回 「Yocto Project 始めます その 2」

2023 年 06 月 20 日 Yocto Project よもやま話

Linux 技術ネタ
RISC-Vについて学ぶ-後編
RISC-Vについて学ぶ-後編

2024 年 01 月 10 日 Linux 技術ネタ

RISC-Vについて学ぶ-前編
RISC-Vについて学ぶ-前編

2023 年 12 月 12 日 Linux 技術ネタ

イベントレポート
EdgeTech+ West 2024 出展レポート
EdgeTech+ West 2024 出展レポート

2024 年 07 月 26 日 イベントレポート

Advanced Technology Forum 2024 Summer 参加レポート
Advanced Technology Forum 2024 Summer 参加レポート

2024 年 07 月 09 日 イベントレポート

リクルート
新卒採用、絶賛募集中!
新卒採用、絶賛募集中!

2023 年 05 月 30 日 リクルート

国立大学オンライン研修レポート 2022
国立大学オンライン研修レポート 2022

2022 年 09 月 27 日 リクルート

信州リネオ便り
リネオに雪が積もりました
リネオに雪が積もりました

2024 年 11 月 29 日 信州リネオ便り

社内BBQを開催しました!
社内BBQを開催しました!

2024 年 09 月 25 日 信州リネオ便り

夏季休業明け、スイカを頂きました!
夏季休業明け、スイカを頂きました!

2024 年 08 月 20 日 信州リネオ便り

ソリューション統括部
シリコンバレー探検記 2019 ~番外編~
シリコンバレー探検記 2019 ~番外編~

2019 年 12 月 10 日 ソリューション統括部

シリコンバレー探検記 2019 ~後編~
シリコンバレー探検記 2019 ~後編~

2019 年 12 月 10 日 ソリューション統括部

シリコンバレー探検記 2019 ~前編~
シリコンバレー探検記 2019 ~前編~

2019 年 12 月 10 日 ソリューション統括部

マーケティング統括部
大成功決起大会!!(ET2019)
大成功決起大会!!(ET2019)

2019 年 12 月 13 日 マーケティング統括部

ESEC 2019 決起大会
ESEC 2019 決起大会

2019 年 04 月 25 日 マーケティング統括部

シリコンバレー探検記 その 2
シリコンバレー探検記 その 2

2018 年 12 月 18 日 マーケティング統括部