組み込み Linux - 障害解析 事例紹介 LL-rescue


PRODUCTS&SERVICES
Products
Services
LL-rescue 解析事例のご紹介「 Linuxカーネルのパフォーマンス (性能) 解析 」

組込みLinuxのカーネル開発において、ポーティングが完了しターゲットボード上でLinuxカーネルが動き出すと、興味の対象は障害や性能 (ここでは以下「パフォーマンス」と呼 ぶことにします) へと移っていきます。障害やパフォーマンスについて、何か「気になる現象」が見られたら、どのように解析していくかが、ここでご紹介するポイントです。

ここではLiFA (Lineo Footmark Analyzer) を活用した解析事例を紹介します。



  パフォーマンス解析のアウトライン

  パフォーマンス解析の実際

  補足


  パフォーマンス解析のアウトライン

ここでは、パフォーマンス解析の実際について、イメージが湧きやすいように、「性能的に気になる現象」が解決されるまでを、具体的にみていきましょう。

  気になる現象

他のプロセスや複数ドライブアクセス (負荷) による、パフォーマンス低下する現象の発生。1台の USB メモリやハードディスクドライブのアクセスに比べ、複数ドライブのアクセスの場合や、複数プロセスの並行稼動などによりパフォーマンス低下を感じます。

  どのようにパフォーマンス解析するのか-相対的比較を行なうアイディア

「負荷のない時 (=性能が気にならない時) 」をリファレンスとし、「負荷を加えた時 (=性能が気になるとき) 」との相対的比較を行なうアイディアを使ってみましょう。つまり「気になる現象」度合いを、「気にならなかったとき」と比較しデータで明確に示せばよいわ けです。

さて「データで明確に」どう示せばよいでしょうか。LiFAのベース、すなわちトレーサのエンジンであるカーネルトレーサ LKSTは、膨大なトレースデータが取得されます。その中から、現象の特徴を示すうえで重要な部分を、どのように抽出、あるいは可視化したらよいかが、解 析の大きな鍵となります。

そこでまず、トレースデータの種別ごとに頻度を調べ、「負荷のない時」と「負荷を加えた時」それぞれの特性の違いを比較します。大きな違いが現れた頻度に着目し、より詳細な時間分布を調べます。このようなデータ解析を繰り返し、原因を推定していきます。

つまり全体の流れとして、まず頻度分布などによる大まかな「絞り込み」と、時間分布などによる詳細解析を繰り返し、原因を推定していきます。

LiFAのプロ セス遷移 (Context Series) グラフを使って、扱う現象を一通り説明してみましょう。トレースデータとして取得されたプロセス及びスレッドの状態 (RunningやReady, Sleep等) を色分けした折れ線グラフで表示されるため、Linuxカーネル内のCPUリソースの実行状況が一目で分かります。

次の図はgrowisofsコマンドでブロックデバイスに書き込んでいる実行中のグラフです。

図 1 ブロックデバイスへの書き込み時のプロセス遷移の観察 (単独ドライブの場合)

次の図は2つのブロックデバイスへの書き込みの場合です。2つのブロックデバイスそれぞれgrowisofsコマンドを実行すると、書き込みが極端に遅くなってしまいました。

図 2 複数ドライブへの同時書き込みでアクセスが極端に遅くなったときのプロセス遷移

図 2から、問題点つまり書き込みの遅さは読み取れるでしょうか。そのために、まず正常な場合である図 1を観察することにします。図 1の(1)の丸四角で囲ったプロセス "1013" と、それが生成したと思われる "1015" (おそらくスレッド) が定期的に "Running" (青い折れ線が "Running" となります) となります。また(2)で囲った部分から、CPUのidle状態を示すプロセス "0000" とリソースを分配し実行されていることがわかります。

ところが図 2の(3)では、書き込みのプロセスである "1013" と "1071" との間で、プロセス切り替えばかり繰り返されているように見えます。図 1の(2)で見られるようなパターンは見られず、プロセス切り替えでCPU資源を使ってしまい、肝心のブロックデバイス書き込みがされていないように見え ます。

後述するとおり、この問題は、ブロックデバイスのIOスケジューラの設定を変更しLinuxカーネルを稼動することにより解 決します。図 3がその場合のグラフです。同図の(4)、(5)が各々プロセス "948", "1054" で書き込み実行している部分となり、図 1の(2)と同様な遷移のパターンになっていることが観察されます。

図 3 カーネル設定の変更 (noop -> cfq) でアクセス速度が改善されたときのプロセス遷移の観察

