リアルタイム処理において、レイテンシのばらつきを示す「ジッター」は、性能を評価するための1つの指標である。ジッターは、下図のように一定間隔で割り込みを発生させて、割り込み処理を開始する間隔を収集することで分析できる。
今回の評価では、PC/AT互換機に標準的に搭載されているRTC(Real Time Clock)で、周期的に割り込みを発生させてジッターを測定する。LKML(Linux Kernel Mailing List)でIngo Molnar氏が紹介しているrtc_wakeup(http://www.affenbande.org/~tapas/wiki/index.php?rtc_wakeup)と呼ばれるツールを用いた手法である(http://www.ussg.iu.edu/hypermail/linux/kernel/0411.3/0043.html)。
upstreamカーネル(Linux標準カーネル)においてrtc_wakeupを実行した際の流れを下図に示す。
rtc_wakeupは、RTCが周期的に割り込みを起こすように設定した後、/dev/rtcに対してreadシステムコールを発行する。割り込みが発生するとreadシステムコールが復帰するので、そのときの時刻を計測する。これらのデータから、前回時刻との差分を計算することで処理間隔を求め、ばらつきをジッターとして評価する。
今回の評価に利用したハードウェアとシステムの構成は以下のとおり。
システム名 | バージョン | ベースカーネル | |
---|---|---|---|
upstream | 2.6.11.5 | 同左 | |
RTLinux/GPL | 3.2-rc1 | 2.4.27 | |
RTAI | 3.2-test2 | 2.6.8.1 | |
注:ディストリビューションは、Debian GNU/Linux 3.1(Sarge) |
評価では、組み込み用途のCPU性能を考慮して、極力CPUクロックを落とすこととした。
今回の測定では、RTCにより1/1024秒間隔で割り込みを発生させ、これを処理する関数が呼び出されたところでTSC(Time Stamp Counter)を読み取った。この測定値から割り込みを処理する関数が呼び出される間隔を算出し、X軸をサンプル数、Y軸を間隔としてグラフ化した。
さらに、それぞれの測定ではシステム負荷による変化にも着目した。システムに負荷を与える手段としては、hackbench(http://developer.osdl.org/craiger/hackbench/)を用いた。hackbenchは、OSDLが提供している性能測定用のツールで、主にLinuxカーネルのスケーラビリティを評価するのに利用されている。シェルから、
# hackbench 50
と実行すると、計2000個のプロセスが生成されて、パイプを用いたI/O処理を頻繁に行う。
グラフでは、hackbench実行中および非実行中に測定した2種類のデータを重ね合わせている。
upstreamカーネルでrtc_wakeupを用いた測定の結果が下のグラフである。
1/1024秒、すなわち約977μs(マイクロ秒)間隔で割り込みを処理するのだが、全体的にジッターが発生している。hackbenchでシステム負荷を加えるとジッターは増大し、特異的に大きなジッターが一定間隔で発生している。発生間隔はほぼ5000サンプル、すなわち5秒ごとであり、bdflushによるダーティページの書き出し処理によるものと推察される。
RTLinux/GPLでの測定では、PSCを用いてRTCの割り込み処理用に登録したシグナルハンドラ時刻計測を行った。その結果が下のグラフである。
upstreamカーネルに対して、ジッターは大きく軽減されている。さらに特異的なジッターも観測されなかった。
RTAIでの測定では、USIを用いてRTCの割り込みに呼び出されるユーザースレッドで時刻計測を行った。その結果が下のグラフである。
RTLinux/GPLよりも、さらにジッターが改善されている。
最後に、上記3測定から算出した数値を下表にまとめる。
グラフから視覚的に読み取れる情報が、分散、標準偏差といった値からも裏付けられている。
次回は、最新upstreamカーネルにリアルタイム機能を追加するIngo Molnar氏のrealtime-preemptパッチ(第1回の「スタンドアロン方式」)について紹介し、同様に評価する予定だ。(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.