web-dev-qa-db-ja.com

「非アクティブ」メモリがまだあるときにMac OS Xがスワップを使用できないようにする方法

私の日々のOS Xの一般的な現象(およびインターネット全体のさまざまな投稿による他のいくつかの現象)では、利用可能な「空き」メモリがなくなると、システムが遅くなるようです。おそらく、これはスワッピングが原因であると考えられます。これは、重いディスクアクティビティが明らかであり、vm_statが多くのページアウトを報告するためです。 (私を間違ったことから訂正してください)

ただし、「非アクティブ」RAMの量は、スワッピングが開始/発生/終了したときに、通常、使用可能なすべてのメモリ(^ 1。)の約12.5%〜25%です。

http://support.Apple.com/kb/ht1342 によると:

非アクティブなメモリ

メモリ内のこの情報は積極的に使用されていませんが、最近使用されました。

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

そして http://developer.Apple.com/library/mac/#documentation/Performance/Conceptual/ManagingMemory/Articles/AboutMemory.html によると:

非アクティブリストには、現在物理メモリに常駐しているが最近アクセスされていないページが含まれています。これらのページには有効なデータが含まれていますが、いつでもメモリから解放される可能性があります

したがって、基本的には、プログラムが終了すると、そのメモリは非アクティブとしてマークされ、いつでも要求可能になるはずです。それでも、OS Xは、「空き」メモリが少なくなると、このメモリを要求するのではなく、メモリをスワップファイルにスワップアウトすることを好みます。

どうして?この動作の利点は、たとえば、非アクティブなメモリを即座に解放し、スワップファイルにさえ触れないことです。一部のソース(^ 2。)は、OS Xが解放する前にスワップするために「非アクティブ」メモリをページアウトすることを示していますが、メモリがメモリから解放される可能性がある場合、これは意味をなさないいつでも?スワッピングは高価で、リリースは安いですよね?

この動作は、設定または既知のハックを使用して変更できますか? (できれば、swap/dynamic_pagerを完全に無効にして再起動することを含まないものが望ましい...)

purge コマンドと、一部の空きメモリを強制するためのディスクアクセス許可の修復の概念に感謝しますが、これらは実際にスワップを修正するよりも多くの空きメモリを強制的に強制する方法です/リリース決定ロジック...

ところで、同様の質問がここで行われました: http://forums.macnn.com/90/mac-os-x/434650/why-does-os-x-swap-when/ そしてここ: http://hintsforums.macworld.com/showthread.php?t=87688 しかし、OPが中心的な質問を再度尋ねたとしても、どの回答もそれに対する回答を述べていません...

^ 1。 UPDATE 17-mar-2012 この質問を最初に投稿して以来、インストール済みRAMを4 GBから8 GBに変更しましたが、問題は解決しません。 「非アクティブ」RAMの量は以前は0.5gb-1.0gbでしたが、スワップが開始/発生/終了すると、通常は約1.0-2.0GBです。つまり、RAMの約12.5%-25%がosxによって非アクティブとして保持されているようですカーネルロジック。

^ 2。たとえば https://Apple.stackexchange.com/questions/4288/what-does-it-mean-if-i-have-lots-of-inactive-memory-at-the-end-of- a-work-day

すべてのメモリが使用されると(空きメモリは0)、OSは非アクティブなメモリをスワップファイルに書き込んで、アクティブなメモリの空き容量を増やします。

UPDATE 17-mar-2012

以下は、これまでに役立つことが提案されているメソッドのまとめです。

purgeコマンド

「パフォーマンス分析のためにコールドディスクバッファーキャッシュを使用して初期ブート条件を概算するために使用されます。malloc、vm_allocateなどを通じて割り当てられた匿名メモリには影響しません。」.

これは、osxがディスクキャッシュをスワップアウトするのを防ぐのに役立ちます(これは、最初にosxが実際にそうするのはばかげています)が、ディスクキャッシュが解放されるという欠点があるため、ディスクキャッシュがスワップアウトすると、コールドディスクバッファキャッシュが発生し、パフォーマンスに悪影響を与える可能性があります。

The FreeMemory app and/or Repairing disk permissions to force some Free memory

