Windows TIPS
[System Environment]
Tips   Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

Sysinternalsのsyncコマンドでディスク・キャッシュを強制フラッシュする

解説をスキップして操作方法を読む

デジタルアドバンテージ 打越 浩幸
2012/05/18
対象OS
Windows XP
Windows Server 2003
Windows Vista
Windows Server 2008
Windows 7
Windows Server 2008 R2
Summary
ファイル入出力のパフォーマンスを向上させるため、Windows OSシステムはディスクへの読み書きをバッファリングしている。
ディスクやメディアをすぐに取り外したい場合やテストのためにバッファを空にしたい場合は強制フラッシュするとよい。
変更済みバッファ領域をフラッシュさせるにはSysinternalsのsyncコマンドが利用できる。

解説

 UNIXやLinuxシステムにはsyncというコマンドがあり、これを実行すると、システム上にある変更済みのディスク・キャッシュ領域(ダーティ・バッファとも呼ばれる)の内容をすべてディスクに書き出す(バッファをフラッシュする)ことができる。変更済みのディスク・キャッシュの内容はいちいちsyncコマンドを実行しなくても自動的にディスクに書き出されるが(少なくともシャットダウン前には確実にすべて書き込まれる)、そのタイミングをユーザーが積極的に制御するためのコマンドがsyncである()。

UNIXやLinuxのsyncコマンドについて
 UNIXやLinuxのバージョンなどにも依存するが、実際にはsyncを実行してもディスクへの書き込みが必ず行われるわけではなく、書き込み完了前にsyncコマンドは実行を終了して、シェルへ戻ってくる(のがほとんどである)。syncはコマンドというよりは、書き込みバッファをフラッシュさせるための要求(の送信)に過ぎないが(バージョンによっては、本当にフラッシュするまで実行が完了しないものもある)、古くからの慣習でこのコマンドは、特にシャットダウン直前に実行することが多い(sync; sync; sync; haltなどと繰り返して実行する)。

TIPS「Sysinternalsツールをオンラインで使う

 Windows OSは標準ではこのようなコマンドを持っていないが、Sysinternalsのsyncコマンドを使えば、強制的にディスク・キャッシュの内容をすぐにディスクやリムーバブル・デバイスにフラッシュさせることができる(Sysinternalsについては関連記事参照)。このようなコマンドを使わなくてもシステムは自動的にディスクへのフラッシュを行うが、フォアグラウンドでのCPU負荷やファイル読み書きなどの負荷が高いとバッファのフラッシュ処理の優先度は下がり、未書き込み状態のまましばらく残ることになる。また、システムのメモリ・サイズや空きメモリに余裕がある場合もフラッシュ処理は後回しにされるようになっている。Windows OSのアーキテクチャでは、ディスクへの書き込み要求はなるべくまとめて回数を減らし、最後に1秒に1回程度の頻度でlazy writerプロセスがフラッシュするようになっている(MSDNサイトの「File Management - File Caching[英語]」参照)。

 通常はsyncコマンドを使ってバッファをフラッシュする必要性は少ないが、可能なら明示的にフラッシュさせたいこともある。例えば、次のような用途が考えられる。

  • リムーバブル・デバイスの書き込みポリシーをデフォルトの「クイック削除」から「高パフォーマンス」にするとライトバック・キャッシュになるので、フラッシュ処理が抑制される。このようなリムーバブル・デバイスをすばやく取り出すために書き込みを強制させる。TIPS「Windows Vista/Windows Server 2008でディスクの書き込みキャッシュを有効にする」参照。

  • パフォーマンス・テストなどで実行条件を揃えるために、キャッシュを常にクリアした状態からテストを開始する。

  • ディスク入出力を多く使うと、メモリがバッファのために多く使用され、ほかのプログラムをロードしたり実行したりする場合のパフォーマンスが低下する。このような影響を排除するため、syncを実行して直前のプログラムで使用していたディスク・キャッシュなどをすべてフラッシュさせる。

 本TIPSでは、このsyncコマンドの使い方について解説する。

  操作方法

syncコマンドの入手

 Syncコマンドは次のWebページからダウンロードできる。

 このページの真ん中の段の上部にある「Syncのダウンロード」というリンクをクリックすると、Sync.zipというZIPファイルがダウンロードされる。これを展開してsync.exeというファイルを取り出し、適当な実行パスへ保存する。

