我在表演紅寶石(2.0.0 p39474)非常快速的文件訪問,並不斷收到異常Too many open files
紅寶石文件句柄管理(打開的文件太多)
說完看着this thread,here,以及其他各種來源,我非常瞭解操作系統限制(在我的系統上設置爲1024
)。
我的代碼執行此文件訪問mutexed,並採取形式部分:
File.open(filename, 'w'){|f| Marshal.dump(value, f) }
其中filename
受到迅速變化,根據不同的線程調用的部分上。這是我的理解,這個表格在塊之後放棄它的文件句柄。
我可以驗證使用ObjectSpace.each_object(File)
打開的File
對象的數量。據報道,內存中有多達100位居民,但只有一位是按照預期開放的。
此外,例外本身在ObjectSpace
報告的對象僅有10-40個File
時拋出。此外,手動垃圾收集無法改善這些計數,因爲通過插入sleep
調用來減慢我的腳本。
我的問題是,因此:
-
上午我從根本上誤解了OS限制的性質---它涵蓋工藝的整個生命週期?-
如果是這樣,網絡服務器在訪問ulimit -n
文件後如何避免崩潰? -
ruby是否保留其對象系統之外的文件句柄,還是內核在計算'併發'訪問時非常慢?
-
編輯20130417: strace
表示Ruby沒有它的所有數據寫入文件,返回和這樣做之前釋放互斥。因此,文件處理堆棧直到操作系統限制。
在試圖解決這個問題,我已經使用syswrite
/sysread
,同步模式,和close
之前調用flush
。這些方法都沒有奏效。
我的問題因此修改爲: 爲什麼紅寶石無法關閉其文件句柄,我該如何強制它呢?
'strace'表示ruby打開文件,然後從函數返回,在寫入數據之前釋放互斥鎖。在某些情況下,它甚至不會刷新,並在異常發生後關閉資源時(即關閉期間)寫入磁盤。 –