メモリの解放の助けにはならず、数ギガバイトのメモリの内容をRAMからHDに移動するだけです。最後に、メモリの解放中に開いていたアプリケーションを使用しようとすると、多くのスワップインが発生します。これは、そのVMの多くがスワップ上にあるためです。

dynamicpagerwrapperを使用してスワップ割り当てを高速化

スワップの使用を高速化するために行うことは良いことのようですが、非アクティブなメモリが残っているときに、そもそもosxスワッピングの問題に対処していません。

dynamicpager を無効にして再起動することでスワップを無効にする

これにより、すべてのメモリが使用されている場合、osxはシステムハングの価格までスワップを使用しなくなります。実行可能な代替案ではありません...

a hacked dynamicpagerを使用してスワップを無効にする

上記のダイナミックページャーを無効にするのと同様に、ブログ投稿へのコメントからの一部の抜粋は、これが実行可能な解決策ではないことを示しています:「通常どおり非アクティブなメモリが高い」。 「システムのメモリが不足すると、OS全体がハングします...」、「Macのメモリをすべて消費すると、マシンがハングする可能性があります」

要約すると、まだ「非アクティブ」なメモリがあるときに、Mac OS Xがスワップを使用できないようにする方法はまだわかりません。それが不可能な場合は、少なくともosxがメモリをスワップアウトする理由のどこかに、いつでもメモリから解放される可能性があるという説明があるかもしれません

62
Motin

定義により、非アクティブメモリはページアウトの準備ができているメモリであり、ページングアウトはスワップへの書き込みを伴う場合があります。 これは、いかなる種類の問題でも、最適化すべき問題でもありません。実際にはOS Xは設計どおりに機能しています

残念ながら、テクニカルサポートライターはカーネル開発者ではありません。また、Appleナレッジベースサポート記事の引用は、非アクティブメモリがプログラムで使用されていないメモリであると主張している場合、間違っています。プログラムを終了すると、常駐メモリはFreeになり、Inactiveで停止することはありませんが、メモリ管理の仕組みを説明する 開発者サイト への2番目のリンクは、完全に読めば良いリソースです。

OS Xでの「非アクティブメモリ」の意味については多くの誤解があります。誤解とは異なり、すべての非アクティブメモリが空、未使用、キャッシュ、またはパージ可能であるとは限りません。実際、アクティブメモリは、最近アクセスされた場合、キャッシュまたはパージすることもできます。多くの非アクティブなメモリには、単純に破棄できないデータも含まれています。破棄された場合、破棄されたページには有効なデータが含まれ(OS X開発者側からの引用によると)、プログラムは(仮想)メモリに格納されたデータが消えるだけではないことを期待するため、プログラムがクラッシュします。

非アクティブメモリには、アクティブメモリと同じタイプのデータが含まれています。唯一の違いは、OS Xが一部のメモリチャンクがしばらくの間読み書きされていないことに気付いたことです。

OS Xが一部のメモリを非アクティブとして分類し、その他の領域を「アクティブ」として分類する理由は、ページアウトに関係しています。メモリが不足すると、データをページアウトする必要があります。問題は、どのデータですか?プログラムがすぐに再び必要とすることが判明したデータをページアウトした場合、それは時間を浪費し、何も達成しません。したがって、プログラムがすぐに再び使用する必要がないメモリをページアウトしたいとします。

プログラムは仮想メモリを好きな方法で使用でき、OSにその計画について何も伝えないため、将来どのページが不要になる可能性があるかを予測することは困難です。しかし、ヒューリスティックなものとして、ほとんどのプログラムはメモリ使用量が「固定」されています。しばらくの間メモリの一部を使用していなかった場合、そのメモリを使用し続けず、最近使用したメモリを引き続き使用する可能性があります。

そのため、OSが一部のデータをページアウトすることを決定した場合、最近使用されていないページをスワップする戦略を取ります。これが、OS Xがプログラムによって占有されているメモリを「アクティブ」と「非アクティブ」の2つの山に分類する理由です。開発者サイトへの 上記のリンク は、完全に読んだ場合、そのプロセスがどのように行われるかを示しています。

  • メモリが少なくなり始めると、OSはアクティブなメモリページを通過し始め、各ページにフラグを設定します。
  • プログラムがページの読み取りまたは書き込みを行うと、フラグはクリアされます。
  • 少し遅れてフラグがクリアされない場合、そのページは「非アクティブ」パイルに分類されます。
  • 「非アクティブ」ページがそのプログラムによってアクセスされると、「アクティブ」パイルに戻されます。
  • メモリが不足すると、「非アクティブ」ページがページアウトされます。

