我们正在运行一个简单的多线程java应用程序,它使用Berkeley-DB数据库进行存储。大约有500个线程,每个线程都有自己的Berkeley-DB数据库 - 每个数据库大约有100K的值 - 密钥对。所有数据库都是事务性的,每个事务最多有大约1000个操作。没有长时间的交易。
问题在于,有时候重启我们的应用程序时,恢复Berkeley-DB需要很长时间。在恢复期间(打开环境),我们看到java进程正以大约100MB / s的速率从磁盘读取。没有写 - 只是阅读。
我们的设置是这样的:
je.env.runCheckpointer=true
je.env.runCleaner=true
je.checkpointer.highPriority=true
je.cleaner.threads=256
je.cleaner.maxBatchFiles=10
je.log.checksumRead=false
je.lock.nLockTables=353
je.maxMemory=16106127360
je.log.nDataDirectories=256
我们还尝试每15分钟手动运行检查点(假设可能检查点停止或某事)。我们还设置了setMinimizeRecoveryTime(true)
。但没有帮助。
我们假设问题可能是某些java或Berkeley DB配置。
有没有办法确保更快的恢复时间,同时牺牲放入数据库的速度?