プロセス間通信:System V IPC(Inter Process Communication)


1.共有メモリ

【概要】

共有メモリは、複数プロセスでアクセスすることが出来る、共通のメモリ空間です。

【パラメタ概要】

表1.共有メモリのカーネルパラメタ

パラメタ 概要
SHMMAX 共有メモリセグメントの最大サイズをバイト単位で指定します。
SHMMIN 共有メモリセグメントの最小サイズをバイト単位で指定します。
SHMMNI システム全体における共有メモリIDの総数を指定します。
SHMSEG 1つのプロセスでアタッチ(接続)することが出来る最大の共有メモリセグメント数を指定します。

【各パラメタの関係】

共有メモリの本体(メモリ空間)は、プロセスのshmget(2) システムコールによって動的に割り当てられます。パラメタの関係を図1に示します。プロセスの親子関係で共有するメモリと、親子ではない別プロセスから共有することのできるISM(Intimated Shared Memory:親和型共有メモリ)の2種類があります。

図1.共有メモリパラメタの関係

 

2.メッセージキュー

【概要】

メッセージキューは、プロセスとプロセスの間で、メッセージと呼ばれるデータを送受信する機能です。

【パラメタ概要】

表2.メッセージキューのカーネルパラメタ

パラメタ 概要
MSGMAP【備考】 メッセージセグメント管理に使用する制御マップの数を指定します。
MSGMAX 一つのメッセージに入れることが出来る最大長をバイト単位で指定します。
MSGMNB 一つのメッセージキューに入れることが出来るバイト数の最大値を指定します。
MSGMNI システム全体におけるメッセージIDの総数を指定します。
MSGSEG【備考】 システム内のメッセージセグメント総数を指定します。
MSGSSZ【備考】 メッセージセグメント一つのサイズをバイト単位で指定します。
MSGTQL システム全体のメッセージヘッダ数を指定します。

【備考】Solaris 8より廃止になりました。

【各パラメタの関係】

メッセージキュー機能制御のための領域は、システムで最初にメッセージキュー要求が使用された時、カーネルメモリ内に初期化されます。使用者プログラムは、msgget(2)システムコールで得られるメッセージID(msgid)に対して、送信側はmsgsnd(2)、受信側はmsgrcv(2)システムコールでメッセージ(データ)を送受信します。msgget(2)システムコールで得られるメッセージIDの個数は、MSGMNIで指定します。一つのmsgsnd(2)で転送される最大のメッセージ長は、MSGMAXによって制御されます。一つのメッセージID毎に送信可能なメッセージキューの最大長は、MSGMNBによって制限されます。これらの関係を図2に示します。

図2.メッセージキューパラメタの関係

各々のメッセージは、メッセージヘッダを持っています。システム内のメッセージヘッダ総数は、MSGTQLで制限されます。メッセージ本体はMSGSSZの単位で区分(セグメント)化されます。MAGMAPはこのセグメントを管理します(Solaris以外のセグメント管理型UNIX System V IPC)。図3にこの関係を示します。

図3.メッセージヘッダとメッセージ本体の関係

 

3.セマフォ

【概要】

セマフォ(semaphore:腕木信号機のことです)は、複数のプロセス間で処理の同期や待ちを制御したり、排他制御等の処理を行うための機能です。

【パラメタ概要】

表3.セマフォのカーネルパラメタ

パラメタ 概要
SEMAEM 一つのundo構造体にセットできる値の最大値を指定します。
SEMMAP【備考1】 セマフォセットを管理するために使用する制御マップのサイズを指定します。
SEMMNI システム全体のセマフォ識別子(ID) の総数を指定します。
SEMMNS システム全体のセマフォ総数を指定します。
SEMMNU システム全体のundo構造体の数を指定します。
SEMMSL セマフォ識別子(ID)毎のセマフォ最大数を指定します。
SEMOPM semop(2)システムコール毎に実行できる最大のセマフォ操作数を指定します。
SEMUME プロセスあたりのundo構造体の最大数を指定します。
SEMUSZ【備考2】 undo構造体のサイズです。
SEMVMX セマフォ値(semval)の最大を指定します。

【備考】

