部分的にRAMがいっぱいになると遅延が発生するのはなぜですか?


53

より多くのデータを保存するために利用可能なスペースがあるにもかかわらず、部分的にフルRAM(たとえば80%)でデバイスが大幅に遅れるのはなぜですか?私が期待しているのは、99%までうまく機能し続けることです。

モバイルの方がPCよりもRAMが小さいことに気付きます。たとえば、私のモバイルには2 GBのRAMがあります。RAMの空き容量が1 GB未満の場合、かなり遅れます。使用する〜1 GBがまだあるのに、なぜそれが起こるのですか?


28
使用可能なRAMは使用されていないと想定しているのではないかと思います。したがって、20%のRAMが使用可能であることがわかり、RAMの80%しか使用されていないと考えます。これは正しくありません。RAMは使用も使用も可能です。(たとえば、現在使用しているマシンには32GBのRAMと21.1GBの空き容量がありますが、1.8GBのみが無料です。)
デイビッドシュワルツ

2
RAMのあるHDDの空き容量ですか?そうではありません。
モハメッドヌールディン

3
確実に交換できます。しかし、それはパフォーマンスに大きな悪影響を及ぼします-まさにあなたが見ているように。ワーキングセットがRAMを超える場合、使用可能なRAMの量に関係なく、パフォーマンスはひどくなります。
デビッドシュワルツ

3
デバイスを遅らせるのはRAMの割合だと思いますか?
-enkryptor

4
@MohammedNoureldin RAMがビジーな理由(多くのプロセスが機能し、何かをしている)があるに違いないと思います。これは、デバイスが遅れている同じ理由かもしれません。RAMのロードは単なる症状であり、理由そのものではありません。
-enkryptor

回答:


70

ここには多くのことが関係していますが、できる限り簡単に、あらゆるOSに適用できる方法で説明するようにします。

ここには2つの基本原則があります。

  1. RAMに格納する必要があるすべてのものと、RAMに格納することで恩恵を受けるものの合計は、ほとんどの場合RAMのサイズよりも大きくなります。RAMに配置することでメリットが得られるのは、プロセスのワーキングセットとスタンバイリストです。後者には、かつてアクティブに使用されていたが、その後非アクティブになったデータとコードが含まれています。この多くは再び使用されますが、一部はすぐに使用されるため、RAMに保存しておくと便利です。このメモリは一種のキャッシュとして機能しますが、実際には必須ではないため、使用可能なメモリのカテゴリに含まれます。空きメモリのように、それを必要とするプログラムにすぐに与えることができます。パフォーマンスのために、スタンバイメモリは大きくする必要があります。

  2. メモリブロックの使用頻度はランダムではありませんが、かなりの精度で予測できます。メモリは、多くの場合4Kバイトのブロックに分割されます。一部のブロックは1秒あたり何回もアクセスされますが、他のブロックは、システムが十分に長く稼働している場合、何分、何時間、何日、さらには何週間もアクセスされていません。これら2つの両極端の間には、幅広い使用法があります。メモリマネージャは、最近アクセスされたブロックとアクセスされなかったブロックを認識します。最近アクセスされたメモリブロックがすぐに再び必要になるのは合理的な仮定です。最近アクセスされていないメモリは、おそらくすぐに必要になることはないでしょう。長い経験から、これが有効な原則であることが証明されています。

メモリマネージャは、2番目の原則を利用して、最初の原則の望ましくない結果を大幅に軽減します。これを行うために、最近アクセスされたデータをRAMに保持し、めったに使用されないデータを元のファイルまたはページファイルに保持するというバランスの取れた動作を行います。

RAMが十分にある場合、このバランスを取ることは簡単です。最近使用されていないデータの多くは、RAMに保持できます。これは良い状況です。

