问题:
你们知道jvm是否拦截了写在磁盘上的电话?它在应用程序和操作系统之间是否有自己的缓冲区?更具体地说,jvm可以使异步磁盘写操作看起来与应用程序同步吗?
背景
我一直在使用Berkeley DB运行一些应用程序,处于同步模式,也就是说,只有在db.put(key, value)
对安全地保存到磁盘后,数据库才会返回(key, value)
。要设置这样的选项,我会这样做:
envConfig.setDurability(Durability.COMMIT_SYNC);
dbConfig.setDeferredWrite(false);
上面,envConfig
是EnvironmentConfig
对象,dbconfig
是DatabaseConfig
对象,我用它来调整数据库的行为。
无论如何,上面的配置应该使每个put(...)
调用导致磁盘事务(你可以测量,即在Linux上使用iostat
),对吗?这是因为备用(具有延迟写入的COMMIT_NO_SYNC)将在不等待磁盘的情况下返回对put
的调用,因此它可以缓冲大量数据以便一次写入,从而提高性能,但代价是安全
问题:
我每秒都会调用put
几千次,但每秒的磁盘事务数几乎没有变化,无论我是否在数据库中设置了上述选项。
答案 0 :(得分:0)
我没有提供问题的确切答案。但这是我对磁盘操作的经验。在过去,我遇到了这个问题,我对磁盘操作的期望没有在规定的时间内完成。
磁盘写入总是比写入内存慢得多。我想这里的磁盘写入取决于硬件,本机OS API和CPU分配给磁盘写操作。因此,您不应期望磁盘写入与方法调用一样快。实际上,假设打印机,磁盘等任何设备的某些性能参数,都不应编写程序逻辑。
如果您打算这样做,您必须拥有一个对帐方法,以确保在下一次操作完成之前,操作将100%完成。