1. Solaris 8より廃止になりました。
2. Solaris 8より、別の値を指定しても96バイト固定となります。


【各パラメタの関係】

SEMMNI、SEMMSL、及びSEMMNSの関係は図4のようになります。

図4.セマフォパラメタの関係

使用者プログラムは、semget(2)システムコールのセマフォ数によって割り当てられるsem構造体をもとに、semop(2)システムコールを使用してセマフォを操作します。この時、プロセスごとに割り当てられる、semu構造体が操作されます。semu構造体を示すアドレスは、sem_undo配列にセットされます。semu構造体の配列は、SEMUSZ X SEMMNUのサイズで、カーネルメモリ内に作成されます。

図5.sem_undoとSEMU 構造体の関係

 

4.Solarisの実際

表4にSolarisの実際を示します。

表4.SolarisのIPCパラメタ

IPCの種類 パラメタ【備考1】 性質 単位 設定範囲【備考2】 省略時値【備考3】
共有メモリ SHMMAX リミッタ バイト 0〜MAXINT 1048576
SHMMIN リミッタ バイト 1〜物理メモリの総量 1
SHMMNI 静的構造体配列 配列数 0〜MAXINT 100
SHMSEG リミッタ 個数 0〜32767 6
メッセージキュー MSGMAX リミッタ バイト 0〜物理メモリの総量 2048
MSGMNB リミッタ バイト 0〜物理メモリの総量 4096
MSGMNI 静的構造体配列 個数 0〜MAXINT 50
MSGTQL リミッタ 個数 0〜MAXINT 40
セマフォ SEMAEM リミッタ バイト 0〜65535 16384
SEMMNI 静的構造体配列 配列数 1〜65535 10
SEMMNS リミッタ 個数 1〜MAXINT 60
SEMMNU リミッタ 個数 1〜MAXINT 30
SEMMSL リミッタ 個数 1〜MAXINT 25
SEMOPM リミッタ 個数 1〜MAXINT 10
SEMUME リミッタ 個数 1〜MAXINT 10
SEMVMX リミッタ 個数 1〜65535 32767
【備考】
1.赤字はシステム全体として合計し、設定する必要のあるパラメタです。
2.MAXINTはインテジャーの最大値で、4,294,967,294(232-1)、4ギガバイトです。
3.Solaris 2.6、および8の省略時値です。

【注意】
1.共有メモリ制御関連の構造体合計サイズが大き過ぎるとエラーになることがあります。
  エラーメッセージ
    WARN: shmsys: can't load module, too much memory requested.
  エラーの条件
    SHMMNI×shmid_ds(共有メモリID構造体)サイズ+
    SHMMNI×ミューテックス構造体サイズの合計が利用可能カーネルメモリの1/4(25パーセント)以上。

2.メッセージ制御関連の構造体合計サイズが大き過ぎるとエラーになることがあります。
  エラーメッセージ
    WARN: msgsys: can't load module, too much memory requested.
  エラーの条件
    MSGMNI×msgid_ds(メッセージID構造体)サイズ+
    MSGMNI×メッセージロック構造体サイズ+
    MSGTQL×メッセージヘッダサイズの合計が利用可能カーネルメモリの1/4(25パーセント)以上。

3.セマフォ制御関連の構造体合計サイズが大き過ぎるとエラーになることがあります。。
  エラーメッセージ
    WARN: semsys: can't load module, too much memory requested.
  エラーの条件
    SEMMNI×semid_ds(セマフォID構造体)サイズ+
    SEMMNS×sem構造体サイズ+
    SEMMNI×ミューテックス構造体サイズ+
    プロセス構成数×undo構造体サイズの合計(SEMUSZ×SEMMNU)+
    SEMUSZ×SEMMNU×4(intのサイズ)の合計利用可能カーネルメモリの1/4(25パーセント)以上。
  なお、SEMUSZは96バイトの固定です。

 

 

5.IPCパラメタの決め方

システムで使用されるIPCリソースを使用するプログラムを全部まとめて、合計すべきものは合算して求めます。最大値(または最小値)を取るパラメタもあります。IPCリソースを使用するプロダクト(以下単にソフトウェアと記述します)によって、決めうちの値を、/etc/systemファイルに設定するよう、ドキュメントに書かれているものをよく見かけます。ドキュメントに従って、その通り、/etc/systemファイルに設定することは大変危険です。なぜならば、ドキュメントの多くは自分のことしか考えていないために、合計すべきものとリミッタの関係が崩れてしまう可能性があるためです。