スワップアウトするメモリを決定するこの並べ替えプロセスは、最新のすべてのオペレーティングシステムで同様です。 Understanding the Linux Virtual Memory Manager で説明されているように、Linuxにはアクティブページと非アクティブページの同じ2つのリストがあります。 Windowsは、2つ以上のクラスのリーセンシーで少し異なるものを使用する場合があります。現在、信頼できる最近の技術的な説明は見つかりません。その他の実装については、Wikipediaのページ "ページ置換アルゴリズム" で説明されています。 OS Xとの唯一の違いは統計の表示方法でした。誰かがtopまたはアクティビティモニターでアクティブと非アクティブの別々の数値を表示することをお勧めします。振り返ってみると、これはおそらくそれほど良い考えではありませんでした(そしてこれはOS X 10.9で変更されました。)

フラグを設定およびクリアし、アクティブ/非アクティブヒープを維持するこのプロセスは、プロセッサの電力を少し消費します。そのため、空きメモリが大量にある場合、OS Xはそれを行いません。したがって、最初に起動したプログラムは、空きメモリが少なくなるまで、すべての「アクティブ」メモリとして表示されます。

したがって、白紙の状態から始めて、ますます多くのプログラムを開くと、アクティビティモニターに次の進行状況が表示されることが期待できます。

  • まず、「空き」メモリが多く、非アクティブなメモリはほとんどありません。これは、メモリフラグ機能が実行されていないためです。
  • 空きメモリの量が減ると、OS Xはそのメモリフラグ機能を実行し始め、「非アクティブ」の量が増加し始めているのがわかります。 「非アクティブ」の各ビットは以前は「アクティブ」でした。
  • 空きメモリが不足すると、「非アクティブ」パイルのページがページアウトされます。メモリフラグ機能は、メモリをアクティブと非アクティブに分類するフルティルトも実行します。通常、スワップが書き​​込まれている間、多くの「非アクティブ」が表示されます。これは、メモリフラグが想定どおりに動作していることを示しています。

