2012-03-04 11 views
39

上のディスクI/Oキャッシュをパージするにはどうすれば、より予測可能なベンチマークのためにそれを行う必要があります。は、Linux

+0

'sync'はそれをしていませんか? – imm

+5

'sync'は消去されず、フラッシュされます。 – Tino

答えて

39

あなたはsyncコマンド、またはsync()機能が欲しいような音。

あなたはディスクキャッシュのフラッシュをたい場合:echo 3 | sudo tee /proc/sys/vm/drop_caches

+6

'sync'は100%無関係です。私は長持ちのマルチGB読み込みキャッシュについて言及していますが、 'sync'が扱う短期間の書き込みされていないデータの些細な量ではありません(とにかく10秒ごとにディスクに書き込まれます)。 – taw

+7

あなたはディスクキャッシュについて話していますか? 'echo 3 | sudo tee/proc/sys/vm/drop_caches' –

+0

私はあなたのコメントを受け入れますが、それは不可能です。 – taw

1

アンマウントし、試験中の再マウントディスクは、すべてのキャッシュやバッファをリセットします。

+2

必ずしもそうではありません。例: 'mount/dev/sda1/mnt'は、そのパーティションを開き、'/dev/sda'( '1'が見つからないことに注意してください)を見て、'/mnt'の下のファイルを変更します。これは '/ dev/sda'に反映されていないことがわかります。これはこれが異なるキャッシュを使用するためです。 'umount/mnt'は、物理的に同じドライブであっても、'/dev/sda'には影響しないので、その場合は役に立ちません。 – Tino

23

あなたはこのようにそれを行うことができます:あなたはこれらの3つの異なるシステムコールも

であることを確認するためにstraceのを使用することができ

# synC# (move data, modified through FS -> HDD cache) + flush HDD cache 
# echo 3 > /proc/sys/vm/drop_caches # (slab + pagecache) -> HDD (https://www.kernel.org/doc/Documentation/sysctl/vm.txt) 
# blockdev --flushbufs /dev/sda 
# hdparm -F /dev/sda 

# NEXT COMMAND IS NOT FOR BENCHMARKING: 
# should be run before unplug, flushes everything possible guaranteed. 
# echo 1 > /sys/block/sdX/device/delete 

、hdparmのを使用してHDDのキャッシュをオフにするかわからないことが望ましいかもしれませんあなたがベンチマーキングするものは何ですか?どのようにして

、あなたは最近使用したデータの最後64/32/16 MBをキャッシュするためにHDDを防ぐことはできません。そのキャッシュを殺すためには、単にゼロ(およびフラッシュ)のいくつかの量を書き+ HDDからのいくつかの無関係な場所をお読みください。キャッシュは、一部の読み取りと書き込みの部分をするために分割することができるので、これは必要とされます。その後、HDDのベンチマークを行うことができます。

+1

+1 'blockdev'はまさに私が探していたものでした。 – Tino

+3

'blockdev --flushbufs/dev/sda'は私のUSBドライブでは動作しますが、SATA SSDドライブでは効果がありません。 'echo 3 | sudo tee/proc/sys/vm/drop_caches'は両方のドライブで動作します。 –

+0

最後のコマンドは、ディスクをカーネルから削除します。あなたは間違いなくディスクをベンチマークすることはできません(または何らかの方法でディスクを使用します)。ディスクが使用中の場合は危険です。それを他のコマンドとともに含める理由はありません。このコマンドの使用例とその動作の例を次に示します。https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Online_Storage_Reconfiguration_Guide/removing_devices.html – ndemou

17

ディスクキャッシュのパージ:echo 3 | sudo tee /proc/sys/vm/drop_caches

コマンドのドキュメント:https://www.kernel.org/doc/Documentation/sysctl/vm.txt

これへの書き込みは、カーネルが自由になるためにそのメモリを引き起こして、メモリからクリーンなキャッシュ、dentriesとiノードをドロップするようになります。無料ページキャッシュへ

echo 3 > /proc/sys/vm/drop_caches

:無料ページキャッシュ、dentriesとiノードへ

echo 2 > /proc/sys/vm/drop_caches

:無料dentriesとiノードを

echo 1 > /proc/sys/vm/drop_caches

このよう

が非破壊的な操作で、汚れたオブジェクトが解放可能なものではなく、ユーザーは、すべてのキャッシュされたオブジェクトが解放されていることを確認するために、第1の「同期」を実行する必要があります。

3

ショート十分良い答え:(コピーはやさしいペースト)

DISK=/dev/sdX # <===ADJUST THIS=== 
sync 
echo 3 > /proc/sys/vm/drop_caches 
blockdev --flushbufs $DISK 
hdparm -F $DISK 

説明:

syncフラッシュファイルシステムのバッファ:manページから。ブロックをディスクに強制的に変更し、スーパーブロックを更新します。

echo 3 > /proc/sys/vm/drop_cache:フラッシュバッファ[へ] コールブロックデバイスのioctl:manページから:from the kernel docsこれはカーネルがクリーンなキャッシュ

blockdev --flushbufs /dev/sdaをドロップするようになります。

hdparm -F /dev/sda:manページから:上のドライブライトキャッシュバッファをフラッシュ(古いドライブは、これを実装しない場合があります)

BLOCKDEVとのhdparmコマンドは、それらが異なるのioctlを発行an answer aboveによると似ていますが、デバイス。

ロングおそらくより良い方法:

(私はあなたがディスクをフォーマットしていることを前提としていますが、あなたが直接ディスクに書き込みたい場合は、これらのコマンドを適応させることができます)

は一度だけこれを実行します第一ベンチマークの前に:

MOUNT=/mnt/test # <===ADJUST THIS=== 
dd if=/dev/urandom of=$MOUNT/temp-hddread.tmp bs=64M count=16 

実行このたび、あなたはキャッシュを空にしたいです

完了したらこれを実行してください。

MOUNT=/mnt/test # <===ADJUST THIS=== 
rm $MOUNT/temp-hddread.tmp 

説明:

HDDは、上記のコマンドによってクリアされないH/Wキャッシュを有していてもよいです。私は擬似ランダムデータホッピングを作成して読み込み、それらをゴミで埋めています。どのくらいのデータがHDDキャッシュの大きさに依存するか。私は/ dev/urandomを使用しています。速いため、私たちは気にしませんtrueランダム性。私は最初から/mnt/test/temp-hddread.tmpを作成していて、十分なランダムなデータを読みたいときに毎回使用しています。十分なランダムなデータを書きたいときに毎回/mnt/test/temp-hddwrite.tmpを作成して削除しています。

クレジット

私は、既存の回答の最良の部分に基づいて、この答えを書いてきました。