IPCパラメタの決定手順

(1)各ソフトウェアで必要なIPCリソースを調べる
  横罫にIPCリソース、横罫に各ソフトウェアの必要な量を書き留める。

(2)次の計算式で各IPCリソースの値を求める

  ●共有メモリ
  SHMMNI:各ソフトウェアで使用するID数を合計して求める。
  SHMMAX:各ソフトウェアの最も大きい値を求める。
  SHMSEG:各ソフトウェアの最も多い値を求める。

  ●メッセージキュー
  MSGMNI:各ソフトウェアで使用するID数を合計して求める。
  MSGMNB:各ソフトウェアの最も大きい値を求める。
  MSGTQL:各ソフトウェアがキューするメッセージの合計を求める。

  ●セマフォ
  SEMMNI:各ソフトウェアで使用するID数を合計する。
  SEMMSL:各ソフトウェアで使用するID毎のセマフォ数を求める。
  SEMMNS:各ソフトウェアで使用するsem構造体数を合計して求める。
  SEMMNU:各ソフトウェアで使用するID毎のundo構造体数を合計して求める。

  なお、他のパラメタは各ソフトウェアで要求された値を記録し、最大値(または最小値)を確認します。

(3)/etc/systemファイルに設定してシステムを再ブート
これらをまとめ、/etc/systemファイルにパラメタをセットします。システム再ブートにより、設定が反映されます。

IPCパラメタの具体的決定例

(1)各ソフトウェアで必要なIPCリソースを調査
例はORACLE、JP1、およびS-NetBackupの例です。ORACLEはバージョンによって計算式が違いますので注意してください。また、構成する機能、プロセス数等で変化します。JP1も同様にスケジューラ数やサービス数によって計算式が違います。ベリタスのS-NetBackupもバージョンによって計算式が違いますが、この調査例は、ベンダーがまじめな値をドキュメントに記述しているとはとても思えません(セマフォIDをソフトウェアが300個もとって、各々でセマフォ値を制御することを想像してください。筆者には絶対に無理です…)。あくまでも例とお考えください。

表5.各ソフトウェアのIPCリソース調査例

IPCの種類 パラメタ ORACLE JP1 S-NetBackup
共有メモリ SHMMAX 745248000 207258 8388608
SHMMIN     1
SHMMNI 1 4 100
SHMSEG   4 10
メッセージ
キュー
MSGMAX      
MSGMNB     65536
MSGMNI      
MSGTQL     500
セマフォ SEMAEM      
SEMMNI 2 5 300
SEMMNS 524 5 300
SEMMNU   335 600
SEMMSL     300
SEMOPM 100      
SEMUME       
SEMVMX       

(2)IPCリソースの値を計算する
表5を元に、省略時値と並べ、各々計算します。表6に計算例を示します。

表6.IPCパラメタの計算例

IPCの種類 パラメタ 省略時値 計算値 決定した値の具体例 決定根拠
共有メモリ SHMMAX 1048576 745248000 1073741824 ORACLEの最大値を上回っている値とした【備考1】
SHMMIN 1 1 1 省略時値をそのまま流用する【備考2、3】
SHMMNI 100 105 128 3ソフトウェアの合計をやや上回る値とした。
SHMSEG 6 10 10 S-NetBackupの最大値を使用する。
メッセージ
キュー
MSGMAX 2048     省略時値をそのまま流用する【備考3】
MSGMNB 4096 65536 65536 S-NetBackupの最大値を使用する。
MSGMNI 50     省略時値をそのまま流用する【備考3】
MSGTQL 40 500 512 S-NetBackupの最大値をやや上回る値とした。
セマフォ SEMAEM 16384     省略時値をそのまま流用する【備考3】
SEMMNI 10 307 320 3ソフトウェアの合計をやや上回る値とした。
SEMMNS 60 829 896 3ソフトウェアの合計をやや上回る値とした。
SEMMNU 30 935 1024 3ソフトウェアの合計をやや上回る値とした。
SEMMSL 25     省略時値をそのまま流用する【備考3】
SEMOPM 10 128 128 ORACLEの最大値を上回っている値とした。
SEMUME 10     省略時値をそのまま流用する【備考3】
SEMVMX 32767     省略時値をそのまま流用する【備考3】

