パフォーマンステストを繰り返すためにファイルキャッシュをクリアする


106

キャッシュされたファイルのコンテンツを削除して、パフォーマンス結果の偏りを防ぐために使用できるツールまたはテクニックは何ですか?ファイルとディレクトリの内容に関するキャッシュされた情報を完全にクリアするか、選択的に削除する必要があると思います。

私が開発しているアプリケーションは、専用の圧縮ユーティリティであり、オペレーティングシステムが最近変更していないファイルの読み取りや書き込みが多く、ディスクブロックがキャッシュされない可能性があります。

ファイル処理作業を行うためのさまざまな戦略をプロファイリングするタスクを繰り返すときに、IO時間に見られる変動を取り除きたいと思います。

私は主にWindows XPのソリューションに興味があります。それは私の主な開発マシンであるためですが、Linuxを使用してテストすることもできるので、その環境に対する回答にも興味があります。

SysInternals CacheSetを試しましたが、[クリア]をクリックしても、数回読んだばかりのファイルを再度読み取る時間は、測定可能なほどには増加しません(コールドブート後のタイミングへの復元)。



1
なぜこの質問は削除されたのですか?
Dan Dascalescu、2015

回答:


82

SysInternalのRAMMapアプリを使用します。

rammap空のスタンバイ

[空/スタンバイリストを空にする]メニューオプションは、Windowsファイルキャッシュをクリアします。


2
RAMMapはWindows XPでは実行できません。これらのメニューオプションは、SysInternals Cachesetアプリケーションの[Clear]ボタンとは異なる動作をしますか?
Stephen Denne

@stephenこの手法は、Windows 8で完璧に機能しました!Windows XPは現在12歳ですが、Vista、Windows 7、またはWindows 8でこれを試すことができない理由はありますか?
Jeff Atwood、

@ジェフ私はもはやこれらの制限に取り組みません。それで、「空のスタンバイリスト」は、ディスクIOを必要とする最近読み取ったファイルからの次の読み取りという結果になりますか?
Stephen Denne、2013年

2
空のスタンバイリストをクリックした後、F5
キーを

3
プログラムによるアプローチについては、このSOの投稿をご覧ください:stackoverflow.com/a/23085045/430360
snemarch '11 / 11/15

16

Windows XPの場合、FILE_FLAG_NO_BUFFERINGオプションを指定したCreateFileを使用してファイルを開き、ハンドルを閉じることにより、特定のファイルのキャッシュをクリアできるはずです。これは文書化されておらず、それ以降のバージョンのWindowsで動作するかどうかはわかりませんが、ファイル圧縮ライブラリを比較するためのテストコードを作成するときにこれをずっと前に使用しました。読み取りまたは書き込みアクセスがこのトリックに影響を与えたかどうかは覚えていません。


Windows 7 SP1、x64で完全に動作します。すばらしいヒントです。
cxxl 2012年

2
それで、すべてのファイルに対してそれを繰り返す必要がありますか?たとえば、10個のサブディレクトリにある30個のファイルにまたがる100MBのディレクトリをコピーする場合、それぞれを個別に開いて、キャッシュではなく実際のディスクを確実に読み取る必要がありますか?
Synetech 2013

サイトの他の回答は、これがWin7と8でも機能することを確認しています。私はそれがビスタで動作すると思います。そして、はい、それを各ファイルで実行する必要がありますが、それほど長くはかかりません。必要なのは、各ファイルを開いて閉じるだけです。閉じると、Windowsはキャッシュをクリアします。これを実行したら、パフォーマンステストを実行します。
Mooing Duck 2014

1
これは完璧な答えでした。コーディングが簡単で効果的で、ほとんどのWindows OS(XPを含む、Win7x64でのみテスト済み)で動作するはずです。私はファイルを読み取り特権で開いており、共有はしていません。どのコンボが重要かわからない。
Rosco 2014

Linux(2.4.10以降)の同様の機能で、open(2)syscallにO_DIRECTフラグがあります。より正確には、私が理解していることから、O_DIRECTはそのファイルのキャッシュをクリアしません。バイパスするのが最善です。
カイワン2015

14

迅速なグーグルでLinuxにこれらのオプションを提供

  1. ファイルを保持しているパーティションをアンマウントしてマウントします
  2. sync && echo 1 > /proc/sys/vm/drop_caches

2
ありがとう、それは非常に便利に見えますが、おそらく1ではなく3をエコーし​​たいと思います。主にWindows XPに興味があるので、グーグルでそれを見つけられませんでした。
Stephen Denne、

残念ながら、これを利用できるLinux環境にはカーネルバージョン2.6.9があります。drop_cachesはカーネル2.6.16に追加されました
Stephen Denne

私が読んだ他の多くの投稿では、ファイルシステムをマウント解除してマウントし、そのために追跡されたすべてのアイテムを削除できることを示唆しています。2.6.16以前や、より最近のカーネルではそうでした。
TafT 2011

12

コマンドラインユーティリティはここにあります

ソースから:

EmptyStandbyList.exe 空にすることができるWindows(Vista以降)用のコマンドラインツールです。

  • プロセスワーキングセット
  • 変更されたページリスト
  • スタンバイリスト(優先度0〜7)、または
  • 優先度0のスタンバイリストのみ。

使用法:

EmptyStandbyList.exe workingsets|modifiedpagelist|standbylist|priority0standbylist

3
すべてのノイズの中で非常に過小評価されている答え、1つの仕事をし、それをうまく行うシンプルなユーティリティ。あなたはおそらくあなたが値する賛成票を得るために答えにもっと詳細を含める必要があります。
プロメテウス


3

機能しているように見える(再起動以外の)手法を1つ見つけました。

  1. MemAllocのコピーをいくつか実行します
  2. それぞれに、大きなメモリのチャンクを数回割り当てます
  3. プロセスエクスプローラーを使用して、システムキャッシュサイズが非常に低いレベルに減少していることを確認します。
  4. MemAllocプログラムを終了します。

ただし、選択的ではありません。理想的には、キャッシュされないようにするファイルのディスクブロックをキャッシュするために使用されているメモリの特定の部分をクリアできるようにしたいと考えています。


これには、ページファイルにデータをプッシュするという副作用があり、しばらくするとパフォーマンスが低下します。kludgeに頼るつもりなら、他の大きなファイルを読むだけでもよいでしょう。少なくとも、ディスクキャッシュのみがクリアされ、それ以外は何もクリアされません。
Synetech 2013

3

Windows XPファイルシステムキャッシュのより良いビューについて-Tim MurgentによるATMを試してください-ファイルシステムキャッシュのワーキングセットサイズとスタンバイリストサイズの両方をより詳細かつ正確なビューで確認できます。Windows XPの場合-V2およびV3にはServer 2003、Vista 以降が必要であるため、ここからダウンロードできる古いバージョンのATMが必要です。

あなたはただしことを確認しますSysinternalsのCachesetは、実際のデータはまだそれが何か他のものに交換するまで、それは使用することができ、そこからスタンバイリストの形で存在し続けて- 「キャッシュWS分を」削減されます。次に、それを別のものに置き換えるには、MedAllocChad Austinのflushmemなどのツールを使用するか、Windows Server 2003リソースキットツールの Consume.exeを使用します


0

Linuxにも質問されたので、関連する回答があります

コマンドラインツールvmtouchを使用すると、システムファイルキャッシュからファイルやディレクトリを追加および削除できます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.