以下では「性能が気になる時」と「気にならない時」のデータを、具体的に解析する手順を紹介していきましょう。

  パフォーマンス解析の実際

  測定系とデータ収集、解析系

さて、アプローチの実際をみていきます。

測定系は、ターゲットボード (VIA-ME6000)、ブロックデバイス (IDE-HDD, IDE-CD/DVD, USBメモリ等をターゲットボードに接続)、負荷となるシェルスクリプト (ブロックデバイスによる書き込み遅延を考慮)、ツール (LKSTおよびLiFA Ver.2.0.0) からなります。末尾に詳細を紹介します。LKSTはLinuxカーネルの内部変数をトレースするために使用します。

LKSTによって行なったデータ収集の概要は以下のとおりです。

  • トレースデータの種別ごとの頻度を調べるため、LKSTの主要なフックポイント*1 をトレースします。特に、ブロックデバイスのふるまいを詳しく調査するため、BIO*2 関連とsyscall (read/write) のフックポイントが含まれるようにします*3
  • LKSTLAに装備されるアナライザを用いデータ解析を行います。これらのアナライザは、フックポイントを通過した時刻や回数などを集計します*4
  • プロセス遷移 (ContextSeries) のフックポイントをトレースします*5 。これによりトレースされたデータは、後ほど各プロセスの切り替え状況をLiFAで可視化し観察するために使用します。

  • *1. LKSTのトレースデータを取得するカーネル内に組み込まれた箇所を「フックポイント」と呼びます。
  • *2. ブロックデバイスのI/O関連をBIOと呼びます。
  • *3. またここでのフックポイントの具体的な場所はdrivers/block/ll_rw_blk.c, fs/bio.c などの内部となります。
  • *4. 具体的にはbiotime, elvtime, syscall, buffer の各アナライザを使用します。これらの、LKSTやLKSTLA (lkstlogtools) の技術的な詳細はコミュニティのホームページに掲載されるマニュアル (http://sourceforge.jp/projects/lkst/downloads/16850/lkstlogtools-120.pdf) や解説記事 (http://www.ipa.go.jp/software/open/forum/development/download/lkstprospec-0316.pdf) が参考に なると思います。
  • *5. 具体的にはkernel/sched.c など、スケジューリング関連のカーネル関数におけるフックポイントとなります

  LKSTLAによる結果の比較

トレースデータの種別ごとの頻度解析から、フックポイントごとの頻度分布に顕著な違いが見られることがわかってきました。図 4の横軸にはLKSTの各フックポイントを、縦軸は一定のトレース区間でのフックポイントの通過回数を示しています。LKSTのフックポイントは Linuxカーネルのいたる箇所に存在するため、この頻度分布でトレース区間におけるLinuxカーネル全体のふるまいを大まかに知ることができます。

図 4 LKSTイベントごとの頻度分布の違い

図 5の横軸はカーネルの実行時間、縦軸は write システムコール処理*6 に 掛かった時間の長さを、カーネル内のsyscallの入口と出口で計測した特性です。この特性も、リファレンスの左図 (1台のドライブの場合) に比べ、右図 (複数ドライブの場合) は大きく異なります。左の場合は全体的に縦軸の高さがほぼ安定しているのに比べ、右の場合は極端に時間が掛かる場合があります (青い丸の部分) 。

図 5 syscall writeの時間特性の違い


  • *6. システムコールの開始と終了地点にフックポイントを設置し、時間差を計測します。

  考察と推論

データ解析の結果の考察は、次の通りまとめられます。

  • パフォーマンス低下が見られるとき、プロセス遷移が異常に多数生じる (図 4より)
  • writeシステムコールの処理時間のばらつきも増える (図 5より)

つまり、ブロックデバイスに書き込む効率そのものの低下よりは、ブロックデバイスに書き込むスケジューリングポリシーに、最も大きな要因があるようです。

一方別の解析で、BIO処理時間を計測し、複数ドライブへのアクセス時にもBIO処理時間自体がかかることがないことが分 かっています。このことは、書き込み効率自体の低下が原因ではないことの根拠のひとつということができるでしょう。以上より原因は、無駄なプロセス切り替 えにLinuxカーネルのリソースが費やされていることに起因するものと推定されます。

  対策

ドライブのIOスケジューラ設定は、ブロックデバイスのデバイスファイルごとに変更することができます*7 。そこでIOスケジューラ設定*8 をnoopからcfqに変更して改めて測定すると、パフォーマンスが改善し、図 4、図 5の特性も1台のドライブのみアクセスする場合に近づくことが分かりました。


  • *7. (詳しくはLinuxカーネルのソースコード内のDocumentation/block/switching-sched.txtなどを参照
  • *8.末尾の「補足1」を参照ください。

  パフォーマンスの解析について

ここでは、具体的事例を挙げ、パフォーマンスを改善することができました。一般的には「Linuxカーネルの解析ソリューションのモデル」として、図 6のように表されます。

図 6 カーネル解析ソリューションのモデル

ここに挙げた各ステップが対応する、具体的事例について、まとめておきます。

  気になる現象

複数のUSBメモリやハードディスクドライブ等、ブロックドライブへのアクセスのパフォーマンス低下を取り上げました。

  現象の把握

「負荷のない時」をリファレンスとし、「負荷を加えた時」との相対的比較を行なうアイディアにもとづき、「気になる現象」が どれだけ気になるのかを、データで明確に示すことにしました。膨大なLKSTのトレースデータから、種別ごとの頻度分布の比較で大まかなふるまいを、端的 な違いが現れた頻度に対しより詳細な時間分布を調べました。解析結果に基づき、原因を推定する、つまり、「絞り込み」から原因を推定し、それに基づき詳細 解析へ、と進めていきました。

  対策

ブロックデバイスのIOスケジューラ設定を変更することにより、複数台のドライブへのアクセスも1台のドライブのみアクセスする場合に近づくことが分かりました。

LKSTはデータが膨大な分、様々な角度からデータ解 析を行なうことが可能です。例えばプロファイラ的なデータ解析より細かい、特定の処理の時間分布といった解析も可能です。したがってLKSTLAのような 頻度分布や時間分布の解析も、LiFAのプロセス遷移のグラフ表示も可能なのです。

  補足

  補足1: ブロックデバイスのIOスケジューラについて

cfqスケジューラは、ブロックデバイスへの書き込みセクタが近いもの同士をかき集めておき、なるべく一度に書き込むことで、全体の効率化を図っています。一方noopスケジューラはその措置を行なわず、書き込み要求に従う動作となります。

次にIOスケジューラ変更の手順を補足します。例えば /dev/hdaに対しスケジューラをnoopからcfqに変更する場合、make menuconfigによるカーネルコンフィグレーションで変更を行なうか、または下記を実行します。

# cat /sys/block/hda/queue/scheduler
[noop] anticipatory deadline cfq
# echo cfq > /sys/block/hda/queue/scheduler
# cat /sys/block/hda/queue/scheduler
noop anticipatory deadline [cfq]

  補足2: 測定系のシステム構成について

  • ターゲットボード:VIA ME6000 (x86)
  • Linux Kernel : 2.6.24.2
  • LKST : Ver. 2.3.2
  • ルートファイルシステム : ELITE BSP V4で生成
  • ブロックデバイス:IDE-HDD, IDE-DVD, USBメモリ
  • シグナル:ブロックデバイスに対し、ddコマンドとsyncコマンドの無限ループ

    # mount /dev/sda1 /mnt
    # while true; do \
    > dd if=/dev/zero of=/mnt/cc bs=1024000 count=20 ; \
    > sync; done

  • 測定ツール: LiFA Ver.2.0.0, lkstlaコマンド, gnuplot


お問い合わせ先
リネオソリューションズ株式会社 東京オフィス
160-0022 東京都新宿区新宿 2-16-7 新花ビル 5F
phone: 03-5367-9098 fax: 03-5367-9099
http://www.lineo.co.jp/
sales@lineo.co.jp
 
LinuxLink

Linuxを開発し製品に組み込むために必要となるソフトウェア、各種ツールそしてドキュメントが用意されており、組み込みLinux開発を始めたばかりの開発者からエキスパートまで、幅広く利用いただけます。


Warp!!Warp!!

瞬時に起動 驚きの速さ その感覚はまさに“ワープ(Warp)”斬新な高速起動ソリューション Warp!!の速さを体感ください。サポートアーキテクチャも拡充。


VzetVzet

Linuxシステムは、複数のプロセスで構成される多くのアプリケーションが動作しており、“Vzet”は、このプロセス(スレッド)の『振る舞い』を『ビジュアルに表示』することを可能にします。

Vzetは、ぷらっとオンラインからもご購入いただけます。



Timesys      Codesourcery     Mimer     Belcarra

ARM      CE Linux Forum

Copyright © 2009 Lineo Solutions, Inc. All rights reserved.