Windowsは、ハイバネーションファイル内の完全なRAMをこれほど高速にダンプできますか?


65

Microsoft Windowsの休止状態の手順を説明した記事読んでいた。私が得た主なポイントは

  1. Windowsは、RAMを(おそらく処理後に)hiberfil.sysファイルにダンプします。
  2. 起動時に、休止状態ファイルが読み取られ、内容がRAMにロードされます。

私の質問は、通常1 GBなどのサイズのファイルをコピーする場合、完了するのに約2分かかります。

ただし、Windowsが休止状態ファイルを書き込んでいるとき(休止状態の手順中)、プロセス全体に10〜15秒かかることがあります。 書き込み速度にそのような違いがあるのはなぜですか?

RAMサイズは4 GBです。(高速ブートテクノロジについては説明していません。)

ベンチマーク:

  1. 1 GBファイルをディスク1からディスク2(外部)にコピー:2.3分。
  2. システムの休止状態:15秒。

3
答えはわかりませんが、Windows Internalsの「Chapter 13:Startup and Shutdown」という本をチェックしたらきっとわかるでしょう(自分で本を持っていたらチェックします)。
スコットチェンバレン

2
これはいい質問です。休止状態が1998年に最初に実装されたとき、それはほとんどそれほど速くありませんでした。
ゲイブ

22
@coder:NTシステムは、hyberfil.sysにすべてのスペースが割り当てられており、ファイル全体が断片化されていないことを確認します。その状態では、操作中にハードドライブにヘッドジャンプはありません。したがって、150Mo / sのような効果的な速度が得られます。あなたは私が言ったことを再確認することができfsutilます。
user2284570

3
通常、外部ディスクも内部ディスクよりも低速です。
ハリージョンストン

2
@EricLippert-確かにすべてのRAMを保存するわけではありませんが、それでもまだ説明できません。私は定期的に保存する必要のある数ギガバイトのアクティブRAMを持っています(VS2013またはEclipse +多くのRAMがかかります)、それらは私の非SSDの理論的な書き込み速度よりも速いと思われる速度で保存されますドライブ。
-Davor

回答:


45

これはおそらく3つの答えです。

ここで効果があるのは、Windowsの新しいハイブリッドシャットダウンです。これは、アプリケーションを効果的に閉じ、ログオフしてから、オペレーティングシステムのコアを休止状態に移行します。すでにこのデータを保存しておくと、潜在的に「再休止」する必要がなくなります。

二つ目は、休止状態がいずれかのスワップファイルにページアウトまたは使用されていないされているメモリページを保存する必要がないということになります(これは積極的にスワップファイルを埋めるために一つの理由だろうだけでなく、メモリ内のデータを保持) 。

3つ目は、休止状態ファイルのデータも圧縮されることです。それを私の2番目のポイントと組み合わせて、高度に圧縮可能なデータを含むエクスポートするデータのセットが少ない場合(実行可能ファイルは一般にうまく圧縮されます)、休止状態ファイルに送信するデータの量はワーキングセットよりもかなり少なくすることができますデータの。コメントに記載されているように、ファイルキャッシュやその他の不要なバッファデータは、ハイバネーションファイルにダンプされるデータの量を減らすために悪影響なしで簡単に破棄できることに注意してください。

さらに、現在のハードドライブは非常に高速です。100 MB / sのオーダーの書き込みが持続しているディスクでは、1分以内に4 GBのRAM(非圧縮)を書き出すことができます。すべてのユーザープロセスをサスペンドした後、CPUをサスペンドする前に、休止状態を最後に行うことができるため、OSは通常ディスクの完全な書き込み速度になります。これは、単純なベンチマークにはないものの1つであり、ディスクからディスクへのコピーは、単にRAMをディスクに書き込むよりも遅くなる可能性があります。

これらを組み合わせると、休止状態ファイルに書き込まれるデータの量は非常に少なく、潜在的には1 GB程度であり、おそらく10秒未満で1つの大きな連続ブロックに書き込まれます。


37
または、より明確にするために、おそらくRAMがいっぱいではありません。バッファーはフラッシュされ、キャッシュは休止状態で破棄されます。アプリケーション実際に使用しているメモリのみをディスクに書き込む必要があります。ハイブリッドシャットダウンは、ユーザーをログアウトすることにより、使用中のメモリの量を減らします。
ダニエルB

