相关疑难解决方法(0)

Ubuntu 8.04上打开文件太多错误

mysqldump: Couldn't execute 'show fields from `tablename`': Out of resources when opening file './databasename/tablename#P#p125.MYD' (Errcode: 24) (23)
Run Code Online (Sandbox Code Playgroud)

检查shell上的错误24,它说

>>perror 24

OS error code  24:  Too many open files
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

mysql linux ubuntu-8.04 mysqldump

12
推荐指数
3
解决办法
3万
查看次数

Ruby文件句柄管理(打开文件太多)

我在ruby(2.0.0 p39474)中执行非常快速的文件访问,并继续获得异常 Too many open files

看了这个帖子,这里和其他各种来源,我很清楚操作系统限制(设置1024在我的系统上).

执行此文件访问的代码部分是互斥的,并采用以下形式:

File.open( filename, 'w'){|f| Marshal.dump(value, f) }
Run Code Online (Sandbox Code Playgroud)

哪里filename有快速变化,取决于调用该部分的线程.我的理解是这个表单在块之后放弃了它的文件句柄.

我可以验证File打开的对象数量ObjectSpace.each_object(File).这报告内存中最多有100个驻留,但只有一个是开放的,正如预期的那样.

此外,异常本身在File报告的对象只有10-40个时抛出ObjectSpace.此外,手动垃圾收集无法改善任何这些计数,因为通过插入sleep调用来减慢我的脚本速度.

我的问题是:

  • 我是否从根本上误解了操作系统限制的性质 - 它是否涵盖了流程的整个生命周期?
    • 如果是这样,Web服务器如何在访问ulimit -n文件后避免崩溃?
    • ruby是否在其对象系统之外保留其文件句柄,或者内核在计算"并发"访问时速度非常慢?

编辑20130417: strace表示ruby不会将所有数据写入文件,在执行此操作之前返回并释放互斥锁.因此,文件处理堆栈直到操作系统限制.

为了解决这个问题,我使用了syswrite/ sysread,同步模式,flush之前调用过close.这些方法都不起作用.

我的问题因此被修改为: 为什么ruby无法关闭其文件句柄,我怎么能强迫它这样做呢?

ruby file-io limits

6
推荐指数
1
解决办法
1777
查看次数

标签 统计

file-io ×1

limits ×1

linux ×1

mysql ×1

mysqldump ×1

ruby ×1

ubuntu-8.04 ×1