JVM拦截磁盘事务/是否有自己的磁盘缓冲区?

时间:2013-09-26 21:06:52

标签: java asynchronous sync berkeley-db

问题:

你们知道jvm是否拦截了写在磁盘上的电话?它在应用程序和操作系统之间是否有自己的缓冲区?更具体地说,jvm可以使异步磁盘写操作看起来与应用程序同步吗?

背景

我一直在使用Berkeley DB运行一些应用程序,处于同步模式,也就是说,只有在db.put(key, value)对安全地保存到磁盘后,数据库才会返回(key, value)。要设置这样的选项,我会这样做:

envConfig.setDurability(Durability.COMMIT_SYNC);
dbConfig.setDeferredWrite(false);

上面,envConfigEnvironmentConfig对象,dbconfigDatabaseConfig对象,我用它来调整数据库的行为。

无论如何,上面的配置应该使每个put(...)调用导致磁盘事务(你可以测量,即在Linux上使用iostat),对吗?这是因为备用(具有延迟写入的COMMIT_NO_SYNC)将在不等待磁盘的情况下返回对put的调用,因此它可以缓冲大量数据以便一次写入,从而提高性能,但代价是安全

问题:

我每秒都会调用put几千次,但每秒的磁盘事务数几乎没有变化,无论我是否在数据库中设置了上述选项。

1 个答案:

答案 0 :(得分:0)

我没有提供问题的确切答案。但这是我对磁盘操作的经验。在过去,我遇到了这个问题,我对磁盘操作的期望没有在规定的时间内完成。

磁盘写入总是比写入内存慢得多。我想这里的磁盘写入取决于硬件,本机OS API和CPU分配给磁盘写操作。因此,您不应期望磁盘写入与方法调用一样快。实际上,假设打印机,磁盘等任何设备的某些性能参数,都不应编写程序逻辑。

如果您打算这样做,您必须拥有一个对帐方法,以确保在下一次操作完成之前,操作将100%完成。