################################################################################ SunOS 5.6 Solaris2.6.x ################################################################################ カーネル・コンフィグレーション・ファイル(/etc/system)の変更 ################################################################################ ●セグメントサイズ/セグメント数を変更しメッセージキューに保持可能なデータサイズに 関する調査 ################################################################################ /etc/systemの既存設定 set msgsys:msginfo_msgmap=512 set msgsys:msginfo_msgmax=512000 set msgsys:msginfo_msgmnb=512000 set msgsys:msginfo_msgmni=1600 set msgsys:msginfo_msgseg=1000000 set msgsys:msginfo_msgtql=15000 set msgsys:msginfo_msgssz=128 ################################################################################ >sysdefの表示内容 * IPC Messages 512 entries in msg map (MSGMAP) 512000 max message size (MSGMAX) 512000 max bytes on queue (MSGMNB) 1600 message queue identifiers (MSGMNI) 128 message segment size (MSGSSZ) 15000 system message headers (MSGTQL) 16960 message segments (MSGSEG) ################################################################################ ################################################################################ ■@■/etc/systemにてセグメントサイズ・セグメント数を変更し再起動後、 1kbyteのメッセージをメッセージキューに送信しキューイングする。 +-------------+------------------+------------+--------------------------+-----+ |セグメント数 | セグメントサイズ | 数×サイズ |メッセージキューにキュー |送信 | |の設定値(個) | の設定値(byte) | (Mbyte) |イング可能なサイズ(Mbyte) | 数 | +-------------+------------------+------------+--------------------------+-----+ | 16960 | 64 | 1.035 | 1.035 | 1060| | 16960 | 128 | 2.070 | 2.070 | 2120| | 16960 | 256 | 4.141 | 4.141 | 4240| | 33920 | 128 | 4.141 | 4.141 | 4240| +-------------+------------------+------------+--------------------------+-----+ 上記1行目の解説:64バイトのデータを16960個送信可能なシステム設定の時、1キロバイ トのデータを送信したところ、キューイング可能な数が1060個でありト ータルのキューイングサイズは1.035MByteであった。 ################################################################################ ■A■64kbyteのメッセージをメッセージキューに送信しキューイングする。 +-------------+------------------+------------+--------------------------+-----+ |セグメント数 | セグメントサイズ | 数×サイズ |メッセージキューにキュー |送信 | |の設定値(個) | の設定値(byte) | (Mbyte) |イング可能なサイズ(Mbyte) | 数 | +-------------+------------------+------------+--------------------------+-----+ | 16960 | 128 | 2.070 | 0.5488 | 9| +-------------+------------------+------------+--------------------------+-----+ ※セグメント数8480は設定できなかった。 結論)システム全体でメッセージキューにキューイング可能なサイズは 【セグメント数】×【セグメントサイズ】 となる。 しかし、64Kbyteデータをキューイングしたところ、Aの様に約2Mのメッセージ キュー領域に0.55程度のメッセージしかキューイングできない。 @では1Kbyteなら2Mまでキューイングできているので、大きなデータではセグ メントを有効に使えていないと考えらる。 ################################################################################ ■B■メッセージキューを複数生成し、65535byteのデータを各キューに送信しキューイ ングする。msgsnd()がerrno:EAGAINを返した時点での送信したデータサイズの合計 をメッセージキューMAXデータサイズと判断する。 +-------------+------------------+------------+--------------------------+ |セグメント数 | セグメントサイズ | 数×サイズ |メッセージキューにキュー | |の設定値(個) | の設定値(byte) | (Mbyte) |イング可能なサイズ(Mbyte) | +-------------+------------------+------------+--------------------------+ | 8 | 65535 | 0.5 | 0.5 | | 400 | 65535 | 25.0 | 25.0 | | 600 | 65535 | 37.5 | 37.5 | | 700 | 65535 | 43.7 | 43.7 | | 800 | 65535 | 50.0 | - |*1 | 3200 | 65535 | 200.0 | - |*1 | 6400 | 65535 | 400.0 | - |*1 +-------------+------------------+------------+--------------------------+ *1:設定はできたが、メッセージキューの生成時(msgget)にシグナル「SIGSYS」が発生 する。 結論)65535byteのメッセージキューでは700〜800個の間で上限がある。 これはシステムリソースの問題とも考えられるため、各環境で調査する必要が 有る。 ################################################################################ ■C■セグメントサイズ以下のデータのキューイングについて セグメントサイズ128byte/セグメント数16960個の場合は、128byteのデータ16960 個をメッセージキューにキューイングできる設定である。 @では、システムリソースの関係で2000個程度しかキューイングできない。 リソースの上限が無い場合に、セグメントサイズ以下のデータをキューイングさせ た場合は、16960個のキューイングが可能と考えられるがetc/systemにて set msgsys:msginfo_msgtql=15000 の値が有効となり、これがキューイングの上限 となる場合がある。