strace -C -tt
SQLite3 がどこで時間を取っているかを把握するために、Linux 64 ビット マシンで同様のテストを行いました。
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
99.03 0.004000 32 124 fsync
0.64 0.000026 0 222 mprotect
0.32 0.000013 0 216 munmap
明らかな遅延は次のfsync
関数にあります。
- 設定可能
- 一般的なディスク I/O に依存します ( を確認してください
iotop
) iostat
。
- IOSS に大きく依存します (したがって、ファイル システムとディスクの割り当て - ext3 で 1 つの値、xfs で別の値、btrfs で 3 番目の値が得られる場合があります)。
- もちろん、基礎となるハードウェアとその癖やチューニングに間接的に依存します。
同期をオフにすると、SQLite3 のパフォーマンスが約 3,000 倍向上します。
$db = new PDO('sqlite:test.db');
$db->exec('pragma synchronous = off;');
私も非常によく似た2台のマシンで2つの異なる値を持っています(1台にはext4があり、もう1台にはXFSがありますが、これが主な理由であるとは確信していません-それらの負荷プロファイルも異なります)。
ちなみに、プリペアド ステートメントを使用すると、最速レベルで実行速度が約 2 倍になり (45k から 110k の INSERT、3000 のバッチで、その速度では 30 個の INSERT が誤ったタイミングを与えることにバインドされているため)、最低速度は約 6 から上昇します。約150まで。
したがって、これ (プリペアド ステートメントを使用) は、ファイルの同期に触れることなく、つまり、データのリスク レベルが同じままであることを実証的に確信しながら、繰り返し操作を改善するための優れたソリューションとなる可能性があります。その後、データ停止のリスクと価値に応じて、トランザクションまたは fsync (おそらくメモリ ジャーナリング) を試します。
システムをゼロから設計するときは、さまざまな FS でいくつかのテストを行うことをお勧めします。
異なるファイル システム (同じマシン) でのテスト
ext4 (acl,user_xattr,data=order) 5.5 queries/s
using transactions 170 queries/s
disabling fsync 16000 queries/s
using transactions and disabling fsync 47200 queries/s
一時ファイル システムでは は安価なので、fsync
オフにしてもほとんどメリットがありません。ほとんどの時間はガードに費やされるため、トランザクションが重要です。
tmpfs 13700 queries/s
disabling fsync 15350 queries/s
enabling transactions 47900 queries/s
using transactions and disabling fsync 48200 queries/s
もちろん、適切なデータ編成とインデックス作成を考慮する必要があり、大規模なデータ セットの場合は、より重要になる可能性があります。
UPDATE : パフォーマンスを向上させるために、SQLite ジャーナルをメモリに入れることもできます。pragma journal_mode=MEMORY;
また、SQLite データベースで atime をわざわざ更新しないように ext3/4 に指示することもできます (ただし、これは実装に大きく依存します)。noatime
データベースが存在するファイルシステムへの追加を試すことができます。それが機能する場合は、それを配置できます(より極端な代わりに/etc/fstab
使用することもできます:relatime
noatime
sudo mount /var -o remount,noatime