[System Environment] | ||||||||||||||
Sysinternalsのsyncコマンドでディスク・キャッシュを強制フラッシュする
|
||||||||||||||
|
解説 |
UNIXやLinuxシステムにはsyncというコマンドがあり、これを実行すると、システム上にある変更済みのディスク・キャッシュ領域(ダーティ・バッファとも呼ばれる)の内容をすべてディスクに書き出す(バッファをフラッシュする)ことができる。変更済みのディスク・キャッシュの内容はいちいちsyncコマンドを実行しなくても自動的にディスクに書き出されるが(少なくともシャットダウン前には確実にすべて書き込まれる)、そのタイミングをユーザーが積極的に制御するためのコマンドがsyncである(※)。
※UNIXやLinuxのsyncコマンドについて UNIXやLinuxのバージョンなどにも依存するが、実際にはsyncを実行してもディスクへの書き込みが必ず行われるわけではなく、書き込み完了前にsyncコマンドは実行を終了して、シェルへ戻ってくる(のがほとんどである)。syncはコマンドというよりは、書き込みバッファをフラッシュさせるための要求(の送信)に過ぎないが(バージョンによっては、本当にフラッシュするまで実行が完了しないものもある)、古くからの慣習でこのコマンドは、特にシャットダウン直前に実行することが多い(sync; sync; sync; haltなどと繰り返して実行する)。 |
|
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 -? |
オプションなしで実行すると、すべての非リムーバブル・ドライブの変更済みバッファをフラッシュするが、ドライブ名を指定すると(複数指定可)、そのドライブの変更済みバッファだけをフラッシュできる。-rを指定すると、リムーバブル・ドライブも含めたすべてのドライブがフラッシュの対象となる。-eは、フラッシュ後にリムーバブル・ドライブを取り外す指定である。
それでは実際に実行してみよう。まず現在のバッファの状態が次のようになっているとする。これはタスク・マネージャの「パフォーマンス」タブにある[リソース モニター]ボタンをクリックすると起動されるツールである。「メモリ」タブを選択すると、現在のバッファ・メモリの使用状況などが分かる。
このシステムには全部で18Gbytesのメモリが実装されているが、そのうち変更済みバッファ(のオレンジ色の部分)には1071Mbytes割り当てられている。CPUの負荷などにもよるが、しばらくするとディスクへの書き込みが行われ、この値は少しずつ減っていく。
この状態でsyncコマンドを実行して、強制的にフラッシュしてみる。
C:\>sync |
システムの全ドライブの書き込みバッファがフラッシュされて減少し、リソース・モニタの表示は次のようになった。
sync実行後のメモリの状態 | |||||||||
syncコマンドで書き込みバッファをフラッシュした直後のメモリの状態。よく見ると、変更済み領域は減ったが、その分スタンバイ領域は増えている。 | |||||||||
|
変更済みバッファのサイズが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カーネルに対する深い理解が必要。 | ||||||
|
これによってスタンバイ・メモリ領域がクリアされ、それらはすべて空きメモリ領域になる。リストをクリアするだけなので、ディスクへの書き込みなどは発生せず、すぐに結果が反映される。クリア後のリソース・モニタの結果は次のようになる。
スタンバイ領域クリア後のメモリの状態 | ||||||
パフォーマンス・テストなどを行うには、毎回変更済みメモリ領域だけでなく、スタンバイ・メモリ領域もクリアして条件を揃えるのが望ましいだろう。 | ||||||
|
変更済み領域もスタンバイ領域もほぼすべて解放され、空きメモリ領域が増えている。
この記事と関連性の高い別の記事
- リソースモニターでメモリの利用状況をモニターする(TIPS)
- Rammapツールでメモリの詳細な利用状況を調査する(TIPS)
- Windows Vista/Windows Server 2008でディスクの書き込みキャッシュを有効にする(TIPS)
- 複数のコンピュータでFirefoxのブックマークや履歴情報を同期する(TIPS)
- タスクマネージャーのパフォーマンスタブの見方(Windows 7/Server 2008 R2編)(TIPS)
このリストは、デジタルアドバンテージが開発した自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
「Windows TIPS」 |
- Azure Web Appsの中を「コンソール」や「シェル」でのぞいてみる (2017/7/27)
AzureのWeb Appsはどのような仕組みで動いているのか、オンプレミスのWindows OSと何が違うのか、などをちょっと探訪してみよう - Azure Storage ExplorerでStorageを手軽に操作する (2017/7/24)
エクスプローラのような感覚でAzure Storageにアクセスできる無償ツール「Azure Storage Explorer」。いざというときに使えるよう、事前にセットアップしておこう - Win 10でキーボード配列が誤認識された場合の対処 (2017/7/21)
キーボード配列が異なる言語に誤認識された場合の対処方法を紹介。英語キーボードが日本語配列として認識された場合などは、正しいキー配列に設定し直そう - Azure Web AppsでWordPressをインストールしてみる (2017/7/20)
これまでのIaaSに続き、Azureの大きな特徴といえるPaaSサービス、Azure App Serviceを試してみた! まずはWordPressをインストールしてみる
|
|