RealTime LinuxR: RedHawk アプローチ

 

1. 序文

 コンカレントコンピュータ株式会社は、40年以上もの間、独自BusからMultibusVMEbus,PCIbusへ様々な形状のリアルタイムシステムを販売してきました。

 これらの過去のリアルタイムシステムの多くは、独自のオペレーティングシステムでしたが、2000年に完全なフリーのオープンソースであるGNG/LinuxをベースにしたリアルタイムプロダクトであるRedHawkに軸足を移しました。

 RedHawk Linuxの重要な目標は、開発費を最小にするために、オープンソース・ソフトウェアのバイナリコードをリアルタイムシステムで、そのまま動作させることです。

 RedHawk Linuxは、Linuxコミュニティで開発されたカーネルのドラスティックな変更をアプリケーションと分離するソフトウェア・レイヤー技術で、継続的にLinuxカーネルの更新を可能にしています。

 

2. 概要

 RedHawk Linux は汎用 Linux ディストリビューションではありません。

 プロダクトコアには、どんなディストリビューションの基でも動作可能なリアルタイムLinuxカーネルがあります。

 

 説明: 説明: 説明: image001.jpg

 

 

 

 

 

 

 

 RedHawkカーネルは、kernel.orgからリリースされる安定したピュアカーネルをベースにして、ローカルに開発されたオープンソースパッチの拡張を行っています。

 そして、コンカレント社は、オープンソース・コミュニティの最新リリースの修正と改良を取り入れるために、しばしばLinuxカーネルベースを更新しています。

 

 説明: 説明: 説明: RedHawk 1.4 based on kernel.org 2.4.21
RedHawk 2.1 based on kernel.org 2.6.3
RedHawk 2.2 based on kernel.org 2.6.7
RedHawk 2.1 based on kernel.org 2.6.3
RedHawk 2.2 based on kernel.org 2.6.7
RedHawk 2.3 based on kernel.org 2.6.9
この間欠番
RedHawk 4.1 based on kernel.org 2.6.15
RedHawk 4.2 based on kernel.org 2.6.18
RedHawk 5.1 based on kernel.org 2.6.23
RedHawk 5.2 based on kernel.org 2.6.26
RedHawk 5.3 欠番
RedHawk 5.4 based on kernel.org 2.6.31
RedHawk 6.0 based on kernel.org 2.6.36

RedHawk Linux には、カーネルのリアルタイム機能へのアクセスライブラリ、ヘッダ、ドキュメンテーションとコマンド、そしてユーザレベルパッケージのセットを含まれています。

 提供されるAPIには、POSIX XSI標準APIとコンカレントのリアルタイムソリューションを供給してきた長い歴史の間に開発された拡張APIがあります。

 これらのAPIは豊富で安定した機能とリアルタイム性を保証するインターフェースをリアルタイム・アプリケーション開発者に提供します。

 このインターフェースにより、コンカレントのカスタマの多くのアプリケーションが使用していたコンカレントの古い独自のソリューションから Linuxカーネル2.4RedHawk に移行させ、次にLinux カーネル2.6RedHawkに最小限のソースコードの変更で移行することを可能にしました。

 コンカレントのカスタマの多くは、合衆国軍によってまだ広く使われているAda言語で書かれたリアルタイム・アプリケーションを開発し、そして実行することを望んでいます。

 コンカレントの MAXAda 環境は RedHawk Linux が持つ、リアルタイム・カーネルの豊富な機能を すべてAda 開発環境に提供します。

 同様に、標準GNU CC++開発環境と、高性能フォートラン開発環境に対してもリアルタイム・カーネルの豊富な機能を提供します。

 NightStarTMツールと呼ばれるオプションセットの存在は、RedHawkの付加価値の多くを占めています。

 NightStar ツールは、RedHawk Linux に含まれているリアルタイム・エンハンスメントを行ったカーネルの長所を最大に利用した、リアルタイム・アプリケーション開発の解析ツールとデバッキングツールを提供すると共に、リアルタイムシステムをターゲットにしたシステムチューニングツールも提供します。

 NightStar ツールは、混在して記述されたC, C++, Ada FORTRANのアプリケーションプログラムをデバッグして、分析することが出来ます。

 コンカレント社では、RedHawk の価値を高めるハードウェアインテグレーション、カスタムエンジニアリングサービス、保守契約と大規模なエンドユーザドキュメンテーションサービスを行っています。

 

