我在运行服务后使用RocksDBJava有一段时间我可以看到“太多打开的文件”异常。通过挖掘门户网站上提到的上一个问题,我发现这是因为系统限制打开了最大数量的文件。 当我检查rocksDB正在使用的目录时,我注意到有超过100K的sst文件,大小为1KB,这可能是给定错误的原因。 我想知道有没有什么方法可以配置rocksDB来生成大尺寸的SST文件,这样创建的文件总数最少,我们可以避免这个错误。
同样在我当前的项目中有许多读线程和一个写线程,我在读取或写入rocksDB之前打开并关闭连接(使用RocksDB.open()
和RocksDB.close()
)。
答案 0 :(得分:1)
您可以使用这两个选项来创建更大的SST文件:target_file_size_base
和target_file_size_multiplier
。有关详细信息,请参阅the doc。
此外,您可以使用max_open_files
选项限制RocksDB可以打开的文件数。但是,为了获得良好的性能,我建议您增加对最大打开文件数的系统限制,并将max_open_files
配置为-1
。
答案 1 :(得分:-1)
默认情况下,当您调用RocksDB.open()
时,RocksDB读取所有WAL以恢复该内存表,然后执行flush()
将内存表写入SST文件。这就是为什么您有这么多小型SST文件的原因。
要避免此行为,请在打开数据库时将选项avoid_flush_during_recovery
设置为true。 Java版本名为avoidFlushDuringRecovery()
。另外,请勿在代码中调用冲洗或隐式冲洗(例如createCheckpoint等)。
请参见代码here。