【问题标题】:Does the JVM intercept disk transactions/have its own disk buffer?JVM 是否拦截磁盘事务/有自己的磁盘缓冲区?
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多