3.シールド(shield)

 リアルタイムプロセスのためのシステムでリアルタイムへのコンカレントのアプローチの中核に特定のCPUの留保であるプロセッサシールドの考えがあります。

 プロセッサシールドが働くためには、システムに1つ以上のCPUが無くてはなりません、そして40年の間に出荷された、ほとんどのコンカレント社のハードウェアソリューションはSMPアーキテクチャーで、しばしば洗練された NUMA システムをサポートしていました。

 マルチ・コア・プロセッサが広く利用可能である今、シールドを利用することができるプラットフォームの数は爆発的に増加しました、そしてこれは高価でないシングルプロセッサコンピュータが非常に効果的なリアルタイムソリューションになることができるようになったと言う事です。

 RedHawk カーネルは、プロセッサシールドの構成を設定し、そしてコントロールする便利なユーザレベルツールを提供します。 例えば、シールドコマンド(shield)は、IRQ割込みやローカルタイマ割込みでさえ、指定したCPUセット上のプロセスに発生するのを動的にブロックすることができます。

 専用CPU上で走っているリアルタイムプロセスは、割込みが無いために、事実上キャッシュの干渉が無く、プロセスの決定論(determinism)が劇的に改善します、そして重要なことはプロセッサの最大性能が保証されます。他のどのようなリアルタイム機構もこのレベルの決定論(determinism)を提供することはできません。

