メモリを解放してスワップ発生を抑える方法

OSX 10.6 Snow Leopardは、極めて安定した、信頼性の高い、快適なOSとなった。但し、ハードディスクから起動する環境において、その快適さを保つためたった一つ気を付けておくべきことがある。それは、スワップ使用領域の増加を極力抑えること。
スワップへのアクセスが頻繁に発生している時は、あのレインボーカーソルがぐるぐる回っている時である。どうしようもない操作レスポンスの低下に悩まされる。そんな状態に極力陥らないように、使っていないメモリを素早く解放する方法を模索してみた。

その1 フォルダ容量を計算する

フォルダ容量を計算する過程でメモリが解放されることがある。それを利用した方法は、3つある。どれも仕組みは同じなので、どれか一つの方法を実行するだけで十分。

Finderを利用する方法
  1. Finderで起動ディスクのルートを開いて、リスト表示にする。(command-2)
  2. 表示オプションを表示(command-J)して、「すべてのサイズを計算」をチェック入にしておく。
  3. 5~10秒待って、ウィンドウを閉じて終了。
  • 次回からは、1と3の手順だけでOK。2の手順は不要。
コマンドで実行する方法
du -sx / >& /dev/null & sleep 5 && kill $!
  • ディレクトリの容量を計算するコマンドdu。
    • 指定ディレクトリ直下のファイルやフォルダの容量のみ計算するオプション-s。
    • ボリュームを超えた容量計算はしないオプション-x。
  • バックグラウンドで実行し、結果はエラーも含めて破棄する。
  • 5秒経過したら、上記プロセス番号を終了する。
Libera Memoryを利用する方法
  • 上記のduコマンドを実行してくれるアプリケーション。
  • 空きメモリを監視して、自動実行するバージョンもある。
  • 参考ページ: 以上の情報はすべて ものかの さんのページより学習した。(感謝です!)

その2 ディスクのアクセス権を修復する

ディスクのアクセス権を修復する過程でメモリが解放されることがある。その方法は、2つある。仕組みは同じなので、どれか一つを実行するだけで十分。

  • どちらも自分の環境では、処理に3~4分かかる。
  • 処理中であっても操作レスポンスはほとんど悪くならず、バックグラウンドで実行していても気にならない。(ハードディスクにアクセスする音はするが)
ディスクユーティリティを利用する方法
  • ディスクユーティリティの「ディスクのアクセス権を修復」ボタンを押して実行する。
コマンドで実行する方法
diskutil repairPermissions /
  • ディスクユーティリティと同等のコマンド。(逆にディスクユーティリティが、diskutilコマンドのGUIバージョンと言える)

その3 ディスクキャッシュを解放する

ディスクキャッシュを解放する過程でメモリが解放されることもある。その方法は、1つだけ。

コマンドで実行する方法
purge
  • ディスクキャッシュを解放するコマンドpurge。
    • シンプルに引数なしでOK。
  • 但しpurgeは、Xcodeデベロッパツール)をインストール時に、CHUDツールパッケージを含めてインストールすると追加されるコマンド。
    • Snow LeopardのインストールDVD >> オプションインストール(フォルダ) >> Xcode.mpkgを起動して、XcodeをインストールすればOK。
  • purgeコマンド実行中の8~15秒ほどは、あらゆる操作を受け付けなくなる。(でも、自分の意思で実行しているし、短時間だからそれほど気にならない)

シナジー効果

以上、メモリを解放する効果が期待できる3つの処理(その1・その2・その3)を学習した。

  • 3つの処理は、それぞれ解放するメモリ領域が違っているようで、3つすべての処理を実行した時、解放されるメモリ領域が最大になるようだ。

スワップを使用しない設定

さらに、今まで出来ないと思っていたのだが、スワップを無効にする設定もあった!

# スワップを無効にする
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

# スワップを有効に戻す
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
  • スワップ処理を無効にすると、確保されるメモリのほとんどは「固定中」の扱いになる。
  • また、メモリを解放する処理を実行した時の効果は素晴らしく、「固定中」以外のほとんどのメモリは解放された。

一瞬、スワップを無効にする運用に目が眩んだが...

  • いい気になって、アプリケーションを開きまくっていると、もはや物理メモリが完全に不足した状態となる。すると、どうなるのか?

  • スワップ使用領域は0なのだが、ハードディスクは永遠カリカリを繰り返し、操作レスポンスが著しく悪くなる。
  • スワップが有効な状態で、頻繁なスワップが発生して、レインボーカーソルが回り続ける症状に似ているのだ。結局、限界を超えたら、どうにもならない...。

実験して気が済んだので、再びスワップが有効な状態に戻しておいた。

  • 実は「メモリが不足しています」なんていうメッセージが出るのを密かに期待していた。
  • その方が、メモリが不足していることを隠して著しく操作レスポンスを悪くするよりは、よっぽどマシな気もするのだが。