ページは、スワップアウトされる前に非アクティブとして分類する必要があります。 Apple開発者サイトからの引用は、「これらのページには有効なデータが含まれていますが、いつでもメモリから解放される可能性があります。」という意味です。これは、アクティブページとは反対です。非アクティブに降格されるまで解放されません。ページを解放するにはさまざまな方法があります。ページがファイルからマッピングされていて変更されていない場合は、すぐに削除してオンデマンドで再読み取りできます。同様に、以前にスワップアウトされ、スワップインされてから変更されていないメモリ。プログラムは、キャッシュとパージ可能なメモリを明示的に割り当て、必要に応じて忘れて再作成できるデータを格納することもできます(ただし、プログラムがキャッシュを割り当てる理由は、ただし、非アクティブなメモリの多くは、プログラムが有効なデータを書き込んだメモリであり、このデータをページングするには、スワップへの書き込みが必要です。

したがって、アクティビティモニターで "非アクティブ"なメモリの量を確認し、コンピューターがスワップに書き込みを行っていると同時に多くの非アクティブ状態があることを確認しても、システムが設計どおりに機能していることがわかります。

非アクティブなメモリとファイルキャッシュの間にも混乱があります。 Activity Monitorではすでに別の見出しの下にそれらがリストされているため、なぜそのような混乱があるのか​​わかりません。キャッシュは、ファイルシステムに再度アクセスする必要がある場合に備えて、ファイルシステムに対して読み取りまたは書き込みが行われた最近のデータを格納するために使用されるメモリです。メモリが少ない場合、OS Xは最初にキャッシュを削除する傾向があります。スワップスラッシングがあり、アクティビティモニターに大量のキャッシュ(非アクティブではない)が表示されている場合、それが問題になります。しかし、非アクティブなメモリは別のものです。

疑問がある場合は、「非アクティブ」と「アクティブ」の違いを無視してください。それらを「プログラムが使用するメモリ」の1つの塊であると見なし、2つの数値を加算します。これは、他のすべてのオペレーティングシステムがメモリ使用量について通知するときに行うことです。

OS X 10.9の注意:Mavericksは、多かれ少なかれ、スワップの別の層である「メモリ圧縮」を導入しました。アクティブなページは非アクティブに分類され、圧縮され(使用しているツールによってはカーネルメモリとして表示される場合があります)、メモリ使用量の増加に応じてスワップに書き込まれます。 Mavericksはまた、特にそれを取り巻く誤解を考えると、アクティビティモニターでアクティブと非アクティブの別々の数を表示することをやめました。

20
crowding

恒久的な解決策ではありませんが、少なくとも一部の非アクティブなメモリを取り戻すのに役立ち、恐ろしいスワッピングを回避できる可能性があります。 http://iTunes.Apple.com/nz/app/freememory/id460931672?mt=12

ツールは無料で、かなり使いやすいです。起動したら、システムのツールバー/メニューで[メモリを解放]オプションを選択します。

ActivityMonitorのメモリ表示とは異なり、空きメモリのみを表示します。これは、スワッピングが行われているかどうかを示すより良い指標と思われます。

4
Jörn Zaefferer

現在、macos Xのswappiness(または呼ばれる)動作を調整する簡単な方法はありません。ただし、いくつかのハックがあります(開発者アカウントとSDKが必要です)。

http://cestdelamerde.com/archives/22-Killing-Mac-OS-X-Swapping-How-To-Disable-dynamic_pager.html

http://dropsafe.crypticide.com/article/3848

幸運を!

追記。 MacOSXでアクティブ、非アクティブ、およびその他のメモリをより一般的に確認するには、この回答も(私も)読んでおくとよいでしょう: ワイヤードメモリとOS Xのアクティブメモリ

4
bubu

OS X 10.5以降、MAC OS Xに明らかなメモリ管理の問題があります。その後、しばらくするとシステムの速度が大幅に低下するという不満がウェブに散らばっています。その当時、私はより遅いマシン、1GBのRAMを搭載したMac Miniを持っていたので、(間違って)ハードウェアの不良が原因であると結論しました。

2010 MBP、コアi7、8 GB RAM、デュアルGPUが搭載されました。 Mac os X Snow Leopardは苦痛でしたが、OS X Lionへの移行後、MACで深刻な作業を行うことは悪夢になり始めました。

ようやく問題のあるシナリオを再現できたので、テストを実行して画面をビデオに記録しました。

MAC OS X Lionのパフォーマンスの問題-メモリ管理の破損

私は、私のPictures /フォルダーにある大量の画像ファイルに対して、UNIXの基本的なものであるtar + bzipコマンドを実行します。開始する直前に、「purge」コマンドを実行して、非アクティブ/キャッシュされたプログラムデータを削除します。

ビデオを見ると、空きメモリが非常に速く減少し始め、非アクティブが常に増加していることがわかります。 「bsdtar」コマンドを見ると、RAMの断片のみが必要なので、このプロセスには問題はありません。これはプログラムのメモリリークであるとは言えません。問題は非アクティブなRAMではなく、アクティブ/有線にあるためです。

無料のメモリが100 MBを下回ったときに、Safari、iPhoto、MS Wordなどのアプリをいくつか起動したところ、通常の場合(無料のRAMがある場合)、アプリの起動に数分かかることがわかります。読み込みに3〜5秒かかります。

Linux Centos 6ボックスで同じシナリオと同じコマンドを実行しましたが、問題ありません。メモリ使用量は10〜20MB程度で、キャッシュ/バッファに問題はありません。

Mac OS Xでは、メモリ管理が非常に壊れている必要があります。

2
egremyl

これには正解はないと思います。これは、Macをスリープ状態にしてもアクティブのままであるメモリと同じです。スリープするたびに成長します。

「楽しい」(別名:高額)側では、メモリをアップグレードするか、HDDをSSDに置き換えることができるため、スワッピングがパフォーマンスに影響を与えることはありません。 Corsairメモリがリーズナブルな価格で入手できるようになったため、私は最初のオプションを選択しました。

16GB RAM

1
user127350