2

我遇到的问题是在 python 脚本中我的 mac os x 上出现异常 OSError 24(“打开的文件太多”)。

我不知道是什么导致了这个问题。lsof -p 显示大约 40-50 行,我的 ulimit 是 1200(我检查使用

resource.getrlimit(resource.RLIMIT_NOFILE)

),返回元组 (1200, 1200)。所以我甚至没有超过限制。

我的脚本产生了许多子进程并分配了共享内存段。分配共享内存段时发生异常。我使用sysv_ipc 模块

另外我知道我允许的共享内存段的总数足够大(128 段),并且命令

ipcs -b -m

给出的数量肯定更少(不超过 40 段)。

4

1 回答 1

2

问题在于共享内存系统设置(共享内存 - wiki)。

kern.sysv.shmseg文件中有一个参数/etc/sysctl.conf表示每个进程可以附加的最大共享内存段数。所以我的值 32 对我的脚本来说还不够。

要查看参数,请使用:

sysctl -A | grep shm

要更新该参数,请编辑文件:

sudo vim /etc/sysctl.conf

我现在的样子是这样的:

kern.sysv.shmmax=564777216
kern.sysv.shmmin=1
kern.sysv.shmmni=700
kern.sysv.shmseg=128
kern.sysv.shmall=131072

请注意,您需要重新启动系统才能应用设置。

要查看当前分配的共享内存段,请键入:

ipcs -m -b

要删除所有共享内存段:

for n in `ipcs -b -m | egrep ^m | awk '{ print $2; }'`; do ipcrm -m $n; done

请注意,只有未附加到任何进程的段才会被真正删除。

更多关于共享内存设置:http : //techjournal.318.com/general-technology/shared-memory-settings-explain/,http : //www.spy-hill.com/help/apple/SharedMemory.html,http ://support.apple.com/kb/HT4022

于 2012-11-30T08:02:48.653 回答