syncコマンドの実行

 syncコマンドを実行するには、管理者権限のあるコマンド・プロンプトを開き、その上で実行する。sync -?でヘルプが表示されるが、次の通り、ほとんど何もオプションを付ける必要はない。

C:\>sync -?

Sync 2.2: Disk Flusher for Windows 9x/Me/NT/2K/XP
Copyright (C) 1997-2004 Mark Russinovich
Sysinternals - www.sysinternals.com

usage: sync [-r | drive letters]
   -r   flush removeable media
   -e   eject removeable media

Specifying explicit drive letters will flush only those drives.

 オプションなしで実行すると、すべての非リムーバブル・ドライブの変更済みバッファをフラッシュするが、ドライブ名を指定すると(複数指定可)、そのドライブの変更済みバッファだけをフラッシュできる。-rを指定すると、リムーバブル・ドライブも含めたすべてのドライブがフラッシュの対象となる。-eは、フラッシュ後にリムーバブル・ドライブを取り外す指定である。

 それでは実際に実行してみよう。まず現在のバッファの状態が次のようになっているとする。これはタスク・マネージャの「パフォーマンス」タブにある[リソース モニター]ボタンをクリックすると起動されるツールである。「メモリ」タブを選択すると、現在のバッファ・メモリの使用状況などが分かる。

sync実行前のメモリの状態
ファイルのコピーや書き込みなどを多く行うと、このように変更済みのバッファ・サイズ()が大きくなる。この内容は、ディスクへのフラッシュを担当するプロセスによって順次書き込まれてサイズは減少していくが、ほかの処理が忙しくて書き込みが保留されていると、このサイズは減少しない。
このタブを選択する。
プログラムやデータなどで使用中のメモリ。
ディスク上のデータをキャッシュしているが、何らかの変更が行われているので、後でディスクへ書き戻す必要がある。
ディスク上のデータをキャッシュしているが、内容は同じなので、必要なら破棄してもよいメモリ領域。ディスクの先読みキャッシュや書き込み済みのデータなどが該当する。
未使用のメモリ領域。

 このシステムには全部で18Gbytesのメモリが実装されているが、そのうち変更済みバッファ(のオレンジ色の部分)には1071Mbytes割り当てられている。CPUの負荷などにもよるが、しばらくするとディスクへの書き込みが行われ、この値は少しずつ減っていく。

 この状態でsyncコマンドを実行して、強制的にフラッシュしてみる。

C:\>sync

Sync 2.2: Disk Flusher for Windows 9x/Me/NT/2K/XP
Copyright (C) 1997-2004 Mark Russinovich
Sysinternals - www.sysinternals.com

Flushing: C D E F G ……フラッシュ対象ドライブ(順次表示される)

C:\>

 システムの全ドライブの書き込みバッファがフラッシュされて減少し、リソース・モニタの表示は次のようになった。

sync実行後のメモリの状態
syncコマンドで書き込みバッファをフラッシュした直後のメモリの状態。よく見ると、変更済み領域は減ったが、その分スタンバイ領域は増えている。
ほぼすべてのバッファがフラッシュされたが、活動中のプロセスなどもあるので、完全に0になるわけではない。
変更済み領域の内容をディスクに書き込むと、それはスタンバイ状態に移行する。
空きメモリが不足した場合は、この部分を解放して空きメモリとして利用する。通常は先読みしたデータやプログラムを格納しておく(スタンバイしておく)領域として利用される。

 変更済みバッファのサイズが1071Mbytesから39Mbytesと大幅に減少している。システム内部にはさまざまなプロセスが存在していて、それぞれファイルやフォルダに書き込んでいるし、カーネル内部でのシステム・データなどへの書き込みもあるため、この値が0になることはないが、それでもほとんどすべての変更済みバッファ領域がフラッシュされていることが分かる。

 なお、バッファをフラッシュしたからといって、これでいつでもシステムがクラッシュしても(もしくはいきなり電源ケーブルを抜いても)大丈夫というわけではないので注意していただきたい。書き込み済みデータのバッファはフラッシュされたが、オープン中だったファイルがクローズ処理されているわけではないので、このままシステムがクラッシュすると、ファイル・システムとしての一貫性や整合性などが取れなくなる(chkdskコマンドなどで復旧できる可能性があるが、完全ではない)。バッファのフラッシュは、あくまでもディスクに未書き込みのファイル・バッファをディスクへ書き込むという効果しかない。

