【问题标题】:RocksDB: Too many SST files of very small sizeRocksDB:太多非常小的 SST 文件
【发布时间】:2017-08-04 15:14:47
【问题描述】:

我在运行服务一段时间后使用 RocksDBJava,我可以看到“打开的文件太多”异常。挖掘了门户网站上提到的上一个问题,我发现这是因为系统限制打开最大文件数。 当我检查 RocksDB 正在使用的目录时,我注意到有超过 100K 大小为 1KB 的 sst 文件,这可能是给定错误的原因。 我想知道有什么方法可以配置rocksDB生成大尺寸的SST文件,这样创建的文件总数最少,我们可以避免这个错误。

此外,在我当前的项目中,有许多读取线程和一个写入线程,我在读取或写入 RocksDB 之前打开和关闭连接(使用 RocksDB.open()RocksDB.close())。

【问题讨论】:

    标签: java rocksdb


    【解决方案1】:

    您可以使用这两个选项来创建更大的 SST 文件:target_file_size_basetarget_file_size_multiplier。详情请见the doc

    另外,您可以使用max_open_files 选项来限制 RocksDB 可以打开的文件数量。不过,为了获得好的性能,建议你增加系统最大打开文件数限制,将max_open_files配置为-1

    【讨论】:

    • 谢谢,您能帮我在 JavaRocks 中设置这些值吗?
    • 我检查了 API,但找不到使用 java API 设置这些值的任何方法。
    • @AmanSinghal Java API 似乎使用了另一个命名规则:org.rocksdb.Options, setTargetFileSizeBase, setTargetFileSizeMultiplier, setMaxOpenFiles
    • 你查的是哪个版本,我在5.1.2版本找不到这个方法。
    • 另外,我在生成的选项文件中检查了 target_file_size_base 的值,它显示为 67108864 值,非常大,我仍然无法理解为什么它会创建太多的 sst 文件。
    【解决方案2】:

    默认情况下,当您调用 RocksDB.open() 时,RocksDB 会读取所有 WAL 以恢复 memtable,然后执行 flush() 将 memtable 写入 SST 文件。这就是为什么你有这么多小 SST 文件的原因。

    为避免此行为,请在打开数据库时将选项 avoid_flush_during_recovery 设置为 true。 Java 版本名为avoidFlushDuringRecovery()。此外,切勿在代码中调用 flush 或隐式刷新(例如 createCheckpoint 等)。

    查看代码here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多