私はすでにこれをStackOverflowに投稿しましたが、オフトピックとしてフラグが付けられました。多分あなたたちは私を助けることができます。
私は現在、Ubuntu12.04を実行している仮想マシンでデータベースのベンチマークを行っています。 2回目にクエリを実行すると、実行速度が大幅に向上することに気付きました。これは、すべてのデータをメインメモリに保持するだけのOSキャッシュが原因である可能性があります。したがって、キャッシュが測定値を台無しにしないようにするために、後続の実行の間にキャッシュをクリアしたいと思います。
私はグーグルでこれを達成するために次のコマンドを見つけました:
sync;echo 3 > /proc/sys/vm/drop_caches
そして
sysctl -w vm.drop_caches=3
rootとしてログインしている場合でも、すべて許可拒否エラーが発生します。ゲストシステムからシステムのキャッシュをクリアすることは不可能のようです。これは、ホストキャッシュを使用しているためだと思います。ホストにアクセスできないため、回避策を見つける必要があります。現在、私には2つのアイデアがあります。
最初のアイデアは、キャッシュをクリアするため、実行の合間にマシンを再起動することです。数十回の実行を実行したいので、これを自動化する必要があります。したがって、プログラムを自動起動に入れて、クエリを実行して再起動し、次の起動時に次のクエリを続行することができます。でもウイルスを書いているような気がします。
2番目のアイデアは、メモリを他のデータで溢れさせることです。私のマシンにはかなりのRAMがあります。たとえば、ランダムデータの大きなファイルを生成して/ dev/nullに読み込むだけです。
最後に、私の質問は、キャッシュをクリアする、またはキャッシュの使用をすべて一緒に回避するためのより良いアイデアはありますか?または、私の2つのアイデアのいずれかを簡単に実装する方法について誰か提案がありますか?
よろしくお願いします、アンティゴ
この質問は、2回目の速度の増加は、「すべてのデータをメインメモリに保持するだけのOSキャッシングによる」という前提に基づいているようです。 よくわかりませんこれがonly最初の実行と後続の実行の違いです。パフォーマンスの違いがホストキャッシングVM RAMであった場合、VMの再起動との違いはごくわずかであり、再起動する必要があります違いを確認するためのホスト。
最初の実行と後続の実行の間のパフォーマンスに影響を与える可能性があることの1つとして、クエリのコンパイルと解析、および適切な実行プランの決定もデータベースエンジンにとってかなり大変な作業であるため、通常、その結果はキャッシュされます。これによる影響は、クエリを満たすためにデータベースエンジンが他に何をしなければならないかによっては、無視できる程度からかなりのものになる場合があります。
十分なRAMがある場合、キャッシュを回避する1つの方法は、単純にデータベースファイルを大きなRAMディスクに移動することです。テスト期間中。I/ O統計を監視することで、クエリによって発生したI/Oの量を推定できるため、さまざまな最適化手法のパフォーマンスへの影響を、次の影響を心配することなく見積もることができます。すべてのデータはすでにRAMにあるためデータキャッシュ。
実行しているデータベースエンジンがわからないため、具体的な提案をするのは困難です。 Microsoft SQL Serverでは、クエリを実行する前にSET STATISTICS IO,TIME ON
や SET STATISTICS PROFILE
のような操作を行って、データベースサーバーが実行するために必要な作業量に関するデータを取得します。問題のクエリ。他のデータベースエンジンにもほぼ確実に同様の機能があります(これはクエリパフォーマンスチューニングの基本的な前提条件です)。このような統計には、実際のI/O要求の数が含まれることが多く、これらのI/O要求はcanであるため、必ずしもではないことに注意してください。 willOSレベルのキャッシュから満たされる場合、これらの数値は、クエリの実行に関係するデータの量を示すのに役立ちます。クエリプランと実際の結果の大きな違い、特にさまざまなコンテキストでのI/Oの量や行数の違いは、データベースエンジンが使用するアルゴリズムの決定を下していることを意味するため、パフォーマンスに影響を及ぼします。どこでも大量のI/Oが発生すると、必要以上にディスクにアクセスしている可能性があります。これは、willパフォーマンスを犠牲にします。