LinuxCon Japan 2013 Preview

第4回 Linuxイベントトレース最前線

この記事を読むのに必要な時間:およそ 4 分

性能問題分析や障害解析に役立つのがトレースツールです。Linux向けにはこれまでにSystemTap,LTTngなどさまざまなものが開発されてきました。そのうちの1つであるftraceは,Linuxカーネルが標準でサポートする,低負荷で手軽に使えるトレース機能です。元々はSteven Rostedt氏らがRTカーネルの性能解析向けに開発したものですが,カーネル2.6.27に採用されて以後,2.6.30ではイベントトレース機能やバイナリ出力機能をサポート,その後もさまざまな改善・拡張が続けられてきました。そしてここ最近,大幅な機能拡張が行われていますので,今回はその新機能について紹介します。また,仮想化環境向けのトレース強化も行われていますので,こちらも併せて紹介します。

ftrace最新動向

スナップショット

ftraceの利用方法の1つとして,フライトレコーダとして使うことがあります。トレースを常時メモリ上のリングバッファに記録し続け,もしカーネルがクラッシュしたらクラッシュダンプの中からトレースデータを回収するのです。回収したトレースデータにはクラッシュ直前の動作履歴が残っているわけですから,カーネルクラッシュに至る原因を追究するのに非常に役立ちます。

カーネルが継続動作できない障害が発生した場合はトレースも自動的に止まるので,リングバッファから障害の起きた時点のトレースデータを回収できます。しかしカーネルが継続動作できる障害,たとえば性能低下やアプリケーションのエラーの場合はどうでしょうか? トレース機能は新しいデータをリングバッファに書くとき,古いデータから順に上書きしていきます。そのためトレースデータの回収が遅れると,問題発生時の情報が上書きされてなくなってしまうのです。

だったら問題発生時にトレースを一時停止すれば良いじゃないか,と思うでしょう。しかしそうすると今度は,一時停止している間に別の重大障害が発生した場合,その直前のトレース情報が取れなくなり,障害原因の追究が難しくなります。

この問題を解決する機能として,ftraceのスナップショット機能がHiraku Toyooka氏により提案されました。スナップショット機能を使うと,トレースを止めることなく,ある瞬間のリングバッファの内容を回収することができます。幸いにもftraceにはレイテンシトレース用の機能として,現在使用中のバッファと予備のバッファをスワップする仕組みが備わっているので,それをユーザ空間からdebugfs経由で使えるようにするだけで実現できました。こちらの機能はすでにLinusツリーにマージされており,カーネル3.9から利用可能になる見込みです。

スナップショットを取得するには,以下の例のようにsnapshotファイルに1を書き込むだけで済みます。取得したスナップショットは通常のトレースデータと同様にcatコマンドで見ることができます。

# echo 1 > snapshot
# cat snapshot

functionトリガー

functionトリガーとはftraceがサポートする機能の1つで,特定の関数が呼ばれたことを契機に,指定したアクションを実行する機能です。以前は,トレース全体をON/OFFするというアクションしかサポートしていませんでした。しかし最近Steven Rostedt氏が新たに,

  • ① (上で述べた)スナップショットを取る
  • ② スタックトレースを取る
  • ③ 特定のイベントの記録をON/OFFする

というアクションを追加しました。さらに,内部で指定した関数にヒットした回数をカウントすることで,アクションを実行する回数に上限を設けることもできます。

これらの機能追加により,高度なトレースが可能になります。たとえばデバッグを行っている時に,本来呼ばれるはずのないカーネル関数が呼ばれていることが判明したとしましょう。②のアクションを使うと,それがどのパスからで呼ばれているのかを容易に解明できます。これらの新しいアクションは3.10でのマージに向けて作業が進められています。

具体的な使い方を紹介しましょう。たとえば,カーネル関数であるvfs_read()が呼ばれた時にスナップショットを最大で1回だけ取得したい,という場合には下記のようにします。

# echo 'vfs_read:snapshot:1' > set_ftrace_filter

目的単位のトレースが可能なマルチバッファ機能

ftraceはカーネル2.6.30からイベントトレース機能をサポートしています。この機能はカーネルの関数内にあらかじめ定義されているトレースポイントにヒットしたとき,所定の情報をイベントとしてリングバッファに記録するというものです。

今までftraceは1つのリングバッファしか扱うことができないために,次のような問題がありました。もし大量に発生するイベントAと滅多に発生しない重要なイベントBの両方をトレースしようとした場合,リングバッファのサイズは有限であるため,重要なイベントBの記録が大量のイベントAによって流されてしまうのです。

この問題に対処するため,Steven Rostedt氏はマルチバッファ機能をLKMLに提案しました(2013年2月)。この機能を利用すると,複数のリングバッファのインスタンスを作成することができ,それぞれについてどのイベントのトレース有効にするか,どうオプションを設定するか,など個別にセットアップすることができます。もちろんトレースデータの回収もインスタンスごとに行うことが可能です。このマルチバッファ機能はカーネル3.10で採用される見込みです。

また,ftraceのトレースデータ収集ツールであるtrace-cmdはv3.0からマルチバッファ機能に対応する予定であり,開発者のSteven Rostedt氏が公開しているリポジトリから試験的に利用可能です。

たとえば,lsコマンドを実行しているときのトレースを,スケジューリング関係のイベント(-e sched)とタイマ関係のイベント(-e timer)を別々に取りたい場合は以下のようにします。

# trace-cmd record -e sched -B timer -e timer ls

-B〈インスタンス名〉オプションを指定すると,一時的に〈インスタンス名〉で指定したインスタンスを作成し,以降に指定されたイベントをそのインスタンスのリングバッファに記録するようにします。この例では,timer関連のイベントはtimerリングバッファに記録され,一方スケジューラ関連のイベントはデフォルトのリングバッファに記録されます。

著者プロフィール

豊岡拓(とよおかひらく)

株式会社日立製作所 横浜研究所 Linux Technology Center所属。サーバや組み込み等のリアルタイムシステムや仮想化システムの研究開発に従事。Linuxカーネルでは,トレース機能(ftrace)の強化などで貢献している。


湯前慶大(ゆのまえよしひろ)

株式会社日立製作所 横浜研究所 Linux Technology Center所属。Linuxカーネルのトレース機能を開発・改造し,ミッションクリティカルなシステムの高信頼化・高品質化の研究開発に従事。


塚田英一(つかたえいいち)

株式会社日立製作所 横浜研究所 Linux Technology Center所属。仮想化環境(Qemu/KVM)でのリアルタイム性および信頼性向上の研究開発に従事。


河合英宏(かわいひでひろ)

株式会社日立製作所 横浜研究所 Linux Technology Center所属。クラッシュダンプツールLTDやトレース機能の開発など,主にRAS機能強化に関する研究開発に従事。過去にはExt3ファイルシステムの信頼性強化なども行っている。

コメント

コメントの記入