nicovidaemonでshm_put_var Failedが連発していた問題について

php_error.logに以下のエラーが表示されていた。
[25-Mar-2010 20:40:02] PHP Warning:  shm_put_var(): not enough shared memory left in /usr/home/nicovide/nicovide/daemonListen_class.php on line 415

OS側の共有メモリのサイズ設定が小さい可能性を疑って調べてみた。
naname@madison<122>sysctl -a | grep shm
kern.ipc.shm_allow_removed: 0
kern.ipc.shm_use_phys: 0
kern.ipc.shmall: 8192
kern.ipc.shmseg: 128
kern.ipc.shmmni: 192
kern.ipc.shmmin: 1
kern.ipc.shmmax: 33554432

これらのパラメータはカーネルのオプションでも指定可能っぽい。/usr/local/sys/conf/NOTESに以下の記述があった。
# Maximum number of shared memory pages system wide.
options         SHMALL=1025

# Maximum size, in bytes, of a single System V shared memory region.
options         SHMMAX=(SHMMAXPGS*PAGE_SIZE+1)
options         SHMMAXPGS=1025

# Minimum size, in bytes, of a single System V shared memory region.
options         SHMMIN=2

# Maximum number of shared memory regions that can be used on the system
# at one time.
options         SHMMNI=33

# Maximum number of System V shared memory regions that can be attached to
# a single process at one time.
options         SHMSEG=9

/usr/src/sys/i386/conf/GENERICにはこれらは定義されていなかったので、sysctlの値がどう決定されたのかは不明。
変更する必要があるのであれば、kern.ipc.shmallとkern.ipc.shmmaxを設定すれば良さそう。

しかし問題になったmadisonには30M近く割り当てられていた。そんなに消費するはずは無いと思ったので、実際に使われているサイズを調べてみた。
http://www.jp.freebsd.org/cgi/mroff.cgi?sect=1&cmd=&lc=1&subdir=man&dir=jpman-5.4.0%2Fman&man=ipcs

Shared Memory:
T           ID          KEY MODE        OWNER    GROUP    CREATOR  CGROUP         NATTCH        SEGSZ         CPID         LPID ATIME    DTIME    CTIME
m        65536          488 –rw-rw-rw- root     wheel    root     wheel               0        10000          669          669 10:32:29 10:32:29 10:32:29
m      1310721          492 –rw-rw-rw- root     wheel    root     wheel               0        10000        22563        34774 21:39:40 21:39:40 18:35:38
m        65539          491 –rw-rw-rw- root     wheel    root     wheel               0        10000        41458        41458 16:11:00 16:11:00 16:11:00
m       983044          490 –rw-rw-rw- root     wheel    root     wheel               0        10000        28489        28486 21:39:37 21:39:37 20:42:31

SEGSZ(たぶんサイズ?)がすべて10000。これを見てピンと来た。

shm_attach — 共有メモリセグメントを作成またはオープンする

memsize
メモリのサイズ。省略した場合のデフォルトは php.inisysvshm.init_mem、あるいは 10000 バイトとなります。

nicovidaemonのコマンドが17+1(cmdcount)個。コマンド1個につき保存する項目が4つ(success,failed,timeout,time)。
18*4*PHP_INT_SIZE(環境によるらしいけどmadisonでは4)=288
到底10000バイトには及ばないけど、メモリの使い方にオーバーヘッドがあるのかもしれない。INT型以外も保存出来るようになってるし。

20000バイト確保するようにして様子を見ることにする。

コメントを残す