问题:
你们知道jvm是否拦截了写入磁盘的调用?它在应用程序和操作系统之间是否有自己的缓冲区?更具体地说,jvm 能否使异步磁盘写入操作看起来与应用程序同步?
背景:
我一直在使用 Berkeley DB 以同步模式运行一些应用程序,也就是说,数据库应该db.put(key, value)
仅在该(key, value)
对已安全地持久保存到磁盘后才返回调用。要设置这样的选项,我会:
envConfig.setDurability(Durability.COMMIT_SYNC);
dbConfig.setDeferredWrite(false);
上面,envConfig
是一个EnvironmentConfig
对象,dbconfig
是一个DatabaseConfig
对象,我用它来调整数据库的行为。
无论如何,上面的配置应该让每个put(...)
调用都导致磁盘事务(你可以测量,即iostat
在 Linux 上),对吧?这是因为替代方案(带有延迟写入的 COMMIT_NO_SYNC)会在put
不等待磁盘的情况下返回对
问题:
我每秒要进行数千次调用put
,但是无论我是否在数据库中设置了上述选项,每秒的磁盘事务数几乎都没有改变。