説明: 説明: 説明: image005.gif コンカレントのプロセッサシールドの実装は、比較的小さなカーネル拡張のセットから成り立ち、(Ingo Molnar氏によって開発された PREEMPT_RT パッチが提案している"sleeping spinlocks様な)カーネルのスピンロックと割込みモデルの全体的な再設計ではないと言う点が重要です。

 この低レベル-オーバーヘッド・アプローチは、PREEMPT_RT アプローチでは到底得る事が出来ない様な、ソリューションの実現性、およびシステムの安定性と複雑性に対する影響を最小限に抑えるような劇的な強化が成されています。

説明: 説明: 説明:  “sleeping spinlocks”「眠っている スピンロック」について
 “sleeping spinlocks”は、PREEMPT_RT パッチの重要な部分です。
 Linux カーネルの重要なリソースの排他制御するための通常の“spinlocks” は、資源を獲得する間の待ち時間にループする、「スピニング」によってシステムの性能を低下させてしまいます。
 また、”spinlocks”は、リソースを得た後、そのリソースを所有している間、プリエンプションと割り込みをブロックします。 
 PREEMPT_RT で提供される “sleeping spinlocks” は、ブロックする代わりに、待っている間は、「スリープします」。 したがって、“sleeping spinlocks”は、リソースを獲得した後プリエンプションあるいは割り込みをブロックしません。
 この設計は、高優先順位のユーザアプリケーションプロセスが早くサービスを受けることを可能にします。
 しかし、PREEMPT_RT のパッチは、カーネルやデバイスドライバのspinlock_irqsave() を spinlock() に変更し、すべてのドライバの動作確認をユーザが行う必要があります。
 また、割り込み処理がIRQデーモンから起動するように変更されるため、割り込み遅延を発生させ、場合によってはシステムスループットに否定的な影響を与えます、このため、RedHawtMRGは、応答速度を保証しないソフトリアルタイムOSですがRedHawkは、15μ秒以下の応答速度を保証するハードリアルタイムOSです。

 

4.ユーザプリエンプション(Preemption)制御

 RedHawk は実行プロセスがカーネルに、短い期間プリエンプションされない事を可能にするユーザスペース機構を提供しています。

 この機能は、カーネルに組み込まれた再スケジュール変数と呼ばれる、特別なメモリ位置のプロセスレジスタを持つことによって、実現されます。

 プロセスは、システムコールを行うことなく、再スケジュール変数に書くか、あるいはクリアすることによって、プリエンプションをコントロールすることができます。

 この機能は RedHawk のユーザレベルライブラリ全体で使われ、ユーザレベルスピンロックの信頼できる速い実装を提供するために使われています。

説明: 説明: 説明: image007.jpg

 

5.プリアロケート・グラフィックス・ドライバ

 RedHawk には、プロセッサ間割り込みの発生を最小化する必要から、拡張グラフィクス・ドライバが含まれています。このグラフィクス・ドライバには、オープンソースドライバとポピュラーなNVIDIAドライバのような独自ドライバの両方が含まれています。

 プロセッサ間割り込みの抑制は、主として、新しいページがグラフィクス・ドライバによってマップされるときに、TLBフラッシュの洪水が発生しないように、ブート時にグラフィクス・ページを前もって割り当てる(プリアロケーション)機構を提供することによって達成されています。

 例として、NVIDIA社のCUDA開発環境に添付されている例題プログラムが使用するメモリ量は、以下の様に10Mバイトから20Mバイトにも達するものです。

 

プログラム名

ページ数(4096バイト/ページ)

Clock                  

2586

SobelFilter          

3458

SobolQRNG        

2586

3dfd                    

2586

Mandelbrot        

3458

oceanFFT           

3714

Particles             

3458

eigenvalues        

2586

radixSort            

2586

smokeParticles   

3938

reduction      

2564

 

 これだけのメモリ量を、GPUNVIDIAグラフィックスデバイスドライバにLinuxカーネル内のバッファとして確保する様に要求します。

 この要求により、NVIDIAデバイスドライバで、カーネルメモリ割り当て関数の呼び出しが行われ、結果として、マルチコア間のキャッシュの不整合とTLBバッファのフラッシュという副作用をもたらします。

説明: 説明: 説明: image008.gif

 これらのイベントは、プロセッサ間割り込みとして処理され、オーバーヘッドとジッターとしてアプリケーションに影響を与えます。

 実際、先の'smokeParticles' をシールドを併用して、60秒の間PDL(Process Dispatch Latency)試験を行うと、プリアロケートを行わない場合は、プロセッサ間割り込みの数は4010回で、PDLの最大87μ秒でしたが、プリアロケートを行った場合では、プロセッサ間割り込みの数が3回と激減し、PDLの最大も22μ秒になって、プリアロケートのジッター抑制効果が高いことが理解できます。

 

説明: 説明: 説明: プリアロケートを行わない場合

Summary: PDL (60000 samples):     9.0,    12.0,    87.0 uS min/avg/max
PDL Histogram:
      0 .. 10   :   8902 ********
     11 .. 20   :  51078 *******************************************
     21 .. 30   :      4 *
     31 .. 40   :     11 *
     61 .. 70   :      3 *
     71 .. 80   :      1 *
     81 .. 90   :      1 *

プロセッサ間割り込み
retrigger_next_event_forced       1
do_flush_tlb_all                  4
__cpa_flush_range           3,982
cache_flush  [NVIDIA]            23

 

説明: 説明: 説明:  プリアロケートを行った場合

Summary: PDL (60000 samples):     9.0,    12.1,    22.0 uS min/avg/max
PDL Histogram:
      0 .. 10   :   9167 ********
     11 .. 20   :  50831 *******************************************
     21 .. 30   :      2 *

プロセッサ間割り込み
retrigger_next_event_forced    3

 

6.同期(Synchronization)

 RedHawk は、協調して動作するスレッドあるいはプロセス・グループ間に使われる高速な、そして効率的な sleep / wake 機構を提供しています。 このサービスは SGI によって開発されたオープンソースPost/Wait のパッチに基づいています。

 しかし、アトミック wakeups を保証し、決定論(determinism)を改善するために再スケジュール変数を利用したものに改良されています。

 

7.スケジューラ

 RedHawk は、独自に開発された周期ベース・スケジューラ(FBS)と、スタンダード Linux プロセススケジューラを提供します。

 FBS はユーザに周期的な実行パターンで処理行なうことができるようにする高分解能タスクスケジューラです。 FBS はオーバーラン検出を持ったメジャーとマイナサイクルを利用して多数の、調和したプロセスの周期的な実行をコントロールします。

 パフォーマンスモニタ(PM)が、それぞれのスケジュールされた実行フレーム間にCPU使用率を見るために供給されています。

 FBS インターフェースは、開発されてから数十年にわたって拡張され続け、今データ収集、シミュレーションとプロセス制御のような古典的なハード・リアルタイムアプリケーションのために最適化された理想的なスケジューラと言えるでしょう。

 FBS のために書かれたアプリケーションは、ここ数年にわずかしか変更を必要としなかったのに対して、その同じ期間に Linux スケジューラはヒューリスティックな負荷バランシングと公平性スケジューラの両方の微妙な変化のために多くの書き直しを余儀なくされました。

 

8. NUMA (Non Uniform Memory Access)

 Intel Nehalem QuickPath システムとAMD Opteron HyperTransport アーキテクチャを使う RedHawk システムではNUMA ファシリティの全ての長所を利用することが出来ます。 コンカレントは、特定のプロセッサ(あるいはコア)と特定の NUMAノードの両方にプロセスをバインドするための単一ツールを作成し、他のプロセス環境設定とともにメモリポリシーの指定を行えるように実行コマンドを拡張しました。

 RedHawk では、所定のプロセスページのフルセットを、一つのNUMA ノード上で、ローカルであることを保証する重複ページの機能を提供することで、外部ノードからのすべてのアクセスを排除し、プロセス決定論を改善しています。

 

説明: 説明: 説明: image011.gif

 

NVIDIAグラフィックカードを実装しているNUMAシステムでは、プリアロケートグラフィックページを指定のNUMAノードに割り付け、性能を向上させる事が出来ます。

 RedHawkの起動時には、ディフォルトのプリアロケートグラフィクスページは、4Gバイト境界より低いアドレス位置に全てのNUMAノードからインタリーブアクセス可能な状態で設定されていますので、これを下記の手順で再構成します。

1.最初の手順は、すべてのグラフィックプログラムを終了させて動作させるため、rootloginし、init 3を実行します。

 

説明: 説明: 説明: 説明: 説明: テキスト ボックス: # init 3

2.メモリシールドをON(-m1)し、すべての割り込みからCPU4-CPU11をシールド(-a 4-11)します。

説明: 説明: 説明: image013.jpg

3. /proc/driver/graphics-memory を表示し、現在の設定を確認した上で、0を書き出して、プリアロケートグラフィックスバッファをクリアします。

(Node3にはグラフィクスページが割り付けられていなかった事に注目してください)

 

説明: 説明: 説明: image014.jpg

 

4. runコマンドにbashを指定してNUMAノード1,2上にグラフィクスページをインターリーブオプションで作成し確認します。

続けて、プリアロケートバッファの状態を確認し、bashを終了します。

説明: 説明: 説明: image015.jpg

このとき、--mempolicy interleave=4,8は、CPU番号指定です。

したがって、NODE1のスタートが4NODE2のスタートが8になり、この2カ所のメモリをインターリーブ(交互)に使用します。

5.最後にinit 5Xを起動して設定は終了です。

説明: 説明: 説明: 説明: 説明: テキスト ボックス: # init 5

 この状態で、グラフィクスアプリケーションを、CPU 4からCPU11に割り付けることにより、もっとも効率良く使用できます。

 また、実際の使用率は”numastat”コマンドで、確認することが出来ます。

説明: 説明: 説明:  $ numastat
		node 3	node 2	node 1	node 0
numa_hit		43674	64884	79038	81643
numa_miss 	0 	0 	0 	0
numa_foreign 	0 	0 	0 	0
interleave_hit 	7840 	5885 	4975 	7015
local_node 	37923 	59861 	75202 	76404
other_node 	5751 	5023 	3836 	5239

 

numa_hit

ノードから割り当てを要求され成功したメモリの回数です。

numa_miss

ノードに割り当てることのできないため、別のノードに割り当てられたメモリ割り当て回数です。

numa_foreign

別のノードでメモリを割り当てることに失敗し、このノードから割り当てられた回数です。

interleave_hit

このノードで成功したインタリーブドメモリ割り当ての回数です。

local_node

ローカルノードに作成されたメモリ割り当て回数です。

other_node

非ローカルノードに作成されたメモリ割り当て回数です。

 

9.ハードウェア

 コンカレントはリアルタイムソリューションが可能なコマーシャルオフザシェルフ(COTS)ハードウェアを使用することをコミットしています。

 しかし不幸にも、 COTS ハードウェアの多くは、下記の理由からリアルタイムの使用に適していません。

● システム BIOS PCIスロットIRQ割り当ての細かい制御を許しません

● システムはディセーブル出来ないデバイスを持っていて、なおかつPCIスロットとIRQを共有するために物理的につながっています。

● ファームウェアが生成するディセーブル出来ない周期的なSMI 割り込み

● ハードウェアはハングしたシステムをデバッグするための、マスク不可能割込みを生成するための機構に欠けています

● チップセットによっては、リアルタイム性に対しての固有の問題を持っています。

コンカレント社によって認められたリアルタイムの条件に適合するシステムは、 iHawkTMシステムと呼ばれ、リアルタイムソリューションのための公認システムリストに含められています。

 評価されたシステムは、コンカレントの自動化された終夜テストシステム(ANTS)に統合されます。

 出荷された iHawk システムの次の新しいバーションが出荷された場合、ボードレベル変更と新しいチップセットリビジョンがリアルタイム性能に影響を与えないことを保証するために、再度評価が行われます。

 公認 iHawk COTS システムのリストには、Fujitsu, NEC, Dell, HP, Supermicro, Tyan Newisysなど多くのベンダがあります。 また、RedHawk は、種々のIBM BladeCenter ブレード環境もサポートしています。

 コンカレント社のカスタマの多くは、VME ベースのシステムを運用しているため、 RedHawk VMEバージョンが存在します。

 コンカレント社は、PCIホストから多くの異なったスタンダード VME I/Oボード使うことができる光ファイバーケーブルで接続する、PCI-VME バスブリッジを提供します。

 さらに RedHawk はマルチコアのインテルプロセッサを走らせている数枚の異なった VME ベースのボードを選択することも出来ます。そしてこれは、VME 技術を使うことを望むカスタマが RedHawk PCIベースのプラットフォームから2つの異なったアプローチ (ネイティブ VME あるいは VME 入出力ブリッジ)の中から選択することができます。

 RedHawk は、アナログ/ディジタル変換(A/D)、デジタル/アナログ変換(D/A)、ディスクリート入出力(DIO)と、MIL-STD-1553 (航空機) NTDS(船舶), CAN bus (自動車)等の多くのリアルタイムに最適化されたデバイス・ドライバを提供します。

コンカレント社によって出荷されたほとんどすべての iHawk システムには PCI PMC 両方のフォームファクタで利用可能なコンカレントで開発された Real-Time Clock & Interrupt Module (RCIM) が含まれています。

 RCIM は外部装置割り込み、割り込みを発生させることができるプログラマブル割り込みジェネレータとリアルタイム時計タイマと外部コネクタを提供しています。

 複数システム上で RCIMを接続し利用することで、非常に高い正度のクロックを複数マシンで同期させることができます。

 この接続によって、複数のシステムが物理的に同じシステムクロックを共有するため、RedHawk FBS を利用している同期プロセスをマスターシステムから制御することが出来るようになります。

 そしてRCIMはオプションとして極めて高い精度のGPS受像機とoven-controlled水晶発振器を取り付けることができます。

 

10.開発

 RedHawkは、リアルタイム・アプリケーションとカーネル・ドライバがミスマッチしている複雑な問題を単純化するための解決方法を提供しています。

 Redhawkカーネルには、リアルタイム・アプリケーションの実行を妨げないで、カーネルの動作を追跡する機構が標準で組み込まれNightTraceTMツールで、ユーザレベルアプリケーションとカーネルのトレースを視覚的に同時表示する事が出来ます。

説明: 説明: 説明: image018.jpg


説明: 説明: 説明: ノート:Kprobesとの違い

 コンカレントのカーネルトレース機構は、カーネルコードトレースの鍵となる特定の位置にパーマネントトレースポイントマクロを挿入することによって実行されています。 これらのマクロは条件によっては、禁止することが可能で、RedHawk はカーネルトレースの無い版が、ディフォルトで提供されています。
 重要な点は、カーネルトレース機構が、リアルタイム・アプリケーションの挙動解析に使うために設計されていることです。
 汎用カーネルデバッグのために特別な設計されている Kprobes のような特別なカーネルデバッグ用ツールではありません。 逆にKprobes は多くの理由でカーネルトレースを実装するためには、貧弱な機構でしかありません。
l	 Kprobes は、大きなボリュームのトレースデータを効率的に集めるようには、設計されていません。またそれは INT 3 割込みを使い、スタックの大部分をデュプリケートし、そして過度のSMP競合を起こしているユニークなハンドラーファンクションを検索するためにグローバルハッシュ表をロックします。
l	 Kprobes は融通がききません;プローブを置く位置には限界があり、調査時に登録したプローブデータだけに限定されています。
l	 Kprobes は、特に、エンドユーザにとっては不便なツールです;構成を変更するたびに、カーネルモジュールのコンパイルとロードを必要とします。
l	 Kprobes は高レベルのメンテナンスを必要とします;進化するカーネルバーション全体に渡る正確なトレースポイントの設定を保守することは非常に難しいでしょう。
 このような理由から、汎用カーネルデバッグツールとして卓越しているKprobesでは、リアルタイムアプリケーションの詳細なディテールを集める事には向いていません。
 NightStarツールには、同じようにリアルタイムに最適化されたNightVewデバッガと、システムチューナーNightTuneが含まれています。
 NightTraceとNightTune,はNightViewに統合され、リアルタイム・アプリケーション開発とチューニングのための特別仕立てのカスタムツールとして開発されています。
 さらに、RedHawk ではカーネルドライバの開発を行うために、KDBとKGDB カーネルデバッガを組み込んでいます。
 そして、カスタマサイトからクラッシュダンプを作成し、そして分析する手段としてLKCD ( Linux Kernel Crash Dump )メソッドの kexec / kdump をサポートしています。

 

11.コミュニティ

 コンカレント社は、何年もの間フリーソフトとオープンソース・コミュニティで活発に活動していました。

 現在コンカレント社は、run,cupid,nuuのオープンソースプロジェクトを後援し、コンカレントカーネル開発チームのメンバは、 Linux カーネルメーリングリストにバグ修正と機能のパッチをポストしています。

 これまで、投稿したパッチは、高解像度タイマ、ポジックスタイマ、カーネルデバッガ、 RCU POSIXメッセージキュー、グラフィックスドライバ、 ptrace NUMA NFSがあり、いくつかのパッチは、 Linux カーネルの最新のバーションに取り入れられています。

 

12.将来

現行のRedHawk6.0は、以下のような特徴を持っています。

リアルタイム・エンハンスド2.6.36 Linux カーネル

最新のIntel AMD マザーボードとチップセットサポート

システム当たり64 コア以上のサポート

NUMA拡張とリアルタイム性能に最適化された最新のNVIDIA グラフィックドライバ

最適化されたCUDA 並列コンピューティングSDK

ハードウェアとソフトウェアイベントのためのLinux パフォーマンスカウンタ

NUMAプラットフォーム用の新ページマップアドレス表示ユーティリティ

KVM Linuxカーネル仮想化サポート

IPV6標準サポート

 

しかし、RedHawk の将来のバーションには、もっとずっと多くの機能と拡張が計画されています。

 これらは、コンカレントのリアルタイムユーザによって最も求められる機能から優先的に統合されていきます。

 また、コンカレントは kernel.org によって受け入れられ、変更が閉じた版をコミットしています。

 したがって、完全なPREEMPT_RT パッチは、十分安定し、そして強力であることを証明されkernel.orgのメインストリームカーネルに受け入れられた時に適用されます。

 決定性と低遅延のリアルタイム・アプリケーションを開発するための、 ベストなPREEMPT_RT をコンカレント独自に開発された機能と結合する RedHawk カーネルは、非常に強力な、そして用途が広い環境をカスタマに提供するでしょう。