在运行RocksDBJava服务一段时间后,我看到了“打开的文件太多”的异常。通过在门户上提到的上一个问题的挖掘,我发现这是因为系统限制打开最大数量的文件。当我检查rocksDB正在使用的目录时,我注意到有超过100K的1KB大小的sst文件,这可能是导致给定错误的原因。我想知道是否有任何方法可以配置rocksDB来生成大尺寸的SST文件,以便创建的文件总数最小,并且我们可以避免此错误。
另外,在我当前的项目中,有许多读线程和一个写线程,在读或写rocksDB之前,我会打开和关闭连接(使用RocksDB.open()
和RocksDB.close()
)。
发布于 2017-08-06 16:26:06
您可以使用以下两个选项来创建更大的SST文件:target_file_size_base
和target_file_size_multiplier
。详情请参见the doc。
此外,您还可以使用max_open_files
选项来限制RocksDB可以打开的文件数量。但是,为了获得良好的性能,我建议您增加系统对打开文件的最大数量的限制,并将max_open_files
配置为-1
。
发布于 2018-07-26 11:02:13
默认情况下,当您调用RocksDB.open()
时,RocksDB读取所有WAL以恢复内存,然后执行一个flush()
,将内存写为SST文件。这就是为什么你有这么多小的SST文件。
要避免此行为,请在打开DB时将选项avoid_flush_during_recovery
设置为true。Java版本名为avoidFlushDuringRecovery()
。此外,永远不要调用flush或执行隐式刷新(如createCheckpoint等)。在你的代码中。
请参阅代码here。
https://stackoverflow.com/questions/45510290
复制相似问题