ワークロードが増加すると、事態はさらに複雑になります。使用中のデータとコードの合計は大きくなりますが、RAMのサイズは変わりません。これは、これの小さいサブセットをRAMに保持できることを意味します。最近使用されていないデータの一部は、RAMに保存できなくなりますが、ディスク上に残しておく必要があります。メモリマネージャは、アクティブな使用中のメモリと使用可能なメモリとのバランスを維持しようと非常に努力します。ただし、ワークロードが増加すると、メモリマネージャは実行中のプロセスにより多くの使用可能なメモリを割り当てるように強制されます。これは良い状況ではありませんが、メモリマネージャには選択肢がありません。

問題は、プログラムの実行中にRAMとの間でデータを移動するには時間がかかることです。RAMが十分にある場合、それはあまり頻繁に発生せず、気付かれることさえありません。しかし、RAMの使用率が高いレベルに達すると、はるかに頻繁に発生します。状況は非常に悪化する可能性があるため、実際に使用するよりもRAMとの間でデータを移動するのに時間がかかります。これはスラッシングであり、メモリマネージャが回避しようと非常に努力しますが、作業負荷が高い場合は回避できないことがよくあります。

メモリマネージャーはあなたの側にあり、常に悪条件の下でも最適なパフォーマンスを維持するのが最善です。しかし、ワークロードが大きく、使用可能なメモリが不足すると、機能を維持するために悪いことをしなければなりません。それが実際、最も重要なことです。優先順位は、最初に物事を実行し続けてから、可能な限り速くすることです。


1
あなたの答えはとても助かりました、ありがとう!それmemory mangerは私のOS権利の一部ですか?ポインタとこれらの非常に低いレベルのことを扱っていた場合、それでもページングを行うことができますか?
モハメッドヌールディン

7
メモリマネージャはOSの一部です。ページングは​​メモリマネージャの基本的な機能であり、呼吸があなたと私にとって重要であるのと同様に操作に不可欠です。停止することはできません。
-LMiller7

2
@MohammedNoureldin:ユーザー空間アプリケーション(メモリビューがカーネルや他のプロセスから隔離されている)を作成している場合、物理メモリに直接アクセスすることはできません。あなたは、すべてのアクセスをすることができますが、あなたがそれを推測- -ページングを含む(おそらく)、すべての機能を持つメモリマネージャによって管理されているメモリ上の図です。メモリポインタは、メモリビューのアドレス空間内のポイントのみを参照します。これらは、カーネルとユーザー空間の両方のコードで使用される言語概念ですが、2つのメモリビューが同一であることを意味するものではありません。プロセスメモリ管理とカーネルMMを混同しないでください!
デビッドフォースター

6
それは「明白」または「よく知られている」ですが、おそらくこの答えに追加する必要があります:メモリ(RAM)はハードドライブよりも1000倍高速です(まあ、ssd / ideなど、多くのものに依存しています) / sataなど)。OSはディスクからではなく、ram(+ cache)からコードを実行します。メモリが少なくなり、OSが(「未使用」)コードの一部をメモリからディスクに「スワップ」し、RAMを解放して他の何かを実行する必要がある場合、これには「大量」の時間がかかります(スワップ)。これが頻繁に発生する場合(例:多くのプログラムがあり、それぞれがコードをメモリにロードするためにスワップが必要だった場合)、処理が大幅に遅くなります。
オリビエデュラック

3
通常、コードをメモリにロードすることを指すために「スワップ」という用語を使用しません。これは通常「障害」と呼ばれます。通常、「スワップ」という用語は、RAMから取り出す前にディスクに書き込む必要がある情報にのみ使用されます。
デビッドシュワルツ

29

最新のオペレーティングシステムはすべて、データをキャッシュするために未使用のメモリを使用するため、低速なストレージではなく高速なRAMからアクセスできます。アプリケーションは必要に応じてキャッシュをクリアして使用できるため、通常は空きメモリとしてこれを報告しますが、実際にはまだ使用されています。少なければ少ないほど、キャッシュできるデータが少なくなり、コンピューターの速度が遅くなります。


11
実際、アプリケーションはキャッシュを「クリア」する必要はありません。OSにRAMを要求するだけです。OSは、未使用のRAMがないことを確認して、ファイルキャッシュの一部をクリアし、ゼロになったRAMをアプリケーションに提供します。アプリケーションは、そのRAMがどこから来たのかわかりません。
–MSalters

