【发布时间】:2013-09-26 21:06:51
【问题描述】:
问题:
你们知道写入磁盘的调用是否被 jvm 拦截了吗?它在应用程序和操作系统之间是否有自己的缓冲区?更具体地说,jvm 能否使异步磁盘写入操作看起来与应用程序同步?
背景:
我一直在使用 Berkeley DB 在同步模式下运行一些应用程序,也就是说,只有在 (key, value) 对已安全地保存到磁盘后,数据库才会返回对 db.put(key, value) 的调用。要设置这些选项,我会这样做:
envConfig.setDurability(Durability.COMMIT_SYNC);
dbConfig.setDeferredWrite(false);
上面,envConfig 是一个EnvironmentConfig 对象,dbconfig 是一个DatabaseConfig 对象,我用它来调整数据库的行为。
无论如何,上面的配置应该让每个put(...) 调用都会导致磁盘事务(您可以测量,即在Linux 上使用iostat),对吗?这是因为替代方案(COMMIT_NO_SYNC with deferred write)会在不等待磁盘的情况下返回对put的调用,因此它可以缓冲大量数据以一次性写入,从而提高性能,但牺牲了安全性。
问题:
我每秒对put 进行数千次调用,但无论我是否在数据库中设置了上述选项,每秒的磁盘事务数几乎没有变化。
【问题讨论】:
标签: java asynchronous sync berkeley-db