1

Berkeley Db を使用するアプリケーションを開発しています。ACI (ACID ではなく) に準拠する必要があり、パフォーマンスが非常に重要です。それ以上に、私が Berkeley Db を選んだ理由はパフォーマンスでした。しかし、現在、ロギングのために Berkeley Db がボトルネックになっているようです。問題は、データベースに保存されるデータが多いほど、保存される値が長くなることです。私が作る

    envp->set_flags(envp, DB_TXN_NOSYNC, 1);

次に、フラグを使用して環境を開きます。

    DB_CREATE     |  // Create the environment if it does not exist
    DB_INIT_TXN   |  // Initialize the transactional subsystem.
    DB_INIT_MPOOL |  // Initialize the memory pool (in-memory cache)
    DB_INIT_LOCK  |  // Initialize the locking subsystem
    DB_THREAD;

しかし、それはまだディスクにログを記録しており、データ量が増加し、保存される値が長くなるにつれて、パフォーマンスが非常に低下します。おそらく、ほとんどの時間はそれらをログファイルに保存するために費やされます-負荷平均は

load average: 19.65, 19.12, 17.00

実行時にログを同期する必要はありません。必要なのは ACI だけで、ACID は必要ありません。

ログをオフにする方法、またはディスクへのログの書き込みを無効にする方法はありますか?

編集:誰も答えなかったので、私はたくさんグーグルでログをオフにする方法を見つけましたが、残念ながら、それは役に立ちませんでした - 環境はまだ __db.00x ファイルにたくさん書き込みます。インメモリにする方法。

4

2 に答える 2

0

fsync(2) を無効にすることは、パフォーマンスを改善する 1 つの方法です。

0 を返すスタブ ルーチンを作成し、Berkeley DB を開くときに fsync ベクトルを設定します。

于 2014-09-25T22:10:07.767 に答える
0

インメモリ ロギングを構成しようとしましたか? 言及したドキュメントを参照してくださいhttp://docs.oracle.com/cd/E17076_02/html/api_reference/C/envlog_set_config.html

envp->set_flags(envp, DB_LOG_IN_MEMORY, 1);

于 2013-03-10T10:26:57.943 に答える