ReadyBoost と FILE_FLAG_NO_BUFFERING
何気なく CrystalMark で検索したら NyaRuRu さんのサイトで CrystalMark 2004R2 の考察があるではありませんか!!!!
ReadyBoost と FILE_FLAG_NO_BUFFERING
ふむふむ。FILE_FLAG_WRITE_THROUGH については知りませんでした。
[SDK32] FILE_FLAG_WRITE_THROUGH と FILE_FLAG_NO_BUFFERING
を読みながら勉強しておきます。ご指摘の通り、FILE_FLAG_NO_BUFFERING は普通使いませんよね。というか、使えません。が、ディスクからではなくキャッシュから読み出されることを回避するためには必須かなと。
Ready Boost はメインメモリを潤沢に積んでいるため全く興味がなかったのですが、世間的にはかなり注目されているみたいですね。
CrystalMark 2004R2 では、圧縮ドライブでない場合は、ランダムでないデータを書き込むことになるので非常に圧縮しやすいためスコアが上がっているということなのかもしれません。次の CrystalDiskMark は、圧縮ドライブかどうかにかかわらず、ランダムなデータを書き込んでテストしたいと思います。※CrystalMark 2004 も修正しといた方がよさそうだなぁ~。ファイルシステムより上のレイヤーで圧縮されることは考えておりませんでした。。。
幸い CrystalDiskMark はリリース前なので、もうちょっと試行錯誤してみたいと思います。
どもども.
Ready Boost は確かにうちのサイトでもアクセスが多いですね.
FILE_FLAG_WRITE_THROUGH に関してはふと思い出しただけなので,特に意図はありませんから,それほど気になさることはないと思います.
最大の違和感はやはり FILE_FLAG_NO_BUFFERING を指定しても動いてしまう ReadyBoost の方で,別のフラグ指定したらバイパスできないかなぁと考えているときに FILE_FLAG_WRITE_THROUGH をふと思い出したという感じです.追跡調査はやっていないので詳細は不明ですが……無理そうな気もします.
Ready Boost に関しては,TechNet Magazine 2007 年 3 月号の記事がかなり参考になりました.といっても完全に理解できているかは結構微妙なのですが.
http://www.microsoft.com/technet/technetmag/issues/2007/03/VistaKernel/default.aspx?loc=jp/
応答速度や容量を考えると,キャッシュ階層のメインメモリと HDD の間にもう一段入れたくなるのは,言われてみると確かに自然なのかもしれません.とはいえ最初にそういうのを思いつけるのはすごいなぁと思う次第です.
ランダムアクセス時には先頭の100 MBしかアクセスされないのは仕様ですか? とか意地悪いってみたりして。
それはそれとして。
仕事で(隣の人が)データベースなんかを扱っています。プロセス/OSが死ぬのを前提にするとデータをメモリ上に滞在させられないんですよね(c.f. http://support.microsoft.com/kb/281672/ja)。そんな訳でOracleだとディスクを直接いじったりもします。PostgreSQLだと(オプションによっては)適宜fsync()してキャッシュの内容を無効化していますね。こっちだと(POSIX的には)ディスクへの書き込みが保証されます。これだってNASみたいな場合は非常に怪しげなんですが。
まあキャッシュがちゃんと無効になっているかどうかは[ディスクのプロパティ(だっけ?)]-[書き込みキャッシュを有効にする]を切り替えて結果を比較すれば判る筈。暇だったらやってみてもいいかも。とか。
> ランダムアクセス時には先頭の100 MBしかアクセスされないのは仕様ですか? とか意地悪いってみたりして。
その辺りのコードはもうちょっと書き直す予定です。まぁ、そのうち直ります。(と言い訳してますが、気がついてませんでした。)
ディスクの書き込み関連は色々難しいところです。実際はキャッシュが介在するわけですし、セクタ境界を意識する必要がある FILE_FLAG_NO_BUFFERING は使えませんからねぇ。
> NyaRuRuさん
コメントありがとうございます。
http://www.microsoft.com/technet/technetmag/issues/2007/03/VistaKernel/default.aspx?loc=jp/
を読む限り、ReadyBoost を有効にすると全ての読み書きがインターセプトされるんですねぇ。シーケンシャルアクセスとランダムアクセスに応じて読み出し先メディアを切り替えるのは理にかなっていますね。
とりあえず、本バージョンでテストファイルの内容がランダムになるようにしました。