2
ダーティでないページは、「スワップファイルにページアウト」のより一般的なステートメントであり、これには実行可能ファイルが含まれます。(実行可能ファイルはディスク上で多少断片化されるため、これにより起動が遅くなる可能性があります。)さらに、クリーンなファイルバッファーは、メモリマップファイルの一部ではない場合でもドロップされる可能性があります。
ポールA.クレイトン

3
私はその回答でリンクしたドキュメントの@ user2284570 「Windowsはメモリの内容をディスクにコピーすることで休止状態をサポートしています。システムはメモリの内容を圧縮してからディスクに保存します。システム上で。」
モクバイ

4
@ user2284570:最悪のシナリオは1:1圧縮であるためです。Windowsは、特定の休止状態に必要なRAMサイズの10分の1だけが必要な場合でも、hyberfil.sysに可能なメモリ構成に十分な(予約済み)スペースがあることを確認する必要があります。それに加えて、RAM使用のかなりの部分はメモリ(実行可能ファイル、リソース...)にロードされたファイルですが、それでもHDDからマップされているので、多くの書き込みを節約できます。プログラムに4 GiBの暗号ランダムデータをRAMで生成させると、休止状態にかかる時間が大幅に長くなります。それでも、その一部はスワップ状態だった可能性があります。
ルアーン

3
@ user2284570:このファイルは、すべてのメモリを保存するためのディスク上のスペースを確保するために、その大きさです。そのスペースのすべてが実際に休止状態で使用されるわけではありません。ファイルは(たとえば)7%圧縮されたメモリコンテンツ、93%がジャンクになる場合があります。
psmears

31

まず、保存する必要があるRAMの量は驚くほど少ないです。実際、マップされたダーティページ(「遅延ライトバック」)のセットのみをフラッシュする必要があり、実行可能コードに書き込まれ、再配置されたすべてのプライベートページを書き込む必要があります。

  • 実行可能ファイルの.textセグメントは、常にファイルマッピングによってサポートされます。これは少なくとも一部の DLLにも当てはまります(すべてではありませんが、再配置が必要かどうかによって異なります)。
  • 同様にファイルマッピングによってサポートされているメモリは破棄できます(CoWまたはRWではなくダーティである想定)。
  • 遅延ライトバックは引き続き発生する必要がありますが、それ以外の場合、キャッシュは破棄できます。
  • 割り当てられているが、書き込まれていないメモリ(通常はアプリケーションデータの大部分!)は、ゼロページによって裏打ちされており、破棄できます。
  • 「スタンバイ」ステータスのメモリページの大部分(Windowsの実際のプロセスごとの常駐ワーキングセットは驚くほど小さく、わずか16MB)は、ある時点でバックグラウンドのページファイルにコピーされ、破棄できます。 。
  • グラフィックカードなどの特定のデバイスによってマップされるメモリの領域は、(おそらく)保存する必要がない場合があります。ユーザーは、8GiBまたは16GiBをコンピューターに接続すると驚かされることがあり、1GiBまたは2GiBは明確な理由もなく「なくなった」だけです。主要なグラフィックスAPIでは、アプリケーションが「特定の条件下で」バッファーの内容が無効になることを要求します(これが何を意味するかを正確に伝えることなく)。したがって、グラフィックスドライバーによって固定されているメモリも単に破棄されることを期待するのは不合理ではありません。とにかく、画面はとにかく暗くなるでしょう。

第二に、ファイルをコピーするのとは異なり、ディスクに保存する必要があるRAMページのセットをダンプすることは、ドライブの観点からは単一の連続した連続した書き込みです。Win32 APIは、まさにこの操作のためにユーザーレベルの関数を公開します。書き込みの収集はハードウェアによって直接サポートされており、ディスクが物理的にデータを受け入れることができる限り高速に動作します(コントローラーはDMAを介してデータを直接プルします)。
これが機能するための多くの前提条件(アライメント、ブロックサイズ、固定など)があり、キャッシングとはうまく機能せず、「遅延書き込み」(通常の操作では非常に望ましい最適化)はありません。 )。
それがすべての書き込みではない理由です常にそのように動作します。ただし、システムが休止状態ファイルを保存すると、すべての前提条件が自動的に満たされ(すべてのデータはページに揃えられ、ページサイズが設定され、固定されます)、すぐにコンピューターの電源がオフになるため、キャッシュは無関係になります。

