主要メッセージの手引き

ENOMEM The available data space is not large enough to accommodate the shared memory segment

原因

ENOMEM エラーは、Lotus Notes が 80 個のセグメントを割り当てたあとに発生します。

対処方法

Solaris ISM (Intimate Shared Memory) の設計と実装が、Lotus Notes アプリケーションで ENOMEM 障害を引き起こす原因です。特定のプロセスに割り当てられる共用メモリーセグメント数が限界に達したためです。

限界に達したのは、システムファイルに設定した shmsys:share_page_table というシステム変数のために、ISM モードで全共用メモリーセグメントを割り当てたためです。

共用メモリーセグメントが ISM モードで割り当てられると、オペレーティングシステムは、全割り当てプロセス間でマップ情報が 1 つのコピーだけ共用されるように、共用メモリーセグメントを物理メモリーにロックし、仮想アドレスと物理アドレスのマッピングを調整します。このためには、セグメントの仮想開始アドレスには 16M バイト (16 進数で 0x1000000) = 16777216 バイトごとのアドレスの境界に位置している必要があります。

NULL アドレスを指定すると、システムが、どの仮想アドレスにセグメントを割り当てるかを決定します。システムはまた、0x3000000 だけ離れたアドレスを割り当てます (ただし、0x1000000 だけ離れたアドレスに割り当てるように指定されている場合は除きます)。

計算により、sun4d では、最高で 220 個の 1M バイトの ISM セグメントを作成および割り当てられること、sun4m では、最高で 235 個の 1M バイトの ISM セグメントを作成および割り当てられることがわかります (セグメントが 0x1000000 だけ離れるように指定した場合)。

ISM が限界の原因であることがわかりました。どのような対処法があるかを説明します。

第 1 に、限界によって Lotus Notes は合計 80M バイトの共用メモリーを割り当てられます。Lotus が推奨しているように、セグメントのサイズを 10M バイト にすると、これまで 80 個の 1M バイトセグメントが必要だったメモリー要求を、8 つの ISM セグメントで処理できます。ISM アドレス指定限界に達せずに、800M バイトまでのメモリー要求を処理できます。

第 2 に、share_page_table (ISM) フラグをオフにする方法があります。こうすると、sun4m は、3000 個を超える 1M バイトのセグメントを作成できます。ここでの問題は、ISM は実は共有メモリーアクセスの性能を向上させていること (したがって、オフにすることは性能を低下させることを意味すること)、そして顧客が 2.5.x へ移行する場合は 、ISM がこの種の共有メモリーの負荷に関してこれまでにわかっている別の一連の問題を解決するために必要とされることです。

第 3 に、Lotus が、Notes サーバが割り当てアドレスを追跡し、0x1000000 境界アドレスで割り当てられるように Notes サーバを変更する方法があります (システムのデフォルトでは、0x3000000 アドレス境界を使用します)。前述したように、sun4m では、これで Notes サーバを 235 個のセグメントまで拡張できます。