プロセス間通信: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 |
|
|||||||||||||||||||||||||||||||||
対応関係 | 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 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
対応関係 | 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.