第三に、単一の連続した書き込みを行うことは、スピニングディスクとソリッドステートディスクの両方にとって非常に有利です。

通常、スワップファイルと休止状態ファイルは、ディスク上で作成および予約された最も古いファイルの一部です。通常、1つ、多くても2つのフラグメントがあります。したがって、セクターが損傷し、ディスクが物理セクターを再割り当てする必要がない限り、論理順次書き込みは、回転中のディスクでの物理順次書き込みに変換されます。

大量の連続した連続データが書き込まれている場合、ディスク上で読み取り-変更-書き込み操作は必要ありません。この問題は、非常に小さい単一セクターを書き込むことができる回転するハードディスクではそれほど顕著ではありません(通常、キャッシュによって防止される単一バイトを書き込まない場合、デバイスは元のコンテンツをフェッチして変更バージョンを書き戻す必要はありません)。 。
ただし、これはSSDで非常に顕著であり、書き込みごとに、たとえば512kBブロック(通常の数ですが、それより大きくなる可能性があります)をコントローラーで読み取って変更し、別のブロックに書き戻す必要があることを意味しますブロック。原則として書き込みが可能ですが(上書きはできません)フラッシュディスク上の小さなユニットでは、巨大なブロックのみを消去できます。ハードウェアの仕組みです。これが、SSDが巨大な順次書き込みでこれほど優れている理由です。


DLLが再配置された場合でも、それを元に戻すために必要なのは再配置されたアドレスだけです。再配置は確定的なプロセスであり、繰り返すことができます。
–MSalters

「書く」?「むしろ、書く」という意味ですか?
ピーターモーテンセン

3
@PeterMortensen:いいえ、私は本当に(分散読み取りとは対照的に)書き込みを収集することを意味します。これは、複数の場所からデータを収集しながら、単一のファイルに書き込むことを意味します。構造体の配列を提供します。各構造体には、開始アドレスと長さが含まれます(厳密なアライメント要件があります)。オペレーティングシステムはこれらをコントローラーに渡し、残りはハードウェアが行います。
デイモン

1
@MSalters:しかし、再配置によりページのプライベートコピーが作成されるため、プライベートコピーに他の変更が加えられているかどうかを判断することは非常に困難です。修正を必要としないマッピングとは対照的に、コピーオンライトを使用します。他の変更が行われた場合、プライベートコピーがあります。そうでない場合、ページは引き続きCoW用に構成されます。
ベンフォークト

1
@MSaltersそれは決定論的なプロセスかもしれませんが、それは冬眠コードがリンカと同じソフトウェアスタックの層で動作することを意味しません。休止状態がカーネル層にあり、リンクがユーザー層にある場合、休止状態はリンカが何をするかについて仮定することができません。
カスペルド

10

休止状態時にRAM全体をダンプしません。

RAMの大部分がすでにディスクに複製されています。これにより、休止状態がすばやく発生するだけでなく、新しいプログラムでメモリをすばやく使用できるようになります(したがって、プログラムをすばやく起動できます)。

したがって、4GBのほんの一部を書き込むだけで、10〜15秒で実行できます。

マイクロソフトから:

RAMが不足している場合(たとえば、Committed Bytesがインストール済みRAMよりも大きい場合)、オペレーティングシステムは、アクティブに使用されていない仮想メモリページをページファイルにコピーすることにより、インストール済みRAMの特定の部分をすぐに使用できるようにしようとします。したがって、このカウンターはゼロに到達せず、システムのRAMが不足しているかどうかの必ずしも良い指標ではありません。


2

上記のすべてに加えて、私は他にもいくつかの要因が働いていると思います。

1つは、ファイルをコピーするとき、ファイルを読み書きする必要があるということです。ハイバネーションでは、ファイルの書き込みのみが必要です。定義上、すでにメモリ内にあります!

これに密接に関連して、ファイルを読み取って同時に書き込む場合、メモリを節約するためのプロセスは次のとおりです。チャンクの読み取り、チャンクの書き込み、ディレクトリの更新(新しいサイズを表示する)。チャンクの読み取り、チャンクの書き込み、ディレクトリの更新。

