6

4 つのプロセッサが割り当てられた Ubuntu 仮想マシンで、マルチスレッドの sqlite データベース アプリケーションを開発しています。sqlite バージョン 3.7.13 を使用しています。複数のスレッド/接続がデータベースから同時に読み取ることができることを確認するテストを作成しました。

私は2つの実行可能ファイルを持っています。最初の実行可能ファイルは、単純にデータベースを作成し、そのデータベースに 1 つのテーブルを作成し、そのテーブルに 50 個の項目を挿入してから、データベースを閉じます。これにはマルチスレッドはまったく関係なく、単にデータベースにエントリを提供することを目的としています。

2 番目の実行可能ファイルは、データベースから読み取る複数のスレッドを作成し、それらが終了するのを待ち、すべてのスレッドが完了するまでにかかった時間を記録します。各スレッドは次のことを行います: - sqlite_open_v2() を使用してデータベース接続を作成し、各スレッドが最初の実行可能ファイルから作成されたデータベースへの独自の接続を持つようにします - 1 つのデータベース テーブルに対して 100000 回の SELECT を実行します (各選択クエリは、 table) -データベース接続を閉じます

各スレッドで sqlite_open_v2 のフラグとして SQLITE_OPEN_READWRITE を指定してこのテストを実行したところ、すべてのクエリを実行する合計時間について次の結果が得られました。

1 スレッド - 0.65 秒 2 スレッド - 0.70 秒 3 スレッド - 0.76 秒 4 スレッド - 0.91 秒 5 スレッド - 1.10 秒 6 スレッド - 1.28 秒 7 スレッド - 1.57 秒 8 スレッド - 1.78 秒

これらの結果は、スレッドを追加するにつれて時間が少しだけ増加する (おそらくスレッド間のコンテキストの切り替えやその他の原因による) 予想どおりでした。つまり、読み取りは基本的に並列で行われています。

ただし、この同じテストを SQLITE_OPEN_READWRITE | で実行すると、フラグに SQLITE_OPEN_SHAREDCACHE を使用すると、次の結果が得られます。

1 スレッド - 0.67 秒 2 スレッド - 2.43 秒 3 スレッド - 4.81 秒 4 スレッド - 6.60 秒 5 スレッド - 8.03 秒 6 スレッド - 9.41 秒 7 スレッド - 11.17 秒 8 スレッド - 12.79 秒

これらの結果から、共有キャッシュ モードの何かが、データベースで同時に複数の読み取りが発生するのを妨げているように見えます。スレッド 1 がすべての読み取りを実行し、スレッド 2 がすべての読み取りを実行し、スレッド 3 がすべての読み取りを実行するのではなく、実際に異なるスレッドが並行して実行されていることを確認しました (スレッド 4 の読み取り、スレッド 8 の読み取り、スレッド 2 の読み取りなど)。等。)。ただし、個々のトランザクションの読み取りが順次実行されているか、他の何かが共有キャッシュ内のデータベースの速度を低下させているようです。

共有キャッシュ モードを使用しない場合とは対照的に、共有キャッシュ モードでスレッドを追加すると、時間が大幅に増加するのはなぜですか? これを修正し、引き続き共有キャッシュ モードを使用する方法はありますか?

助けてくれてありがとう。大変感謝しております。

4

1 に答える 1