Skip to main content
 首页 » 编程设计

Python之OSError 24(打开的文件太多)和共享内存

2025年05月04日10lautakyan007

我遇到了在我的 mac os x 上用 python 脚本引发异常 OSError 24(“打开的文件太多”)的问题。

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

resource.getrlimit(resource.RLIMIT_NOFILE) 

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

我的脚本生成了多个子进程并分配了共享内存段。分配共享内存段时发生异常。我用 sysv_ipc module .

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

ipcs -b -m 

给出的数量绝对更少(不超过 40 个片段)。

请您参考如下方法:

问题出在共享内存系统设置 ( shared memory – wiki ) 中。

在/etc/sysctl.conf 文件中有一个参数kern.sysv.shmseg,它表示每个进程可以附加的最大共享内存段数。所以我的值 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