iFreeMem - Activata

  • 有料だけどメモリ解放のためのアプリケーション。15日間の試用期間がある。
  • メモリを購入する費用に充てるか、シェウェアで凌ぐか、悩みどころである。

なぜ非使用中のメモリがすぐに解放されないのか?

現在非使用中

現在は使われていないが、最近使われたメモリ内の情報です。

たとえば、Mail を使った後終了した場合、Mail が使っていた RAM は、「現在非使用中」としてマークされます。現在非使用中メモリは、空きメモリと同じように、ほかのアプリケーションで利用できます。ただし、現在非使用中メモリがほかのアプリケーションによって使われる前に Mail を開いた場合、RAM より遅いハードディスクから Mail をロードする代わりに、Mail の現在非使用中メモリが現在使用中メモリに変換されるため、Mail はすばやく開きます。

Mac OS X:アクティビティモニタでシステムメモリの使用率を確認する
  • すぐに解放しないことで、上記のようなメリットも生まれるのか...。
  • 但し、スワップを発生させてまで解放しない状況はデメリットの方が大きい気もする。

所感

OSXは常に仮想記憶が有効な状態で稼働している。搭載するRAMメモリを超える領域が必要になると、最近あまり使われていないRAMメモリの領域をハードディスクに書き出して、必要な領域を確保する。RAMメモリの内容は、ハードディスクにはswapfileとして保存される。(/var/vm/swapfile0, swapfile1, swapfile2...)そのswapfileの合計サイズが、スワップ領域となる。
スワップ領域に書き出された内容も、再びアプリケーションが要求すれば、RAMメモリに書き戻され、アクセスされる。でもその前に、メモリが不足している状態では別のRAMメモリの内容をハードディスクに書き出すかもしない。書き戻すためのRAMメモリの領域を確保するために。
スワップ領域が大きくなるほど、上記のようなRAMメモリとハードディスク間のデータ転送が発生する確率は上がる。ハードディスクの読み書きのスピードは、RAMメモリのアクセスに比べて著しく遅い(数百倍の差)ので、あまりにも頻繁に発生すると、その転送のためにアプリケーションの実行が中断されてしまう...。それがあのレインボーカーソルが回って、操作のレスポンスがめちゃくちゃ悪くなった状態なのだ。
レインボーカーソルさえ回らなければ、OSXは非常に快適なOSだと思う。そのためには、まずは十分なRAMメモリを搭載する必要がある。初代MacBookは最大2GBを搭載できた。でも自分の使い方では、フルに搭載してもすぐにスワップ使用領域が増えて、レインボーカーソルがよく回っていた。
だから2年我慢して、数世代進化したモデルのMacBookをまた購入した。メモリは最大の4Gを搭載した。最初は快適だったが、暫くするとまたレインボーカーソルが回り始める。
RAMメモリは倍になり、OSXもより効率的にメモリ管理するよう改良されているはずなのに。それ以上にアプリケーションはスピードや快適さのために広大なメモリを要求するのか、あるいは便利なツールを起動し過ぎて裏方のプロセスが増加しているのか。原因はいろいろあるかもしれないが、とにかくメモリは不足しているのだ。
現在のモデルだとMacBookは、最大8GBのメモリを搭載可能になっている。それだけあれば、当分はメモリ不足に悩む心配はなさそうな気がする。しかし、メモリを8GBに増設するためだけの買い替えはちょっと勿体無い。今使っているMacBookはFireWire400ポート搭載の貴重なモデルでもある。
そこで、限られたメモリを少しでも効率的に利用するワザを試してみることにしたのだ。

本来、メモリ管理はOSが担う重要な仕事である。そして、かつては今とは比べ物にならないくらいメモリは高価で貴重なものだった。だから、いかに効率的に割り当てて活用するか、という問題は最重要命題であり、これまでその道の達人が相当な試行錯誤を繰り返しているはずである。その結果が現在のメモリ管理の姿になっているのだ。
よって、素人(自分)がスワップ使用領域の発生を抑える何かをすることは、目先の利益は得られても、何処か別のところでデメリットを生んでしまう可能性もある。実際、OSにはメモリを手動で管理する方法はない。(と思っている)上記に書いた方法は、すべて別の目的で実行するコマンドや操作であり、その副作用としてメモリが解放される効果が見られた方法なのである。
ユーザーに許されたメモリを解放する唯一の手段は、使っていないアプリケーションを終了することだと思っている。その最も強力な方法は再起動。しかし、メモリ不足のためにそんなことするなら、スワップ発生させた方がマシ。今使っていないアプリケーションだって後で使いたくなるものばかり。あるいは裏方で便利な環境を維持するために頑張っているのだ。

欲張りなユーザー(自分)が4GBでどこまで快適に使えるのか、暫く試してみようと思う。