0

问题:

你们知道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,但是无论我是否在数据库中设置了上述选项,每秒的磁盘事务数几乎都没有改变。

4

1 回答 1

0

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

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

如果您打算这样做,则必须有一个协调方法,以确保操作将 100% 完成,然后才能完成下一个操作。

于 2013-09-27T08:45:53.693 回答