5
@MSaltersはい、同意します。アプリケーションがRAMを要求し、必要に応じてOSがキャッシュをクリアします。シンプルにしようとしていました。
マイクスコット

それはいくぶんはっきりしていましたが、私は詳細についてもう少し気づいているので、何かが欠けていると感じており、@ LMillerの回答が実際に私を助けてくれたという感じがあります。その中の情報。
モハメッドヌールディン

4

この答えは、構造を再編成し、メッセージを明確にするために大部分が書き直されました。また、コミュニティWikiの回答として公開しました。編集してください。

ページングは​​、メモリの固定サイズブロ​​ックにプロセスが割り当てられるメモリ管理スキームです。メモリ使用量が高レベル(つまり80%の容量)に達すると、ページングがRAMからvRAM(仮想RAM)に拡大し始めます。

vRAMは、通常はハードドライブ内のシステムストレージ、またはその他のサイズの大きいストレージの場所にあります。

プロセスは、メモリとして実行するためにハードドライブの一部に割り当てられ、そのセクションをRAMとして扱います。これは完全に正常なプロセスですが、vRAMとの間でデータを転送するのにかかる時間が長くなると、システムのパフォーマンスが低下します。

専用RAMは、高速接続を提供するCPUからマザーボードを介して直接アクセスされますが、仮想RAMは、ボードとvRAMの場所の間のケーブル接続を横断する必要があります。

ただし、これはパフォーマンスにわずかな影響しか与えません。vRAMへのページングが発生する割合が大幅に増加すると(専用RAMが容量に近づくと)、スラッシングが発生します。

スラッシングは、メモリのページを仮想メモリに迅速かつ迅速に転送する方法です。これは、データのフェッチとアドレス指定により多くの時間を費やさなければならないため、パフォーマンスに多大な損害を与えます。

たとえば、30桁の数字を書き留めたいとします。メモ帳を使用して画面の横に座ってそれを書き込む(専用メモリを使用)か、5個のチャンクを覚えて隣の部屋に移動し、そこにあるメモ帳にメモします(仮想メモリを使用)。両方とも仕事を成し遂げますが、どちらが早くなるでしょうか?

解凍の詳細については、こちらをご覧ください

ダニエルBキセノイドジョンベントレーなど、この回答の貢献者に感謝します。


3
スラッシングが意図的なものではない。これは、ページングと物理メモリの競合の副作用にすぎません。また、仮想メモリは、ページをディスクに移動しても「作成」されません。
ダニエルB

スラッシングは副産物であり、本当ですが、プロセスがオーバーランする場合に非常に便利なものであり、グリッドロックの防止に役立ちます。はい、仮想メモリは作成されるのではなく占有されます。私は中にいることを編集します。
ウィル

8
いいえ、ゴミ箱とページングを混同しています。トラッシングは、ページングが病的になるだけです。
キセノイド

@xenoidページングは​​メモリ管理スキームです。それは、私が車と高速道路システムで鹿を打つことを混乱させていると言っているようなものです。スラッシングは、このパフォーマンスの低下を引き起こすプロセスです。ただし、これはページングシステムの結果であることに同意します。
ウィル

1
Wikiの回答に組み込まれたコメントは、自由に編集できます。
ウィル

1

これは、OSがソフトウェアを実行し続けるために、多くのページング(アクティブなプログラムの一部の読み込み)とスワッピング(RAM内のデータのHDへの移動、またはその逆)を行う必要があるためです。使用可能な20%よりも多くのスペースを必要とする可能性がある新しいページをロードする必要がある場合、OSはRAM内の既存のページをスワップアウトする必要があります。特に他のプログラムの起動時。ページのスワップアウトとバックインには時間がかかり、RAMではなくHDの速度で作業しているため、PCのパフォーマンスが大幅に低下します。

HDDでHDに特別なパーティションを作成し、それを専用の「スワップ」(「実際の」ファイルに使用しない)スペースとして割り当てると、スワップがHDの断片化の影響を受けにくくなります。


