ハードウェアは無限の数の割り込みを提供するため、Oracle Solaris は各デバイスが使用できる割り込みの数を制限します。デフォルトの制限は一般的なシステム構成のニーズに一致する必要がありますが、特定のシステム構成ではこの値の調整が必要になることがあります。
PCIe バスで I/O 仮想化を有効にすると、割り込みハードウェアリソースが各 I/O ドメインに割り当てられます。各ドメインは有限の数のこれらのリソースに割り当てられ、何らかの割り込み割り当ての問題につながる場合があります。この状況は、UltraSPARC T2、UltraSPARC T2 Plus、SPARC T3、SPARC T4、SPARC T5、SPARC M5、および SPARC M6 プラットフォームにのみ影響します。
Oracle Solaris コンソール上のこの警告は、I/O デバイスドライバの接続中に、供給された割り込み数が使い果たされたことを意味します。
WARNING: ddi_intr_alloc: cannot fit into interrupt pool
特に、システムが複数の論理ドメインにパーティション化されている場合や、任意のゲストドメインに割り当てられる I/O デバイスの数が多すぎる場合は、この制限に調整が必要になることがあります。Oracle VM Server for SPARC では、全割り込み数を小さいセットに分けて、ゲストドメインに割り当てます。ゲストドメインに割り当てられる I/O デバイスが多すぎる場合、その割り込み供給が少なすぎるため、各デバイスにデフォルトの割り込み数を提供できないことがあります。そのため、ゲストドメインは、すべてのドライバを完全に接続する前にその割り込み供給量を使い果たしてしまいます。
ドライバの中には、その割り込み数を Oracle Solaris OS で自動的に調整できるようにするオプションのコールバックルーチンを提供するものもあります。このようなドライバにはデフォルトの制限が適用されません。
::irmpools および ::irmreqs MDB マクロを使用して、割り込みがどのように使用されているかを調べます。::irmpools マクロは、プールに分けられた割り込みの総供給量を表示します。::irmreqs マクロは、各プールにマップされているデバイスを表示します。デバイスごとに、::irmreqs は、オプションのコールバックルーチンによってデフォルトの制限が強制されるかどうか、各ドライバがリクエストした割り込みの数、および各ドライバの割り込みの数を表示します。
これらのマクロは接続に失敗したドライバの情報を表示しませんが、その情報を使用すると、デフォルトの制限を調整できる範囲を計算できます。デフォルトの制限を調整することによって、コールバックルーチンを提供せずに複数の割り込みを使用するデバイスが、より少ない数の割り込みを使用するように強制できます。このようなデバイスについては、デフォルトの制限を小さくして、ほかのデバイスで使用できる割り込みを解放します。
デフォルトの制限を調整するには、/etc/system ファイル内の ddi_msix_alloc_limit プロパティーを 1-8 の値に設定します。次に、その変更が反映されるようにシステムをリブートします。
/etc/system プロパティー値の正しい作成または更新については、/etc/system ファイルのプロパティー値の更新を参照してください。
パフォーマンスを最大にするには、開始時に大きな値を割り当て、システムが警告なしで正常にブートするまで、それらの値を少しずつ減らします。::irmpools および ::irmreqs マクロを使用して、接続されているすべてのドライバに対する調整の影響を評価します。
たとえば、ゲストドメインで Oracle Solaris OS のブート中に次の警告が出されるとします。
WARNING: emlxs3: interrupt pool too full. WARNING: ddi_intr_alloc: cannot fit into interrupt pool
::irmpools および ::irmreqs マクロは次の情報を表示します。
# echo "::irmpools" | mdb -k ADDR OWNER TYPE SIZE REQUESTED RESERVED 00000400016be970 px#0 MSI/X 36 36 36 # echo "00000400016be970::irmreqs" | mdb -k ADDR OWNER TYPE CALLBACK NINTRS NREQ NAVAIL 00001000143acaa8 emlxs#0 MSI-X No 32 8 8 00001000170199f8 emlxs#1 MSI-X No 32 8 8 000010001400ca28 emlxs#2 MSI-X No 32 8 8 0000100016151328 igb#3 MSI-X No 10 3 3 0000100019549d30 igb#2 MSI-X No 10 3 3 0000040000e0f878 igb#1 MSI-X No 10 3 3 000010001955a5c8 igb#0 MSI-X No 10 3 3
この例に示されるデフォルトの制限は 1 デバイスにつき 8 回の割り込みですが、これはシステムへの最後の emlxs3 デバイスの接続を受け入れるのに十分な割り込み数ではありません。emlxs のすべてのインスタンスが同じように動作すると考えれば、emlxs3 はおそらく 8 回の割り込みをリクエストしています。
36 回の割り込みの総プールサイズから、すべての igb デバイスで使用された 12 回の割り込みを引くことにより、24 回の割り込みを emlxs デバイスに使用できます。24 回の割り込みを 4 で割ると、1 デバイスにつき 6 回の割り込みによって、すべての emlxs デバイスが同じパフォーマンスで接続できることになります。そのため、次の調整が /etc/system ファイルに追加されます。
set ddi_msix_alloc_limit = 6
/etc/system プロパティー値の正しい作成または更新については、/etc/system ファイルのプロパティー値の更新を参照してください。
システムが警告なしで正常にブートすると、::irmpools および ::irmreqs マクロは次の更新された情報を表示します。
primary# echo "::irmpools" | mdb -k ADDR OWNER TYPE SIZE REQUESTED RESERVED 00000400018ca868 px#0 MSI/X 36 36 36 # echo "00000400018ca868::irmreqs" | mdb -k ADDR OWNER TYPE CALLBACK NINTRS NREQ NAVAIL 0000100016143218 emlxs#0 MSI-X No 32 8 6 0000100014269920 emlxs#1 MSI-X No 32 8 6 000010001540be30 emlxs#2 MSI-X No 32 8 6 00001000140cbe10 emlxs#3 MSI-X No 32 8 6 00001000141210c0 igb#3 MSI-X No 10 3 3 0000100017549d38 igb#2 MSI-X No 10 3 3 0000040001ceac40 igb#1 MSI-X No 10 3 3 000010001acc3480 igb#0 MSI-X No 10 3 3