macを使っていて若干不満なのは仮想メモリの扱いです。Snow Leopardになって以前より改善されたとはいえ、メモリが余っていてもスワップを起こし、長時間立ち上げているとだんだん遅くなってきます。特に仮想マシンなどを使っていると顕著に性能低下を感じます。
あちこちに書かれていますが、MacOSXの仮想記憶のアルゴリズムはメモリの再利用について消極的で、inactiveなメモリをあまり回収してくれないようです。改善するためにいくつかTipsがあり、DockやFinderを再起動する、ディスクのパーミッションを修復する等がありますが、いずれもMacを使用中に行うと負荷がかかったりして不便です。
このMacOSXのswapを担っているのがdynamic_pagerというデーモンで、デフォルトでは徐々に大きなスワップファイルを/var/vm/swapfile*という名前で作っていくようになっています。 Leopardではこのdynamic_pagerにパッチを当ててスワップを起こさないように、なんていう手段がありましたが、Snow Leopardでは件のパッチは使えません。
で、まずはこれを強引に何とかしてみます。
スワップを止める
上が参考にしたネタ。 dynamic pagerを止めてしまうと言う強引な手段。ターミナルから
としてから再起動します。/private/var/vm/ にswapfileの残骸が残っているかもしれませんので立ち上がったら削除します。不都合があって戻すには"unload"を"load"とします。
ついでに/private/var/vmにsleepimageファイルが存在し、ハイバネーション(safe sleep)を行わない方は
sudo rm /private/var/vm/sleepimage
も併せてやっておくとディスクが節約できます。
swapを切った感想です。まださほど使い込んではいませんが、起動や動作がきびきびした印象です。メモリを使い切ってしまうと当然不安定になったりハングアップしたりという事態が予想されるため、いくつものソフトウェアを起動するのに若干不安ではあります。
追記: メモリ2GBのMacBook Airでも今のところ何とか使えており、サクサクなのですが、ヘビーなアプリを多く起動し長時間使っていると不安定になり、固まってしまう事態が発生ました。
swapfileのサイズを固定する(確認中...)
さて、このdynamic_pagerですが、デフォルトでは徐々に大きなスワップを使うようになっているのは前述しましたが、実際にswapfile*の増え方を見ていると、増えるときはあっという間です。小さいswapfileがちょこまか出来るのはうっとうしく非効率的です。どうせSwapするなら気持ちよくやってもらいたい。
ということで起動時オプションを書き換えて、最初からある程度の大きさのSwapを確保させてしまえば動作中のファイルの増減回数が減ると思います。
sudo cp com.apple.dynamic_pager.plist com.apple.dynamic_pager.plist.orig
sudo /Developer/Applications/Utilities/Property\ List\ Editor.app/Contents/MacOS/Property\ List\ Editor com.apple.dynamic_pager.plist
Property Listエディタが開くので"Program Arguments"の項目のItem2(最後の部分)の後ろに"Item 3|String|-S"、"Item 4|String|512000000"等と追加します。単位はバイト。これで保存し前述の方法でunload/swapファイル削除/loadします。例ではスワップファイルが512MB単位で作成されます。スワップファイルが一杯になると数は増えていくようです。
追記:スワップファイルは作成されますがdynamic_pagerが途中で止まる模様。調べてみまする。
swapfileの作成場所を変更して外部ディスクに
上の記事は com.apple.dynamic_pager.plistの"Program Arguments"を書き換えてフォルダを移動させるものです。wait4pathコマンドでディレクトリがマウントされるのを待つようになっているのが良さげです。
Property EditorでItem1-3を全て書き換えて"Item 1|String|/bin/bash", "Item 2|String|-c", "Item 3|String|/bin/wait4path /EXTERNEL/FOLDER && /sbin/dynamic_pager -F /EXTERNAL/FOLDER/swapfile"とします。-Sを指定したい場合はItem 3に追加。