【備考】

1. よく、最大値の4ギガバイト(4294967294)を指定することがあります(筆者の好みです)。これにより、メモリ増設等があっても新たな値に変更しなおす必要がありません。
2. SHMMINは、稀にシステムの特性として、小さい値の共有メモリアタッチをエラーにするような場合、値を大きくしても良いです。しかし、一般的に、チューニングすることはありません。
3. 省略時と同じ値をわざわざ/etc/systemファイルに指定するのは、後の管理が煩雑になります。また、誤った値を指定してしまうなどの弊害があります。本コンテンツでは、省略時値はファイルに指定しないことをお勧めします。

 

(3)/ec/systemファイルに設定
表6の、「決定した値の具体例」を、次のように/etc/systemファイルに記述します。あとは、システムを再ブートすることで設定が反映されます。


set shmsys:shminfo_shmmax=1073741824
set shmsys:shminfo_shmmni=128
set shmsys:shminfo_shmseg=10

set msgsys:msginfo_msgmnb=65536
set msgsys:msginfo_msgtql=512

set semsys:seminfo_semmni=320
set semsys:seminfo_semmns=896
set semsys:seminfo_semmnu=1024
set semsys:seminfo_semopm=128

 図6.IPCカーネルチューニングパラメタの記述例

 

6.参考

ipcsコマンド-aオプションやtrussコマンド-fオプション等の出力で、IPCパラメタを確認したり、チューニングパラメタを確認することができます。値の根拠を調べる際、ソースコードの無いソフトウェア、またはドキュメントに記述されていない場合に有効です。

セマフォ 出力
truss -f semget(536012080, 154, 0640|IPC_CREAT|IPC_EXCL) = 196608
ipcs -a
T ID KEY MODE OWNER GROUP CREATOR CGROUP NSEMS OTIME CTIME
Semaphores:
s 196608 0x1ff2e530 --ra-r----- oracle dba oracle dba 154 17:42:22 10:31:59
対応関係 semgetの戻り値=セマフォID
semgetの第1引き数=KEY(16進数で表示されています)。
semgetの第2引き数=NSEMS(SEMMSLパラメタに相当します)。
Semaphores:で表示される行=SEMMNIパラメタに行数以上の値が指定されているはずです)。

図7.ipcsとsemgetの関係


セマフォ 出力
truss -f semop(131072, 0xFFBECAF0, 100) = 0
対応関係 semopの第3引き数=SEMOPMパラメタに相当します。

図8.semopとSEMOPMパラメタの関係


セマフォ 出力
truss -f semctl(196608, 1, 8, 19148) = 0
対応関係 semctlの第1引き数=セマフォID
semctlの第4引き数=SEMVMXパラメタに相当します。

図9.semctlとSEMVMXパラメタの関係


共有メモリ 出力
truss -f shmget(1466357072, 386424832, 0640|IPC_CREAT|IPC_EXCL) = 129
ipcs -a
T ID KEY MODE OWNER GROUP CREATOR CGROUP NATTCH SEGSZ CPID LPID ATIME DTIME CTIME
Shared Memory:
m 0 0x50000c0d --rw-r--r-- root root root root1 1 4 264 264 10:26:54 10:26:54 10:26:54
m 129 0x5766d550 --rw-r----- oracle dba oracle dba 11 386424832 445 469 10:32:09 10:32:35 10:31:58
対応関係 shmgetの戻り値=共有メモリID
shmgetの第一引き数=KEY(16進数で表示されています)。
shmgetの第二引き数=SEGSZ(SHMMAXパラメタにこれ以上の値が指定されていれば可です)。
Shared Memory:で表示される行=SHMMNIパラメタに行数以上の値が指定されているはずです)。

図10.ipcsとshmgetの関係


メッセージキュー:T.B.D


Copyright (C) 2004 by The Art of Computer Technologies, Corp.  All rights reserved.