この章では,次のトピックについて説明します。
Tru64 UNIX カーネル (5.1 節)
シンメトリック・マルチプロセシング (5.2 節)
不均等メモリ・アクセス (NUMA) (5.3 節)
仮想メモリ・サブシステム (5.4 節)
Tru64 UNIX によるデバイスのサポート (5.5 節)
カーネルは,Tru64 UNIX のシステム・リソースを管理します。
システムの属性を設定することによって,最大の性能が得られるようにこのカーネルを調整できます。
さらに,カーネルのチューニングとデバッグのためのツールによって,これらの属性を検査できます。
5.1.1 カーネルのチューニング
Tru64 UNIX には,カーネルの定義や拡張のためのさまざまなサブシステムが用意されています。 カーネル変数は,システム・ブート後のサブシステムの動作の制御や,サブシステム統計情報の追跡に使用されます。
カーネル変数は,ブート時に省略時の値を割り当てられます。 システム構成や作業負荷の状況によっては,特に,メモリ/ネットワークを多用するシステムでは一部の属性の省略時の値が適切でなく,これらを変更して性能を最適化しなければならないことがあります。
デバッガを使用して,実行カーネルのカーネル変数の値を直接変更することも可能ですが,カーネル・サブシステム属性を使用してカーネル変数にアクセスすることをお勧めします。詳細は
sys_attrs
(5)
サブシステムの属性は,構成マネージャ・サーバ
cfgmgr
によって管理されます。
属性の表示と変更は,sysconfig
コマンドと
sysconfigdb
コマンド,およびカーネル・チューナ
dxkerneltuner
を使用して行います。
場合によっては,sysconfig
を使用して,システムの動作中に属性を変更することもできます。
システムのリブート後も変更を保持したい場合は,sysconfigdb
を使用して属性を変更します。
詳細は,『システムの構成とチューニング
』,
sysconfig
(8)sysconfigdb
(8)5.1.2 拡張されたカーネル・デバッグ機能
dbx
デバッガは,カーネルの変数とデータ構造のチェック,修正,表示が可能なシンボリック・デバッガです。
dbx
を使用すると,次の処理を実行できます。
ストライプ化されたイメージのデバッグ
メモリ内容のチェック
カーネル変数の値およびカーネルのデータ構造の値と形式の表示
マルチ・スレッドのデバッグ
-k オプションによるカーネル・コア・ファイルのデバッグ
-remote オプションによる,実行中のカーネルに対するシリアル回線経由でのブレークポイント・デバッグ
dbx
のフロントエンドは
kdbx
と呼ばれ,各
dbx
コマンドをサポートするだけでなく,C ライブラリ API もサポートします。
これにより,dbx
-k
または
dbx
-remote
だけを使用する場合より簡単に,カーネル・データの抽出とフォーマットを行う C プログラムの作成が可能になります。
dbx
デバッガは,コマンド行プログラムです。
もう 1 つの選択肢である
ladebug
デバッガは,コマンド行インタフェースと GUI の両方が用意されています。
詳細は,『Kernel Debugging』,『プログラミング・ガイド』,『Ladebug Debugger Manual』,および
ladebug
(1)dbx
(1)kdbx
(8)5.2 対称型マルチプロセシング
対称型マルチプロセシング (シンメトリック・マルチプロセシング: SMP) は,複数のプロセス (またはスレッド・アプリケーションの複数のスレッド) を複数の CPU 上で同時に実行する機能です。 複数のプロセスまたはスレッドを同時実行するため,処理速度が大幅に向上します。 また,この機能を利用して CPU カードを追加することにより,システムの計算能力と製品寿命を延ばすことができるため,新たにシステムを購入するよりも対費用効果の高い処理能力の増強を行うことができます。
Tru64 UNIX は,計算サーバ (計算のみを行う,マルチスレッド・アプリケーション専用システム),および,データ・サーバ (多数のネットワーク・クライアントに対してサービスするファイル・サーバ,DBMS サーバ,TP システム,メール・ルータ) の性能を最適化するように設計された SMP の実装をサポートしています。 さらに,オペレーティング・システムは,SMP 環境におけるマルチスレッド・アプリケーションの開発をサポートします。 SMP を利用すると,マルチプロセッサ・システムをタイムシェアリング・システムとして使用してもマイナスの効果が発生しません。
Tru64 UNIX の SMP は,次のような機能を使用します。
シンプル・ロック
保持されたロックがタイムアウトとなって解放されるまで,一定時間ロックを引き延ばす (スピンする) ため,スピン・ロックとも呼ばれます。
コンプレックス・ロック
ロックが解放されるまでアクセスをブロックする読み/書きロックです。
ファネリング (絞り込み)
ロックが有益でない場合に稀に使用されます。 ファネリングは,指定された CPU で強制的にプロセスを実行します。 一般的に従来型の,スレッド対応でなく,マルチプロセッサ・セーフでないプログラムで使用されます。
Tru64 UNIX SMP は,ロックで保護しなければならないようなシステム状態を減らしてできるだけ多くの同時性を確立します。 その結果,ロックの必要性とそれを行った場合のオーバヘッドを減少させます。
Tru64 UNIX は,そのカーネルも含め,複数のプロセスまたは複数のスレッドが複数の CPU 上で同時に実行できるよう,完全に並列化されています。 このオペレーティング・システムは,同時処理とそのロック・ストラテジによって,同じカーネル・データ構造の完全性を確保します。 複数のプロセスおよび複数のスレッドが,同じカーネル・データ構造にアクセスできますが,オペレーティング・システムは,このアクセスが論理的順序で行われるよう管理します。 マルチ・プロセスおよびマルチ・スレッドが,互いのロックを保留および要求することはできません。
Tru64 UNIX SMP はまた,指定した CPU に特定のプロセスを割り当てる機能であるプロセッサ・バインディング,および,スケジューラが,すべての実行可能なプロセスを,利用可能なすべての CPU に分配しようとするロード・バランシングをサポートしています (ロード・バランシングよりもプロセッサ・バインディングが優先されます)。
性能を向上させるために,スケジューラは,それぞれのプロセスをそれらが最後に実行された CPU 上で実行し,CPU のキャッシュに状態情報が残っている場合はそれを利用します。
SMP は,システム・ブート時に次の 5 つのいずれかのモードに構成することができます。
ユニプロセシング
最適化リアルタイム・プリエンプション
最適化 SMP
最適化リアルタイム・プリエンプションおよび SMP
ロック・デバッグ・モード
ユニプロセシングに設定されている場合,システム・ブート時にはマルチ・スレッドのサポートに必要なロックのみでカーネルが初期化されます。
ロック・デバッグ・モードが設定されている場合,システムは次のように動作します。
ロック階層とSPL (最小システム優先順位レベル) をチェックする
デバッグ情報をクラス別に格納し,ロックの統計情報を維持する。
各 CPU が持つシンプル・ロックを CPU 固有の配列に記録する。
スレッドがスレッド構造体に持っているコンプレックス・ロックをすべて記録する。
dbx
デバッガを使用すると,このデバッグ情報にアクセスできます。
さらに,開発環境は,マルチスレッド・アプリケーションの開発をサポートします。
dbx
,profile
,および
pixie
ユーティリティは,複数のスレッドをサポートし,システムにはスレッドセーフ・ライブラリが含まれています。
Tru64 UNIX の開発環境および Tru64 UNIX がサポートするスレッド・パッケージの詳細については,『プログラミング・ガイド』 および『Guide to POSIX Threads Library』を参照してください。
SMP 構成の詳細については,『システム管理ガイド』 および 『システムの構成とチューニング』を参照してください。
5.3 不均等メモリ・アクセス (NUMA)
シンメトリック・マルチプロセッサ (SMP) システムには,一般的にすべてのシステム・リソースにリンクするインターコネクト (バスまたはスイッチ) が 1 つあります。 つまり,システム内のすべての CPU は,システムのメモリや入出力チャネルにアクセスするときの遅延と帯域幅が同じになります。 従来の SMP システムのアーキテクチャの欠点は,システムの CPU の数を増やすと,システム・バスが性能のボトルネックになることです。
このボトルネックへの 1 つの対処方法は,SMP ブロック (それぞれ,限られた数の CPU,メモリ・アレイ,入出力ポートが存在する) からシステムを構築し,ブロック間を接続する第 2 レベルのバスまたはスイッチを追加することです。 不均等メモリ・アクセス (NUMA) は,このタイプのシステム・アーキテクチャを説明するときに使う用語です。 これは,特定の CPU がメモリおよび入出力リソースにローカルにアクセスする (CPU と同じビルディング・ブロックにある) かあるいはリモートでアクセスする (他のビルディング・ブロックにある) かによって,帯域幅と遅延が異なるためです。
NUMA サポートについての詳細や,完全なプログラム例については,次のサイトのオンライン・ドキュメント・セットに含まれている Web 専用ドキュメント『NUMA Overview』を参照してください。
http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V51_HTML/NUMA/TITLE.HTM
仮想メモリ・サブシステムは,次の機能を実行します。
メモリをプロセスに割り当てる。
システムにあるすべてのページを追跡管理する。
ページングとスワッピングを使用して,プロセスの実行やファイル・システム I/O のキャッシュに十分なメモリを確保する。
物理メモリの合計量は,システムにインストールされたメモリ・ボードの容量によって決まります。 システムはこのメモリをページと呼ばれる 8 KB の単位で分配します。 システムは物理メモリのページを次の 3 つのエリアの間で分配します。
メモリは,ブート時には静的に,実行時には動的に固定されます。
ブート時には,オペレーティング・システムと PAL (Privileged Architecture Library) コードが,基本のシステム操作を実行するために,物理メモリの隣接部分を固定します。 静的固定メモリは,オペレーティング・システムのデータやテキスト,システム・テーブル,メタデータ・バッファ・キャッシュ (最後にアクセスした UFS および CDFS を一時的に保持する),および AdvFS (Advanced File System) バッファ・キャッシュのために確保されます。 静的固定メモリは,ページングによって再生されることはありません。
仮想メモリ・サブシステムは,物理メモリの一部を使用して,プロセスが最後にアクセスした匿名メモリ (変更可能な仮想アドレス空間) およびファイルの裏付けがあるメモリ (file backed memory) をキャッシュします。 このサブシステムは,競合するプロセス間にメモリを割り当て,すべての物理ページの分配を追跡します。 このメモリは,ページングとスワッピングによる再生が可能です。
ユニファイド・バッファ・キャッシュ
UBC (Unified Buffer Cache) は,物理メモリの一部を使用して,最後にアクセスしたファイル・システム・データをキャッシュします。 UBC には,読み書きのための,また,マップされたファイル領域からのページ・フォールトのための実際のファイル・データおよび AdvFS メタデータが入っています。 オペレーティング・システムとストレージ・サブシステムの間の層として機能することにより,UBC はディスク操作の数を減少させることができます。 このメモリは,ページングによる再生が可能です。
仮想メモリ・サブシステムと UBC は,固定されていない物理ページをめぐって競合します。
ページは,必要に応じて,プロセスと UBC に割り当てられます。
メモリの需要が高まると,最も古い (最も前に使用された) ページが仮想メモリ・サブシステムおよび UBC から再生され,スワップ領域に移動されてから再利用されます。
さまざまな属性により,仮想メモリ・サブシステムと UBC が利用できるメモリの量およびページ再生の割合が制御されます。
5.4.1 ページの管理と追跡
仮想メモリ・サブシステムは,必要に応じて,物理ページをプロセスと UBC に割り当てます。 物理メモリには限界があるので,これらのページは再利用できるよう,定期的に再生されます。
仮想メモリ・サブシステムは,ページ・リストを使用して,すべての物理メモリ・ページの位置と世代を追跡します。 すべての物理ページは,いつでも次のリストのいずれかにあります。
固定リスト
固定され,再生できないページ。
フリー・リスト
クリーンで使用されていないページ。 このリストのサイズは,ページの再生がいつ発生するかを制御する。
アクティブ・リスト
仮想メモリ・サブシステムまたは UBC で使用されているページ。
どのページを最初に再生するかを判定するために,ページ・スティーラ・デーモンがアクティブ・リストの中から最も古いページを探し,これらの LRU (least recently used) ページを次のように指定する。
非アクティブ・ページとは,仮想メモリ・サブシステムによって使用されている最も古いページである。
UBC の LRU (least recently used) ページとは,UBCによって使用されているページの中で最も古いページである。
Tru64 UNIX の仮想メモリは,NUMA
に対応しています。
Tru64 UNIX では,RAD ごとにリストと作業用スレッドのセットを管理します。
5.4.2 変更されたページのプリライト
仮想メモリ・サブシステムは,メモリ不足から容易に回復できるよう,メモリ・ページをクリーンな状態に保とうとします。
フリー・リストにあるページがすぐに枯渇すると仮想メモリ・サブシステムが予測する場合は,最も前に変更された (ダーティな) 非アクティブ・ページのスワップ領域に,あらかじめ書き込み (プリライト) を行います。
さらに,UBC の変更 LRU ページが UBC の合計 LRU ページの 10 % を超える場合,仮想メモリ・サブシステムは,最後に変更された UBC の LRU ページのスワップ領域にプリライトします。
5.4.3 属性を使用したページングとスワッピングの制御
メモリの需要が高まり,フリー・リストの不足が顕著な場合,ページングが始まります。 仮想メモリ・サブシステムは,最も古い非アクティブ・ページおよび UBC の LRU ページを判定し,その変更済みページの内容をスワップ領域に移動してから,クリーン・ページをフリー・リストに入れると,そこでそれらが再利用されます。
フリー・ページ・リストが個々のページを再生するだけでは補充できない場合,スワッピングが始まります。 スワッピングは,プロセスを一時的に中断し,常駐セット全体をスワップ領域に移動し,そこで大量の物理メモリが解放されます。
ページングとスワッピングが開始,停止するタイミングは,チューニング可能な仮想メモリ・サブシステム内のカーネル属性の値によって異なります。
UBC は仮想メモリ・サブシステムとカーネルに固定されていない物理ページをめぐって競合しているので,UBC に対するメモリの割り当てがファイル・システムの性能やページング/スワッピング・アクティビティに影響することがあります。 UBC は動的で,ファイル・システムの要請の変化に対応するために,消費メモリの量が変化します。
省略時には,UBC は最高 100% のメモリを消費することができます。
ただし,UBC に割り当てられているメモリの一部は,仮想メモリ・サブシステムから借りているに過ぎません。
ページングが始まると,借りている UBC ページがまず再生されます。
UBC に割り当てられるメモリの量は,仮想メモリ・サブシステムのカーネル属性によって制御されます。
5.4.4 ページング操作
メモリの需要が高く,フリー・ページ・リストにあるページ数がページング限界値を下回ると,仮想メモリ・サブシステムがページングを使用してフリー・ページ・リストを補充します。 ページ再生コードにより,ページングとスワッピングが制御されます。 ページ・アウト・デーモンおよびタスク・スワッパ・デーモンは,ページ再生コードの拡張機能です。
ページ再生コードは,ページ・スティーラ・デーモンをアクティブ化し,それによって,UBC のサイズが借用限界値 (省略時の値は 20 %) に到達するまで,UBC が仮想メモリ・サブシステムから借りているページがまず再生されます。 再生されたページがダーティな (変更されている) 場合,ページをフリー・ページ・リストに移動する前に,その内容をディスクに書き込む必要があります。 UBC ページは通常変更されないので,借りている UBC ページを解放することが,ページを再生する最も速い方法です。
UBC が借りているメモリを解放してもフリー・リストが十分に補充できない場合,ページ・アウトが起こります。 ページ・スティーラ・デーモンが最も古い非アクティブ・ページと UBC の LRU ページを再生します。
フリー・ページの数がなお減少し続ける場合,ページングがますます積極的に行われます。 フリー・ページ・リストのページ数が 20 ページを下回ると (省略時の値),リストにあるそれぞれのページについて,ページを再生しなければならなくなります。 デッドロックを避けるため,フリー・ページ・リストにあるページ数が 10 ページを下回る場合 (省略時の値),フリー・ページ・リストが補充されるまで,特権を持つタスクのみがメモリを割り当てられるようになります。 これらの限界値は,チューニング可能な属性によって制御されます。
ページ・アウトは,フリー・リストにあるページ数がページング限界値を上回ったときに停止します。
個々のページのページングだけでは,フリー・リストを十分に補充できない場合は,大量のメモリを解放するために,スワッピングが使用されます。
5.4.5 スワッピング操作
メモリの需要が高い場合,仮想メモリ・サブシステムはページの再生によってフリー・リストの補充を行えないことがあります。 スワッピングは,プロセスを中断することにより物理メモリに対する需要を減少させるので,フリー・リストのページ数を劇的に増加させます。 プロセスをスワップ・アウトするために,タスク・スワッパがプロセスを中断し,その常駐セットをスワップ領域に書き込み,クリーン・ページをフリー・リストに移動します。 スワッピングは,システムの性能に重大な影響を与えることがあります。
アイドル・タスクのスワッピングが始まるのは,フリー・リストにあるページ数が,一定時間,スワッピング限界値 (省略時の値は 74 ページです) を下回ったときです。 次にタスク・スワッパが,30 秒以上アイドル状態にあるタスクをすべて中断します。
フリー・リストにあるページ数がなお減少し続ける場合,ハード・スワッピングが始まります。 タスク・スワッパが,優先順位が最も低く,常駐セット・サイズが最も大きいタスクを一度に 1 つずつ中断します。
個々のタスクのスワッピングは,フリー・リストにあるページ数がスワッピング限界値 (省略時の値は 1280) を上回ったときに停止します。
スワッピングは,フリー・リストにあるページ数が一定時間,十分に補修されたときに起こります。 タスクのワーキング・セットは,スワップ領域からページ・インされ,実行できるようになります。 省略時の設定では,タスクは 1 秒間スワップ・インした後でスワップ・アウトすることができます。
スワッピングの割合を増加させる (ページの再生中,早いタイミングでスワッピングを行う) と,スループットが上昇します。 スワップ・アウトされるプロセスが増加すると,実際に実行されるプロセスが減少し,より多くの作業が行われます。 スワッピングの割合を増加させると,長い間スリープ状態にあるスレッドをメモリから移動して,メモリが解放されますが,これにより対話の応答時間が長くなります。 スワップ・アウト・プロセスが必要な場合は,遅延時間が長くなります。
スワッピングの割合を減少させる (ページ再生中,遅いタイミングでスワッピングを行う) と,対話の応答時間は改善されますが,スループットが犠牲になります。
5.4.6 スワップ領域割り当てモード
スワップ領域を割り当てるには,2 種類のモードを使用できます。
これらのモードは,仮想メモリ・サブシステムが匿名メモリ (変更可能な仮想アドレス空間)
用にスワップ領域を確保する方法が異なります。
匿名メモリは,ファイルの裏付けはないがスワップ領域によって裏付けられるメモリです (たとえば,スタック空間,ヒープ空間,および
malloc
関数によって割り当てられたメモリ)。
いずれのモードにも,性能上の利益はありません。
即時モード
このモードは,プロセスが初めて匿名メモリを割り当てるときに,スワップ領域を確保します。 即時モードは,省略時のスワップ領域割り当てモードで,イーガー・モードとも呼ばれます。
このモードでは,システムが必要以上に大量のスワップ領域をプロセス用に確保することがあります。 しかし,プロセスがスワップ領域を必要とするときには必ず確保することができます。 スワップ領域が確保できない場合は,要求プロセスが中断します。
延期モード
このモードは,仮想メモリ・サブシステムが変更された仮想ページをスワップ領域に書き込まなければならなくなったときのみ,スワップ領域を確保します。 匿名メモリ用のスワップ領域の確保は,それが実際に必要になるまで延期されます。 延期モードは,レイジー・モードとも呼ばれます。
このモードでは,即時モードよりもスワップ領域が少なくてすみ,また必要なスワップ領域の予約量がより少ないので,システムがより高速に実行されます。 しかし,延期モードは前もってスワップ領域を確保しないため,プロセスが必要とするときにスワップ領域が利用できないことがあり,プロセスが非同期的に強制終了されることがあります。
強制終了されるプロセスは,メモリを要求しているプロセスではなく,ほとんどの場合,システム・デーモンなどのアイドル状態のプロセスとなります。
さらに,特定のコマンドまたはアプリケーション用のシステム規模のスワップ領域割り当てモードを,swapon
コマンドを使用して上書きすることができます。
詳細については,
swapon
(8)5.4.7 スワップ・バッファの使用
メモリとディスクの間のデータ移動を容易にするために,仮想メモリ・サブシステムは,同期および非同期スワップ・バッファを使用します。 仮想メモリ・サブシステムは,これら 2 種類のバッファを使用して,比較的遅いプロセスであるページ・アウト要求の完了を待つことなく,ページ要求にただちに応えます。
同期スワップ・バッファは,ページ・フォールトのページ,およびスワップ・アウトに使用されます。
非同期スワップ・バッファは,非同期ページ・アウトおよび変更ページのプリライトに使用されます。
5.4.8 ユニファイド・バッファ・キャッシュ
Unified Buffer Cache (UBC) は,Tru64 UNIX の仮想メモリ機能です。 UBC は,マシンの物理メモリの一部を使用して,最後にアクセスされたファイル・システム・データをキャッシュします。 UBC には,通常のファイル・アクティビティでの読み書き,マップされたファイル・セクションからのページ・フォールト,および AdvFS メタデータなどの実際のファイル・データが入ります。
UBC は,仮想メモリ・サブシステムと物理メモリを共有 (競合) しますが,カーネルに固定されたページはこの限りではありません。
UBC は,ファイル・システムの要請の変化に動的に対応するために,消費メモリの量が変化します。
UBC の詳細については,『システムの構成とチューニング』 を参照してください。
5.5 デバイスのサポート
カーネルは,I/O デバイスのホットスワップをサポートします。 これにより,ホットスワップ可能な I/O デバイスがオンラインになると,デバイス・ドライバが自動的にフォールト・インする能力が提供されます。
ハードウェア・コードは,新しいデバイスを検出し,デバイス・ドライバがカーネルにないと判定すると,カーネル関数呼び出しを 1 度行って,自動的にデバイスのドライバをカーネルにロードします。 さらに,ホットスワッピングにより,カーネル・サブシステムやドライバをカーネルにあらかじめ構築しなくてすむので柔軟性が向上します。 これらは,デバイスに最初にアクセスしたときにフォールト・インすることができます。