質問:
ディスクへの書き込みの呼び出しがjvmによって傍受されるかどうか知っていますか? アプリケーションと OS の間に独自のバッファーがありますか? より具体的には、jvm は、非同期のディスク書き込み操作をアプリケーションに対して同期しているように見せることができますか?
バックグラウンド:
私はいくつかのアプリケーションを Berkeley DB で同期モードで実行しています。つまり、データベースは、ペアが安全にディスクに永続化されdb.put(key, value)
た後にのみ呼び出しを返すことになっています。(key, value)
このようなオプションを設定するには、次のようにします。
envConfig.setDurability(Durability.COMMIT_SYNC);
dbConfig.setDeferredWrite(false);
上記envConfig
はEnvironmentConfig
オブジェクトでdbconfig
ありDatabaseConfig
、データベースの動作を調整するために使用するオブジェクトです。
とにかく、上記の構成は、すべての呼び出しを行ってディスク トランザクションを発生させることになっています (これは Linuxput(...)
で測定できます)。iostat
これは、別の方法 (据え置き書き込みを伴う COMMIT_NO_SYNC) がput
、ディスクを待たずに への呼び出しを返すため、大量のデータを一度に書き込むためにバッファーに入れ、安全性を犠牲にしてパフォーマンスを向上させるためです。
問題:
毎秒数千回の呼び出しを行ってput
いますが、データベースで上記のオプションを設定してもしなくても、毎秒のディスク トランザクション数はほとんど変わりません。