動的プロセッサー割り振り解除 の使用
マシン・タイプ 7044 モデル 270 以降、2 台を超えるプロセッサーを備えたシステムのハードウェアは、 どれも、訂正可能エラーを検出できるようになりました。これらは、ファームウェアによって収集されます。 これらのエラーは致命的ではなく、まれに出現するのであれば、無視しても安全です。 しかし、ある特定のパターンの障害が特定のプロセッサー上に現れる場合、 このパターンは、このコンポーネントが近い将来に回復不能な障害を現す可能性を示します。 この予想は、障害率としきい値の分析に基づいて、ファームウェアによって行われます。
AIX®は、継続的なハードウェア監視を実施し、ハードウェア・エラーがないか定期的にファームウェアをポーリングします。 プロセッサー・エラーの数がしきい値に達し、ファームウェアがこのシステム・コンポーネントが失敗する明確な確率を認識すると、ファームウェアはエラー・レポートを AIX に返し、エラーをシステム・エラー・ログに記録します。 さらに、マルチプロセッサー・システムでは、障害のタイプに応じて、 AIX は、信頼できないプロセッサーの使用を停止し、それを割り振り解除しようとします。 この機能は、プロセッサーの動的割り当て解除 と呼ばれます。
この時点で、ファームウェアは、保守担当者がこのプロセッサーを置き換えるまで、 以後のリブートでの永続的な割り当て解除のフラグをプロセッサーに付けます。
アプリケーションへの影響の可能性
プロセッサーの割り当て解除は、 ドライバーおよびカーネル・エクステンションを含む大部分のアプリケーションからは見えません。 ただし、 AIX で公開されているインターフェースを使用して、アプリケーションまたはカーネル・エクステンションがマルチプロセッサー・マシン上で実行されているかどうかを判別したり、存在するプロセッサーの数を調べたり、特定のプロセッサーにスレッドをバインドしたりすることができます。
プロセッサーにプロセスまたはスレッドをバインドするための bindprocessor インターフェースは、バインド CPU 番号を使用します。 バインド CPU 番号の範囲は [0..N-1] です。ここで N は CPU の合計数です。 CPU の番号付けに「穴」がないことを前提とするアプリケーションまたはカーネル・エクステンションを中断しないようにするために、 AIX は、アプリケーションに対して、CPU が割り振り解除される「最後の」(最も高い番号の) バインド CPU であるかのように常に表示します。 例えば、8-way SMP では、バインド CPU の番号は [0..7] です。 1 台のプロセッサーの割り当てが解除されると、使用可能な CPU の合計数は 7 台になり、番号は [0..6] になります。 どの物理プロセッサーに障害があるかに関係なく、外部からは、CPU 7 が消えたように見えます。
プロセス/スレッド・バインディングを使用するアプリケーションまたはカーネル・エクステンションは、プロセッサーの 1 つを割り振り解除する必要があるときに、 AIX がバインドされたスレッドをサイレントに終了したり、強制的に別の CPU に移動したりすると、壊れる可能性があります。 プロセッサーの動的割り当て解除は、このようなアプリケーションおよびカーネル・エクステンションに、 プロセッサーの割り当て解除が行われようとしていることを通知するためのプログラミング・インターフェースを提供します。 このようなアプリケーションおよびカーネル・エクステンションは、この通知を受け取った場合には、そのバインド済みのスレッドおよび関連するリソース (タイマー要求ブロックなど) を最後のバインド CPU ID から移動し、新規の CPU 構成に適応させる責任があります。
アプリケーションおよびカーネル・エクステンションへの通知後に、いくつかのスレッドが依然として最後のバインド CPU ID にバインドしている場合、割り当て解除は中断します。 この場合、 AIX は、割り振り解除が打ち切られたという事実をエラー・ログに記録し、障害のあるプロセッサーの使用を継続します。 最終的にこのプロセッサーで障害が起こった場合には、システム全体の障害になります。 したがって、スレッドを CPU にバインドしているアプリケーションまたはカーネル・エクステンションが、プロセッサーのさし迫った割り当て解除に関する通知を受け取り、この通知に基づいて作動することが重要です。
割り当て解除がまれに失敗した場合でも、プロセッサーの動的割り当て解除 は依然としてシステム管理者に詳細な警告を提供します。 エラーをエラー・ログに記録することによって、システム全体の障害になる前に、問題があるコンポーネントを置き換えるための、システムの保守操作をスケジュールする機会を、システム管理者に提供できます。
プロセッサー割り当て解除に関するイベントの流れ
プロセッサーの割り当て解除に関するイベントの一般的な流れを以下に示します。
- プロセッサーの 1 つがリカバリー可能エラーしきい値に到達したことを、 ファームウェアが検出する。
- AIX は、ファームウェア・エラー・レポートをシステム・エラー・ログに記録し、プロセッサー割り当て解除をサポートするマシンで実行している場合は、割り当て解除プロセスを開始します。
- AIX は、最後のバインド CPU にバインドされた非カーネル・プロセスおよびスレッドに通知します。
- AIX は、バインドされたすべてのスレッドが最後のバインド CPU から移動するのを待機します。 スレッドがバインドされたままの場合、 AIX は最終的に (10 分後に) タイムアウトになり、割り振り解除を打ち切ります。 それ以外の場合、 AIX は、以前に登録された高可用性イベント・ハンドラー (HAEH) を呼び出します。 HAEH はエラーを戻す可能性があり、この場合、割り当て解除は中断します。 それ以外の場合、 AIX は割り振り解除プロセスを続行し、最終的に障害のあるプロセッサーを停止します。
割り振り解除のいずれかの時点で障害が発生した場合、 AIX はその障害をログに記録し、割り振り解除が中止された理由を示します。 システム管理者は、エラー・ログを調べて、(可能であれば) 訂正アクションを実行し、割り当て解除を再始動できます。 例えば、割り当て解除の中断の理由が、少なくとも 1 つのアプリケーションがそのバインド済みスレッドのバインドを解除できなかったことである場合、システム管理者は、そのアプリケーションを停止し、割り当て解除を再始動してから (今回は続行するはずです)、そのアプリケーションを再始動することができます。
個別プロセッサーを処理するプログラミング・インターフェース
次のセクションでは、使用可能なプログラミング・インターフェースについて説明しています。
システムの CPU の数を判別するためのインターフェース
- _SC_NPROCESSORS_CONF: 構成済みプロセッサーの数
- _SC_NPROCESSORS_ONLN: オンラインのプロセッサーの数
sysconf サブルーチンによって戻される値_SC_NPROCESSORS_CONFリブート間で一定のままになります。 ユニプロセッサー (UP) マシンは 1で識別されます。 1 を超える値は、マルチプロセッサー (MP) マシンを示します。 _SC_NPROCESSORS_ONLN パラメーターに関して戻される値は、アクティブ CPU の数であり、プロセッサーの割り当てが解除されるたびに減少します。
_system_configuration.ncpus フィールドは、マシン上でアクティブである CPU の数を示します。 このフィールドは、_SC_NPROCESSOR_ONLN パラメーターと似ています。
ブート時に最初に使用可能であったプロセッサーの数を認識しなければならないコードの場合、 ncpus_cfg フィールドが_system_configurationテーブルはリブート間で一定のままです。
CPU は、範囲が [0..(ncpus-1)] のバインド CPU ID によって識別されます。 プロセッサーには、置かれている CPU ボードや、 置かれている順序などによって異なる物理 CPU 番号も付いています。 CPU 番号を処理するコマンドおよびサブルーチンは、常にバインド CPU 番号を使用します。 CPU 数の変化への対応を容易にするために、バインド CPU 番号は、範囲が [0..(ncpus-1)] の連続する番号になります。 この結果、プロセッサーの割り当てが解除された場合、ユーザーの視点からは、どの物理プロセッサーに障害があるかに関係なく、常に最高 (最後) の番号のバインド CPU が消えたように見えます。
特定のプロセッサーにスレッドをバインドするためのインターフェース
bindprocessor コマンド および bindprocessor プログラミング・インターフェースを使用すると、スレッドまたはプロセスを、そのバインド CPU 番号によって指定された特定の CPU にバインドすることができます。 どちらのインターフェースでも、スレッドまたはプロセスをバインドできるのは、 アクティブな CPU に対してだけです。 bindprocessor プログラミング・インターフェースを直接使用するか、または bindprocessor コマンドによって外部でバインドされるプログラムは、プロセッサー割り当て解除に対処する必要があります。
CPU の割り当てが解除された場合に、プロセッサーにバインドするプログラムで見られる主な問題は、 割り当てが解除されたプロセッサーにバインドする要求が失敗することです。 bindprocessor 要求を発行するコードは常に、 これらの要求からの戻り値を調べる必要があります。
プロセッサー割り当て解除通知用のインターフェース
通知メカニズムは、最後のバインド CPU にバインドされたスレッドを持つユーザー・モード・アプリケーションの場合と、カーネル・エクステンションの場合とでは異なります。
ユーザー・モードでの通知
最後のバインド CPU にバインドされたユーザー・モード・アプリケーションの各スレッドには、 SIGCPUFAIL および SIGRECONFIG シグナルが送信されます。 このようなアプリケーションは、この新規シグナルをキャッチして、 最後のバインド CPU にバインドされているスレッドを (アンバインドするか、 または別の CPU にバインドして) 処分するように変更する必要があります。
カーネル・モードでの通知
さし迫ったプロセッサーの割り当て解除についての通知が必要なドライバーおよびカーネル・エクステンションは、 カーネルを使用して、高可用性イベント・ハンドラー (HAEH) ルーチンを登録する必要があります。 このルーチンは、プロセッサーの割り当て解除がさし迫っている場合に呼び出されます。 カーネル・エクステンションが構成解除されるか、またはアンロードされる前に、HAEH の登録を抹消するためのインターフェースも用意されています。
高可用性イベント・ハンドラーの登録
システムの可用性に影響を与えるイベントの発生時に、カーネル・エクステンションに通知できるようにするための新規関数を、カーネルがエクスポートします。
int register_HA_handler(ha_handler_ext_t *)このシステム・コールについて詳しくは、 オペレーティング・システムおよびデバイスの管理の register_HA_handler を参照してください。
成功した場合の戻り値は 0 です。 ゼロ以外の値は、失敗を示します。
typedef struct _ha_handler_ext_ {
int (*_fun)(); /* Function to be invoked */
long long _data; /* Private data for (*_fun)() */
char _name[sizeof(long long) + 1];
} ha_handler_ext_t;カーネル・エクステンションのプライベート _data フィールドが用意されているので、必要に応じて使用することができます。 CPU の障害が予想されるイベントが原因で、このフィールドが呼び出された場合、登録時にこのフィールドに指定した値が、パラメーターとして登録済み関数に渡されます。
_name フィールドは、カーネルに、カーネル・エクステンションを固有に識別するために使用される、 null で終了する文字列であり、最大長は 8 文字です (null ターミネーターは含みません)。 この名前は登録済みのどのカーネル・エクステンションでも固有でなければなりません。 この名前は, システムの詳細データ域にリストされます。CPU_DEALLOC_ABORTEDHAEH ルーチンがカーネルによって呼び出されたときにカーネル・エクステンションがエラーを戻す場合は、エラー・ログ・エントリー。
各カーネル・エクステンションは、その HAEH を 1 回だけ登録する必要があります。
高可用性イベント・ハンドラーの呼び出し
- register_HA_handler に渡される ha_handler_ext_t 構造体の _data フィールドの値。
- sys/high_avail.h ファイルで定義されている ha_event_t 構造体を指すポインター。
typedef struct { /* High-availability related event */ uint _magic; /* Identifies the kind of the event */ #define HA_CPU_FAIL 0x40505546 /* "CPUF" */ union { struct { /* Predictive processor failure */ cpu_t dealloc_cpu; /* CPU bind ID of failing processor */ ushort domain; /* future extension */ ushort nodeid; /* future extension */ ushort reserved3; /* future extension */ uint reserved[4]; /* future extension */ } _cpu; /* ... */ /* Additional kind of events -- */ /* future extension */ } _u; } haeh_event_t;
#define HA_ACCEPTED 0 /* Positive acknowledgement */
#define HA_REFUSED -1 /* Negative acknowledgement */登録済みのいずれのエクステンションも HA_ACCEPTED を戻さない場合、割り当て解除は中断します。 HAEH ルーチンはプロセス環境で呼び出されるので、固定される必要はありません。
カーネル・エクステンションが CPU 構成に依存している場合、その HAEH ルーチンが、さし迫った CPU 割り当て解除に対応する必要があります。 この対応は、アプリケーションに大きく依存します。 AIX が構成解除を続行できるようにするには、最後のバインド CPU (存在する場合) にバインドされているスレッドを移動する必要があります。 また、バインド済みスレッドから開始したタイマーを使用していた場合には、CPU 割り当て解除の一部として、これらのタイマーが別の CPU に移動されます。 アプリケーションが、特定の CPU に送信されているタイマーに依存している場合には、例えば、タイマーの停止などのアクションを実行し、スレッドが新規 CPU にバインドされる時に、タイマー要求を再開する必要があります。
高可用性イベント・ハンドラーの登録の取り消し
int unregister_HA_handler(ha_handler_ext_t *)このインターフェースは、成功した場合には 0 を戻します。 ゼロ以外の戻り値はエラーを示します。
テスト環境でのプロセッサーの割り当て解除
cpu_deallocate cpunumここで:
cpunum は有効な論理 CPU 番号です。
ターゲット・プロセッサーをオンラインに戻すには、システムをリブートする必要があります。 したがって、このコマンドはテストの目的でのみ提供されており、 システム管理ツールとして提供されているわけではありません。