キャッシュ、ページングなどについて話すとき、ROMはHDの単なる命名法です。作業メモリではないものはすべて。また、ROMは通常RAMよりも遅く、ほとんどの場合そうです。古いコンピューターは、起動時に高速で動作するため、ROMからRAMにデータをコピーしました(ROMシャドウイング)。
ジルレジー

1
もちろん、ROMとRAMは不揮発性メモリ対揮発性メモリとしても使用されますか?BTW ROMは通常低速で、ROMはパフォーマンス向上のために起動時にRAMにコピーされます(ROMシャドウイング)。しかし、確かに、1つの参照を変更して、あなたのニトピッキングを修正します。;)
ジルレジール

1

覚えておいて、ハードドライブはRAM よりも桁違いに遅く、RAM自体は最初からそれほど高速ではありません(アーキテクチャ全体では)。アクセス速度の順に(各ラングは上記のものよりも桁違いに遅い)、あなたは持っています

  1. プロセッサレジスタ -実際には、レジスタは1プロセッササイクル内で使用できます。プロセッサが毎秒数十億サイクルを実行することを考慮すると(3 GHz =毎秒30億サイクル)、これは非常に高速です。
  2. プロセッサキャッシュ -レベルに依存しますが、これらはまだかなり高速です(L1キャッシュで3〜5サイクルの可用性)。
  3. ランダムアクセスメモリ(RAM) -ランダムな部分は、アクセスしたときの状態がわからないことを意味します。荷物を止め、荷物を受け取り、ドアまで歩いてドアベルを鳴らして応答を待たなければならない荷物配達員を考えてください。たぶん、まったく待たないか、スミス夫人が家の裏のドアに向かってシャッフルするのを1、2分待つでしょう。実際には、14〜27サイクル(RAMがアクセスしたときの状態によって異なります)のどこからでも話します。
  4. ハードディスクドライブ -ここには物理的なプロセスがあります。可能な限り高速で、ヘッドが移動し、そのヘッドの下でトラックが移動するのを待っています。実際には、7,200 RPMのHDDは約4ミリ秒で、または3 GHzプロセッサーの場合は750,000サイクルで革命を完了することができます。遅いです。

Virtual Memory Managerはギャンブラーです。常にすべてのRAMを必要としているわけではないので、知識に基づいた推測を行い、ドキュメントプログラム(これを読んでいる間、最後の10分間はバックグラウンドにあった)がサイコロを振る本当に重要で、HDDに押し込みます。

しかし、その後、ドキュメントに戻ります!ここで、VMMはすべてのデータをHDDからロードする必要があります。さらに悪いことに、RAMが少ない場合は、他のデータ(ギャンブルが多い)をHDDにプッシュして、使用可能なスペースを解放する必要があります。Linuxは、ここの端に住むのが好きです。RAMの大部分を頻繁に使用されるデータで満たします(プロセスが少ないサーバーに最適)。


1
はい、メモリマネージャはギャンブラーですが、それは非常に簡単に誤解される可能性があります。メモリアクセスが本当にランダムである場合、メモリマネージャは正しい回数だけ間違っており、システム全体が故障します。しかし、プログラムは参照の強い局所性を示す傾向があります。つまり、ほとんどのメモリアクセスは、比較的小さなメモリ領域にローカライズされる傾向があります。それらは動き回るが、システムが動作するのに十分遅い。オッズはメモリマネージャーに有利に積み上げられ、ミスはすぐに修正されます。これは数十年の経験で証明されています
-LMiller7

ランダムアクセスメモリ内のランダムとは、ランダムにアクセスできるという事実を指します。(データがハードドライブやテープのように読み取りヘッドの下を通過するのを待たずに、データに順番にアクセスする必要があります。)
フィル

0

スラッシングの答えはほとんどそれを釘付けにします。可能であれば、swappiness(スワップスペースに物を移動する前にシステムが使用できるRAMの量)を減らすことで、これが発生するまでの時間を最小限に抑えることができます。サーバーアプリケーションのRAMが99%に達するまでスワップを回避するようにシステムを設定するのが好きですシステムをスワップ空間に入れます。

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