5    カーネル,シンメトリック・マルチプロセシング,NUMA,仮想メモリおよびデバイスのサポート

この章では,次のトピックについて説明します。

5.1    Tru64 UNIX カーネル

カーネルは,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 を使用すると,次の処理を実行できます。

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 は,次のような機能を使用します。

Tru64 UNIX SMP は,ロックで保護しなければならないようなシステム状態を減らしてできるだけ多くの同時性を確立します。 その結果,ロックの必要性とそれを行った場合のオーバヘッドを減少させます。

Tru64 UNIX は,そのカーネルも含め,複数のプロセスまたは複数のスレッドが複数の CPU 上で同時に実行できるよう,完全に並列化されています。 このオペレーティング・システムは,同時処理とそのロック・ストラテジによって,同じカーネル・データ構造の完全性を確保します。 複数のプロセスおよび複数のスレッドが,同じカーネル・データ構造にアクセスできますが,オペレーティング・システムは,このアクセスが論理的順序で行われるよう管理します。 マルチ・プロセスおよびマルチ・スレッドが,互いのロックを保留および要求することはできません。

Tru64 UNIX SMP はまた,指定した CPU に特定のプロセスを割り当てる機能であるプロセッサ・バインディング,および,スケジューラが,すべての実行可能なプロセスを,利用可能なすべての CPU に分配しようとするロード・バランシングをサポートしています (ロード・バランシングよりもプロセッサ・バインディングが優先されます)。

性能を向上させるために,スケジューラは,それぞれのプロセスをそれらが最後に実行された CPU 上で実行し,CPU のキャッシュに状態情報が残っている場合はそれを利用します。

SMP は,システム・ブート時に次の 5 つのいずれかのモードに構成することができます。

ユニプロセシングに設定されている場合,システム・ブート時にはマルチ・スレッドのサポートに必要なロックのみでカーネルが初期化されます。

ロック・デバッグ・モードが設定されている場合,システムは次のように動作します。

dbx デバッガを使用すると,このデバッグ情報にアクセスできます。

さらに,開発環境は,マルチスレッド・アプリケーションの開発をサポートします。 dbxprofile,および 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

5.4    仮想メモリ

仮想メモリ・サブシステムは,次の機能を実行します。

物理メモリの合計量は,システムにインストールされたメモリ・ボードの容量によって決まります。 システムはこのメモリをページと呼ばれる 8 KB の単位で分配します。 システムは物理メモリのページを次の 3 つのエリアの間で分配します。

仮想メモリ・サブシステムと UBC は,固定されていない物理ページをめぐって競合します。 ページは,必要に応じて,プロセスと UBC に割り当てられます。 メモリの需要が高まると,最も古い (最も前に使用された) ページが仮想メモリ・サブシステムおよび UBC から再生され,スワップ領域に移動されてから再利用されます。 さまざまな属性により,仮想メモリ・サブシステムと UBC が利用できるメモリの量およびページ再生の割合が制御されます。

5.4.1    ページの管理と追跡

仮想メモリ・サブシステムは,必要に応じて,物理ページをプロセスと 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 度行って,自動的にデバイスのドライバをカーネルにロードします。 さらに,ホットスワッピングにより,カーネル・サブシステムやドライバをカーネルにあらかじめ構築しなくてすむので柔軟性が向上します。 これらは,デバイスに最初にアクセスしたときにフォールト・インすることができます。