ディスクのある部分から別の部分に移動するたびに(たとえば、ファイルaを読み取ってファイルbを書き込み、ファイルbを書き込んでディレクトリを書き込み、ディレクトリを書き込んで次のチャンクを読み取る)、ディスクはシークする必要があります-ヘッドを移動し、ヘッドが落ち着くのを待ち、ディスクの正しい部分が来るのを待ちます。これは、ソリッドステートディスクの利点の1つです。シークには時間がかかりません。休止状態になると、データはエンドツーエンドで書き込まれます。ハイバネーション(スワップ)ファイルは事前に割り当てられているため、ディレクトリを更新する必要はありません(ハイバネーションファイルのサイズは変更せず、コンテンツのみを変更します)。

そして最後に、お使いのコンピューターは他のすべてのタスクを一時停止しました-これはそれが行っている唯一のことです(これは大きな違いを生むとは思いませんが、それはいくつかを行うに違いありません!)。メモリ管理やタスクの切り替えなども中断されます。


それは大きな違いをもたらすに違いない!
ライトネスレースとモニカ

@LightnessRacesinOrbit:CPU競合はほとんど違いを生じません。I / O競合の欠如は大したことですが、この答えは、シークがパフォーマンスを低下させ、全体的な帯域幅の不足ではなくシークがI / O競合の主な問題であると既に述べています。
ベンフォークト

@BenVoigt:はい、同意します。そして、すべてがディスク上で何かを行おうとする40個のプロセスがある場合、ディスクシークが大幅に増加します。(tl; dr私はCPUの競合について話していませんでした)
モニカーとの軽さのレース

@LightnessRacesinOrbit:それは...普通の操作(休止状態に入ったり出たりすること以外のすべて)中でも珍しいようです。ディスクにヒットするバックグラウンドタスクをキャッチすると、吸盤をアンインストールし、何かを要求したときにディスクにのみアクセスするものに置き換えます。
ベンフォークト

@BenVoigt:そうは思えない。デーモンロギングは最も明白な反例であり、ntpdのドリフトファイルの更新などがそれに続きます。これらの例のいずれかがここで大きな効果をもたらすと主張しているわけではありませんが、バックグラウンドタスクがディスクに自律的に触れることを期待することは合理的ではないと思います。
モニカと

0

これはおそらく、RAMの方がハードディスクよりもはるかに高速な入出力速度を持っているため、RAMはハードディスクが読み込むことができる速度でRAM内のものを出力できるからです。

ファイルをコピーするときは、さまざまな要因によって制限されます-ディスクの速度、同じディスクに読み書きする時間がかかる場合、接続の制限速度(外部ドライブへの場合)、チェック何も上書きしないなど


9
しかし、OSはI / Oボトルネックによって管理されるディスクに4GB RAMデータを書き込む必要があります
コーダー

また、好ましいパラメーターを仮定すると、休止状態の間にディスクの書き込み速度が40MB / sから〜260 MB / sになります。正しいことはできますか?
コーダー

1
おそらく-データを書き込むだけでよいので、I / Oのボトルネックはあまりないはずです(おそらく何かがありますので、データを上書きしないように、データをどこに置くかを知っているので、ディスクを読みすぎる必要があります)。私の(Linuxデュアルブート)ラップトップではを使用dd if=/dev/zero of=/tmp/output.img bs=8k count=256kして取得できる1862606848 bytes (1.9 GB) copied, 1.81605 s, 1.0 GB/sので、可能だと思われます(とにかく、ファイルのコピーに時間がかかりすぎると思われることを追加します)。
ウィルフ

また、ローカルインターネット経由でファイルをコピーするときに、はるかに高速な転送を取得できます。また、RAM内のすべてのものをコピーする必要がない場合があります。RAM内の一部のデータはキャッシュされるだけで、休止状態から復帰するときにシステムを復元する必要はありません。
ウィルフ

私のシステムでddベンチマークを試しました。/(古いマシン)しかし、私は信じている:それは以上の52メガバイト/秒行ったことがない、それがものを上書きしないことを知っていると、それは、ディスクを読み取る必要がありませんので、どこのデータを置くような場所で何かが、おそらくそこにあるの」すぎる」が高速化の鍵です。
コーダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.