スタンバイ・メモリ領域の解放

 ところで、上の「sync実行後のメモリの状態」画面では、変更済み領域が約1071Mbytes→39Mbytesへと減少しているが(画面中の)、その分のメモリはどうなったのであろうか。答えは、の「スタンバイ」メモリ状態へ移行した、である。これはsyncの前後で、スタンバイ・メモリ領域のサイズが約1Gbytes増えていること、およびの空きメモリ・サイズがほぼ変わっていないことからも分かるだろう。

 スタンバイ・メモリとは、ディスクの内容をキャッシュしている(ディスク上の内容と一致していることが保証されている)メモリ領域のことである。ディスクから先読みしたファイルのデータや、(高速起動のために)プリフェッチしたプログラム・コードなどが含まれており、ディスクへのアクセス要求があった場合は、このスタンバイ・メモリ領域からアクセスすることによって、高速なアクセスが期待できる。だが、この内容は単なるディスクのキャッシュに過ぎないため、いつでもその内容を破棄しても構わない。必要ならまたディスクから読み出してくればよいからだ。ディスクへ書き込んだ直後の変更済みバッファの内容は、まさにディスクを先読みしたのと同じ状態なので、空きメモリではなく、スタンバイ・メモリへと移行して、データを有効活用している。

 そして、あるプログラムがメモリを要求した場合、まず空きメモリ領域(上の画面の)から利用されるが、空きメモリ領域を使い切ると、今度はこのスタンバイ・メモリ領域から割り当てが行われる(キャッシュされている内容を破棄して、その分のメモリをプログラムに渡す)。

 本TIPS冒頭で、syncの使用目的の1つとして、パフォーマンス・テスト前に条件を揃えるためという項目を挙げたが、スタンバイ・メモリ領域にファイルやプログラムがキャッシュされたままだと、初回のテスト時と、2回目以降のテストでは結果が大きく異なる可能性がある。上の例で言えば、スタンバイ・メモリ領域にある約5.8Gbytesのデータはディスク・アクセスなしで利用できるため、非常に有利になる。

 そこで速度テストなどを行う場合は、このスタンバイ・メモリ領域も毎回クリアしてからテストするのが望ましい(逆に、最初の何回かの結果は無視するという方法も考えられる)。

 だがsyncコマンドでは変更済みバッファしかクリア(フラッシュ)できないので、ほかのツールを使う必要がある。Windows OSにはこれを行うツールは標準では用意されていないので、SysinternalsにあるRammapツールを利用するとよいだろう。Rammapはメモリの利用状況などをチェックするツールである。

 上のページからZIPファイルをダウンロード後、展開してRAMMap.exeを取り出し、適当なフォルダへ保存する。スタンバイ・メモリ領域をフラッシュするにはツールを起動後、[Empty]メニューの[Empty Standby List]を実行する。

Rammapツールでスタンバイ・リスト(スタンバイ・メモリ領域)をクリアする
Rammapは、システムのメモリの利用状況を詳しく調査するツール。カテゴリ別、プロセス別の利用状況の調査のほか、ファイル・バッファやページ・テーブルとしてどのメモリ領域が使われているかなどを調査できる。使い方を理解するには、Windows OSカーネルに対する深い理解が必要。
これを選択すると、スタンバイ・リストをクリアできる。
これを選択すると、変更済みメモリ・リストをクリアできる(つまりディスクへフラッシュさせる)。syncコマンドとほぼ同じ効果を持つ。

 これによってスタンバイ・メモリ領域がクリアされ、それらはすべて空きメモリ領域になる。リストをクリアするだけなので、ディスクへの書き込みなどは発生せず、すぐに結果が反映される。クリア後のリソース・モニタの結果は次のようになる。

スタンバイ領域クリア後のメモリの状態
パフォーマンス・テストなどを行うには、毎回変更済みメモリ領域だけでなく、スタンバイ・メモリ領域もクリアして条件を揃えるのが望ましいだろう。
スタンバイ・メモリ領域もほぼクリアされている。
クリアされたスタンバイ・メモリ領域は空き領域として扱われる。

 変更済み領域もスタンバイ領域もほぼすべて解放され、空きメモリ領域が増えている。End of Article

「Windows TIPS」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間