web-dev-qa-db-ja.com

「非アクティブなメモリ」がたくさんあるときにOS Xがスワップを使用するのはなぜですか?

私は数ヶ月からOS Xを使用しています(Lion、現在はMountain Lion)。 miniに8 GBありますが、ほぼ毎日、それに近づいています。 8 GBのWindows 7マシンでは、そのような問題は一度もありませんでした。とにかく、私はネットを読んで、非アクティブなメモリは最近閉じられたプログラムのアプリキャッシュであり、より速く再起動するために使用できることを示しています。この非アクティブなメモリは、必要に応じて新しいアプリに解放できます。リリースされていません。代わりに、OS Xがスワッピングを開始します。だから私の質問は、「非アクティブなメモリ」がたくさんあるときにOS Xがスワップを使用する理由です。ここに私が何を意味するかを示す画面:

enter image description here

スワッピングを開始する前に、OS Xでこれらの2.69 GBを使用できるようにしておくことを望んでいます。

23
Balchev

スワップは明らかに、非アクティブなRAM=ページが実際にアクティブだったときに発生しました。

Update:コメントで明らかにされたので、これはあなたのケースではありません。同じ問題を抱えている人々は水平方向のルールにスキップします。)

つまり多くのプログラムを実行していて、カーネルがいくつかのページをスワップアウトしました。次に、いくつかのプログラムを終了しました。カーネルは、それらのRAMページを非アクティブとしてマークします。しかし、これらのページが必要になるまで、ページをRAMにスワップインしません。これにより、両方のページが非アクティブでスワップアウトされたページ。

ページを先取りして入れ替えてみませんか?それはオッズに対して賭けるだろうから:長期的にはあなたが失う。単純化した例を考えてみましょう。2つのプログラムAとBが同時にRAMに適合しません。プログラムAはまだ実行中で、スワップアウトされたすべてのページはAに属しています。プログラムBが終了し、非アクティブなページはすべてBに属しています。

カーネルがプリエンプティブにAのページをスワップインし、直後に:

  • プログラムAはそのページにアクセスする必要があります->あなたは勝ちます-ページはすでにRAMにあります。
  • bを再び起動する->失う-ページをRAM)に移動するためのコストを「支払った」ので、それらを送り返す必要があります。
  • 別のプログラムCを起動する-> AとCがRAMに同時に適合しない場合、負けます。適合している場合、偶数です。

また、スワップアウト(ディスクへの書き込み)はスワップイン(ディスクからの読み取り)よりもコストがかかることを考慮してください。これは、この「賭け」をさらに魅力のないものにします。

要するに、カーネルを信頼し、それを上回ろうとしないでください。


更新:非アクティブなメモリは アクティビティモニターを使用したシステムメモリの読み取り の記事が多くの人々をリードしているように機能しないことが判明それが機能すると信じています。非アクティブなメモリの記事に記載されている定義は正しいです:

この情報はRAM=にありますが、積極的に使用されておらず、最近使用されました。

しかし、次の例は完全に誤解を招きやすく、過度に単純化されています(率直に言うと、私の例のように)。

たとえば、Mailを使用していてそれを終了した場合、Mailが使用していたRAMは非アクティブメモリとしてマークされます。非アクティブメモリは、Free memoryと同様に、別のアプリケーションで使用できます。ただし、別のアプリケーションで非アクティブメモリが使用される前にメールを開くと、低速ドライブからロードするのではなく、非アクティブメモリがアクティブメモリに変換されるため、メールの起動が速くなります。

さらにオンラインリソースを検索したところ、ダーウィンカーネルのメーリングリストで this thread になりました。ジム・マギーの引用(ダーウィンチーム​​から-私は思う):

要するに、カーネルVMシステムは、メモリ使用率のページを処理するときに、使用中のページをスキャンし、アクティブマーキングと非アクティブマーキングのバランスを維持しようとします。それらが再利用された場合、それらはアクティブとしてマークされ、他のページがアクティブから非アクティブの状態に移行して、それがアクティブに使用されているかどうかを検出する必要があります。したがって、非アクティブは誤称です。「非アクティブである可能性があります。確認してみてください。」

あなたが発見したように、私たちが(現在)努力している内部バランスは、約2/3がアクティブ、1/3が非アクティブです...

これは、観察する動作を説明します。つまり表示される非アクティブなページは、最近使用されていない実行中のプログラムに属しています。したがって、新しいプログラムを起動すると、非アクティブなページがスワップアウトされます。同時に、他のプログラムのページは非アクティブとしてマークされ、アクティブと非アクティブの2/1の比率を維持します。

thread には、ダーウィンの内部についてさらに学ぶための提案も含まれています。また、ビーチボールの問題(通常はそれとほとんど関係がない)のためにメモリ使用量の調査を開始した場合のいくつかの提案もあります。

結論は同じです:カーネルを信頼し、それを上回ろうとしないでください。 :-)

18
m000

十分なRAMがある場合は、ページングを安全に無効にできます。

これらのコマンドを試してください。

Sudo launchctl unload -w /System/Library/LaunchDaemons/com.Apple.dynamic_pager.plist
Sudo rm /private/var/vm/swapfile*

次に、再起動して、dynamic_pagerプロセスが実行されていないことを確認します。

/private/var/vm/にスワップファイルが作成されていないことを確認してください。

再度有効にするには、次のコマンドを試してください。

Sudo launchctl load -wF /System/Library/LaunchDaemons/com.Apple.dynamic_pager.plist

Spotlightを無効にして、RAMを解放し、ディスクアクティビティを減らすこともできます。 Spotlightを無効または有効にするには、次のコマンドを使用します。

Sudo launchctl unload -w /System/Library/LaunchDaemons/com.Apple.metadata.mds.plist
Sudo launchctl load -wF /System/Library/LaunchDaemons/com.Apple.metadata.mds.plist
6
arundevma

システムは設計どおりに動作しています。メモリに負荷がかかっていない場合でも、破棄できないが、システムがビジー状態でないときに最近スワップに使用されていないページを書き込むことは理にかなっています。こうすることで、後でメモリ不足が発生した場合に、システムがビジー状態のときにスワップするために最初に書き込む必要なく、これらのページをRAMから追い出すことができます。

0
David Schwartz

できることは多くありません。なぜそれをするのですか?それはOS Xが機能する方法だからです。興味深いのは、Macがスリープ状態になるたびに、占有メモリがどんどん大きくなることです。

あなたにできること:

  1. RAMをアップグレードします。
  2. 必要なときはいつでも、「purge」コマンドを実行して、ほとんどの非アクティブなメモリを消去します。
  3. スワップを無効にする http://osxdaily.com/2010/10/08/mac-virtual-memory-swap/
0
user127350