OS X を日常的に使用する場合 (およびインターネット上のさまざまな投稿によると他のユーザーの場合) によくある現象ですが、空きメモリがなくなるとシステムが遅くなるようです。ディスク アクティビティが激しく、vm_stat が多数のページアウトを報告していることから、これはスワッピングによるものと思われます。(間違っている場合は訂正してください)
ただし、スワッピングが開始/発生/終了するときの「非アクティブ」な RAM の量は、通常、使用可能なメモリ全体の約 12.5% ~ 25% になります (^1.)。
によるとhttp://support.apple.com/kb/ht1342:
非アクティブメモリ
メモリ内のこの情報はアクティブには使用されていませんが、最近使用されました。
たとえば、メールを使用していて終了した場合、メールが使用していた RAM は非アクティブ メモリとしてマークされます。この非アクティブ メモリは、空きメモリと同様に、別のアプリケーションで使用できます。ただし、非アクティブ メモリが別のアプリケーションで使用される前にメールを開くと、メールが低速のハード ディスクから読み込まれるのではなく、非アクティブ メモリがアクティブ メモリに変換されるため、メールはより速く開きます。
非アクティブリストには、現在物理メモリに常駐しているが最近アクセスされていないページが含まれます。これらのページには有効なデータが含まれていますが、いつでも記憶から解放される可能性がある。
つまり、基本的には、プログラムが終了すると、そのメモリは非アクティブとしてマークされ、いつでも要求可能になります。それでも、OS X は、「空き」メモリが少なくなると、このメモリを要求するのではなく、メモリをスワップ ファイルにスワップ アウトし始めることを優先します。
なぜでしょうか? この動作は、たとえば、非アクティブメモリを即座に解放し、スワップファイルに触れないよりもどのような利点があるのでしょうか? いくつかの情報源 (^2.) によると、OS X は「非アクティブ」メモリをスワップにページアウトしてから解放するとのことですが、メモリがいつでも記憶から解放される可能性がある? スワップは高価ですが、リリースは安価です。
この動作は、何らかの設定や既知のハックを使用して変更できますか? (できれば、swap/dynamic_pager を完全に無効にして再起動する必要がないものが望ましいです...)
私は感謝しますパージコマンド、およびディスク権限を修復して空きメモリを強制するという概念がありますが、これらは、スワップ/解放の決定ロジックを実際に修正するよりも、より多くの空きメモリを強制的に確保するための苦痛を伴う方法です...
ちなみに、ここでも同様の質問がありました: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.2012年3月17日更新この質問を最初に投稿してから、搭載されている RAM を 4 GB から 8 GB に変更しましたが、問題は解決していません。以前は「非アクティブ」な RAM の量は 0.5 GB ~ 1.0 GB でしたが、現在はスワッピングの開始/発生/終了時に通常 1.0 GB ~ 2.0 GB 程度です。つまり、OSX カーネル ロジックによって RAM の約 12.5% ~ 25% が非アクティブとして保持されているようです。
すべてのメモリが使用されると (空きメモリが 0 になると)、OS は非アクティブなメモリをスワップファイルに書き出して、アクティブなメモリに空き領域を確保します。
2012年3月17日更新
これまでに役立つと提案されている方法を以下にまとめます。
のパージ指示
「パフォーマンス分析のために、コールド ディスク バッファ キャッシュを使用して初期ブート条件を近似するために使用されます。malloc、vm_allocate などによって割り当てられた匿名メモリには影響しません。」
これは、OSX がディスク キャッシュをスワップアウトするのを防ぐのに役立ちます (そもそも OSX が実際にそうするのはおかしいことです)。ただし、ディスク キャッシュが解放されるという欠点があり、ディスク キャッシュがスワップアウトされない場合は、単にコールド ディスク バッファ キャッシュになり、パフォーマンスに悪影響を与える可能性があります。
のFreeMemoryアプリおよび/またはディスクのアクセス権を修復して空きメモリを確保
役に立たない解放するメモリは使用せず、メモリ内容の数ギガバイトを RAM から HDD に移動するだけです。結局、メモリを解放している間に開いていたアプリケーションを使用しようとすると、VM の多くがスワップ上にあるため、大量のスワップインが発生します。
スワップ割り当ての高速化ダイナミックページラッパー
スワップの使用を高速化するために行うには良いことのように思えますが、非アクティブなメモリがまだある間、そもそも OSX スワッピングの問題は解決されません。
スワップを無効にするにはダイナミックページャーそして再起動
これにより、すべてのメモリが使用されているときにシステムがハングするリスクを負って、OSX がスワップを使用しないようになります。実行可能な代替手段ではありません...
スワップを無効にするハッキングされたダイナミックページャー
上記の dynamicpager を無効にするのと同様に、ブログ投稿のコメントからの抜粋では、これが実行可能な解決策ではないことが示されています。「非アクティブ メモリは通常どおり高いです。」「システムのメモリが不足すると、OS 全体がハングします...」「Mac のメモリをすべて消費すると、マシンがハングする可能性があります。」
まとめると、私はまだ「非アクティブ」メモリがあるときにMac OS Xがスワップを使用しないようにする方法を知りません。それが不可能なら、少なくともOSXがメモリをスワップアウトすることを好む理由についてどこかに説明があるかもしれません。いつでも記憶から解放される可能性がある?
答え1
定義上、非アクティブなメモリはページアウトする準備ができているメモリであり、ページアウトするとスワップに書き込まれる可能性があります。これは何の問題でもないまたは最適化すべき問題。実際にはOS Xは設計どおりに動作しています。
残念ながら、テクニカルサポートのライターはカーネル開発者ではないので、Apple Knowledge Base のサポート記事の引用は、非アクティブメモリはプログラムによって使用されていないメモリであると主張している点で誤りです。プログラムを終了すると、その常駐メモリはすべて空きになります。非アクティブのままになることはありません。ただし、開発者サイトメモリ管理の仕組みを説明した本は、最後まで読めば良いリソースになります。
OS X における「非アクティブ メモリ」の意味については、多くの誤解があります。誤解とは反対に、すべての非アクティブ メモリが空、未使用、キャッシュ、または消去可能というわけではありません。実際、アクティブ メモリも、最近アクセスされた場合はキャッシュまたは消去可能です。多くの非アクティブ メモリには、簡単に破棄できないデータも含まれています。破棄された場合、プログラムはクラッシュします。破棄されたページには有効なデータが含まれているため (OS X 開発者側からの引用にあるように)、プログラムは (仮想) メモリに保存したデータが消えないことを期待しているからです。
非アクティブ メモリには、アクティブ メモリと同じ種類のデータが含まれています。唯一の違いは、OS X が、メモリの一部がしばらく読み書きされていないことを認識していることです。
OS X が一部のメモリを非アクティブとして分類し、他の領域を「アクティブ」として分類する理由は、ページ アウトに関係しています。メモリが少なくなると、一部のデータをページ アウトする必要があります。問題は、どのデータをページ アウトするかです。プログラムがすぐに再び必要になるデータをページ アウトすると、時間の無駄になるだけで、何も達成されません。したがって、プログラムがすぐに再び使用する必要がないメモリをページ アウトする必要があります。
将来的にどのページが不要になるかを予測するのは困難です。なぜなら、プログラムは仮想メモリを好きなように使用でき、その計画について OS に何も伝えないからです。しかし、経験則として、ほとんどのプログラムはメモリの使用において「固定的」です。つまり、しばらくメモリの一部を使用していない場合は、そのメモリを使用し続けず、最近使用したメモリを使用し続ける可能性が高くなります。
そのため、OSがデータをページアウトすると決めた場合、最近使用されていないページをスワップするという戦略を採用します。これが、OS Xがプログラムによって占有されているメモリを「アクティブ」と「非アクティブ」の2つの山に分類する理由です。上記リンク開発者サイトを完全に読むと、そのプロセスがどのように行われるかがわかります。
- メモリが少なくなり始めると、OS はアクティブなメモリ ページを調べ始め、それぞれにフラグを設定します。
- プログラムがページを読み取ったり書き込んだりすると、フラグはクリアされます。
- しばらく経ってもフラグがクリアされない場合、そのページは「非アクティブ」パイルに分類されます。
- 「非アクティブ」ページがそのプログラムによってアクセスされた場合、そのページは「アクティブ」パイルに戻されます。
- メモリが不足すると、「非アクティブ」なページがページアウトされます。
どのメモリをスワップアウトするかを決めるこのソートプロセスは、すべての最近のオペレーティングシステムで同様です。Linuxには、アクティブページと非アクティブページの2つのリストがあります。Linux 仮想メモリ マネージャーを理解するWindowsでは、2つ以上の最新クラスで少し異なるものを使用する可能性があります。現時点では、最新の信頼できる技術的説明を見つけることができません。より多くの実装については、Wikipediaの次のページで説明されています。「ページ置換アルゴリズム」OS X との唯一の違いは、統計情報の表示方法でした。top
アクティビティ モニターでアクティブと非アクティブの数字を別々に表示するのがよいアイデアだと誰かが判断したようです。振り返ってみると、これはあまりよいアイデアではなかったかもしれません (これは OS X 10.9 で変更されました)。
フラグの設定とクリア、およびアクティブ/非アクティブ ヒープの維持というこのプロセスには、プロセッサのパワーが多少必要になります。そのため、空きメモリがたくさんあるときは、OS X はこのプロセスを実行しません。そのため、最初に起動するプログラムは、空きメモリが少なくなり始めるまで、すべて「アクティブ」なメモリとして表示されます。
したがって、白紙の状態から始めて、どんどんプログラムを開いていくと、アクティビティ モニターで次のような進行状況が見られることが予想されます。
- まず、「空き」メモリは多く、非アクティブなメモリはほとんどありません。これは、メモリ フラグがまだ実行されていないためです。
- 空きメモリの量が減ると、OS X はメモリ フラグの実行を開始し、「非アクティブ」の量が増え始めます。「非アクティブ」の各ビットは、以前は「アクティブ」でした。
- 空きメモリが不足すると、「非アクティブ」なページがページ アウトされます。メモリ フラグ機能も、メモリをアクティブと非アクティブに分類するためにフル稼働します。通常、スワップへの書き込み中は「非アクティブ」なページが多く表示されますが、これはメモリ フラグ機能が期待どおりに動作していることを示します。
ページしなければならないスワップアウトされる前に非アクティブとして分類される必要があります。これが、Apple Developer サイトの引用文にある「これらのページには有効なデータが含まれていますが、いつでもメモリから解放される可能性があります」の意味です。これは、非アクティブに降格されるまで解放されないアクティブ ページとは対照的です。ページを解放する方法はいくつかあります。ページがファイルからマップされ、変更されていない場合は、すぐに削除して、必要に応じて再度読み込むことができます。同様に、以前にスワップアウトされ、スワップインされてから変更されていないメモリの場合も同様です。プログラムは、キャッシュとパージ可能なメモリを明示的に割り当てて、忘れて必要に応じて再作成できるデータを保存することもできます (ただし、プログラムがキャッシュを割り当てるのは、そのデータを再作成するのにかなりの時間がかかる場合です)。ただし、非アクティブ メモリの多くは、プログラムが有効なデータを書き込んだメモリであり、このデータをページアウトするにはスワップへの書き込みが必要です。
したがって、アクティビティ モニターで「非アクティブ」メモリの量を確認し、コンピューターがスワップに書き込んでいるときに同時に非アクティブなメモリが大量にあることを確認すると、システムが設計どおりに動作していることが分かります。
非アクティブメモリとファイルキャッシュも混同されています。アクティビティモニタでは既に別々の見出しでリストされているので、なぜそのような混乱が起きるのかはわかりません。キャッシュは、ファイルシステムから読み込まれた、またはファイルシステムから書き込まれた最近のデータを保存するために使用されるメモリで、再度アクセスする必要がある場合に使用します。メモリが少ない場合、OS Xは最初にキャッシュを削除する傾向があります。スワップスラッシングが発生し、アクティビティモニタに大量のキャッシュ(非アクティブではない)が表示されている場合は、それ問題になります。しかし、非アクティブなメモリは別の問題です。
疑問がある場合は、「非アクティブ」と「アクティブ」の区別を無視してください。これらを「プログラムが使用するメモリ」の 1 つの塊とみなし、2 つの数値を合計します。これは、他のすべてのオペレーティング システムでメモリ使用量を表示するときに行われることです。
OS X 10.9 に関する注意:Mavericks では、多かれ少なかれスワップの別のレイヤーである「メモリ圧縮」が導入されました。アクティブ ページは非アクティブとして分類され、圧縮され (使用しているツールによってはカーネル メモリとして表示されることがあります)、メモリ使用量が増加するとスワップに書き込まれます。また、Mavericks ではアクティビティ モニターでアクティブと非アクティブの個別の数値を表示することはなくなりました。これは、特にそれに関する誤解を考えると、確認する価値がないことが判明したためです。
答え2
現在、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 の有線メモリとアクティブメモリ
答え3
永続的な解決策ではありませんが、少なくとも一部の非アクティブなメモリを再利用して、恐ろしいスワッピングを回避できる可能性があります。http://itunes.apple.com/nz/app/freememory/id460931672?mt=12
このツールは無料で、使い方も簡単です。起動したら、システム ツールバー/メニューで [メモリの解放] オプションを選択します。
ActivityMonitor のメモリ表示とは異なり、空きメモリのみが表示されるため、スワッピングが行われているかどうかを示すより適切な指標となるようです。
答え4
これには正解はないと思います。Mac をスリープ状態にしたときにアクティブなままになっているメモリも同様で、スリープするたびにメモリはどんどん大きくなっていきます。
「楽しい」(つまり高価な)面では、メモリをアップグレードするか、HDD を SSD に交換することができます。これにより、交換によるパフォーマンスの低下は発生しません。Corsair メモリが手頃な価格で入手できるようになったため、私は最初のオプションを選択しました。