目次

スワップの最適化

※注:本記事内容はv10.5 Leopard以降には適用できません。詳細

私は、Macは常に起動状態で使っている。出かける時や寝るときも基本はスリープモードなので、本当に電源が落ちている日は、年間通しても片手で数えられるくらいだと思う。「Macはそれだけ安定してるんだ!みんなも使おう!!」と言いたい訳じゃないよ、ホントに(笑

だが、ずっと付けっぱなしだと、システムが徐々に重くなって行く。たまの再起動後の軽さと言ったら、感動ものだ。それくらい重くなる。

この現象は、スワップファイル(仮想メモリ)の断片化が原因らしい。OS Xのスワップはデフォルトの設定だと、/private/var/vm 下に、まず64MBのファイルが確保される。それが埋まると64MB→128MB→256MB…の容量のスワップファイルが次々と生成されていく仕組みのようだ(10.4系の場合)。で、こいつらが断片化していくことで、動作速度に支障をきたすらしい。

この設定を変更するには、/etc/rc の205行目あたりにある、/sbin/dynamic_pager を変更する。ググってみると、/System/Library/StartupItems/VirtualMemory/VirtualMemory を書き換えるという説明が多いが、うちの環境(10.4.4)ではVirtualMemoryディレクトリが存在しなかった(一応、自前でVirtualMemoryディレクトリ以下を作ってみた物の、反映はされなかった)。

変更前:/sbin/dynamic_pager ${encryptswap} -F ${swapdir}/swapfile
変更後:/sbin/dynamic_pager -H 268435456 -L 1073741824 -S 536870912 ${encryptswap} -F ${swapdir}/swapfile

オプションはそれぞれ、
-H : スワップを生成する条件となる、空きメモリ容量
-L : スワップを削除する条件となる、空きメモリ容量
-S : スワップのサイズ
ということらしい。上の例だと「空きメモリが256MB以下になったら、512MBのスワップを作り、空きメモリが1GB以上になったらスワップを削除する」という動作になる。ここで言う空きメモリとは、物理メモリと仮想メモリ(スワップ)の合計の空きという点に注意されたい。

変更後、再起動して確認してみたところ、きちんと512MBのスワップファイルが出来ていた。再起動してまだ間もないため、効果の程はわからないが……。

2006-02-17 追記

前よりも重くならなくなったような気がしないこともない……。でも、既に512MBのスワップファイルが2つも出来てるんですけど(ー ー;)。Mac OS Xは、ホント大喰らいだなぁ。物理メモリ512MBじゃ、正直足りない………。

2006-03-14 追記

最適化前よりはスリープを繰り返しても重くならなくなった(気がする)。まぁ、Thunderbirdの常時起動を止めたり、必要外のソフトはすぐに終了するようにしたため、その影響も幾分かあるのだろうけど。

2006-12-02 追記

-H -S -L で指定する値には「(-Lのサイズ) > (-H のサイズ) + (-S のサイズ)」という関係があるので、独自の値を設定する際には注意の程を。

2007-01-29 追記

某掲示板から参照されていたので、メモリが256M/512M/1GBの場合の設定例を考えて見た。参考にどうぞ。

■256MBの場合: -H 268435456 -L 1358954496 -S 1073741824
物理メモリが256MBではスワップに依存した動作が不可避なので、始めからガツンとスワップを確保して、常時スワップ有りで運用する。この設定ではスワップを1GBとしているが、HDDの使用効率を考えると512MB程度にしてもいいと思う。まぁ、256MBな人は早急に物理メモリ512MB、可能なら1GBに増設した方がいいと思う。操作感や作業効率を考えたら、512MBにする費用なんて微々たるものだと思う。

■512MBの場合: -H 268435456 -L 1073741824 -S 536870912
この場合も256MB程ではないにせよ、スワップ頼みの運用になるので512MB単位でスワップを確保し、常時スワップ有りとする。

■1GBの場合: -H 67108864 -L 352321536 -S 268435456
場合によってはスワップ無しでの運用も見込める為、スワップ生成・削除条件を緩めに設定。

デフォルトのスワップの動作が64MB→128MB→256MB→…なのは、メモリが潤沢に使えるという前提で、HDDの使用効率を考えての事だと思う。通常用途には充分なメモリを積んでるけど、たまたまメモリが足りなくなったから、ちょっとだけスワップを使って一時しのぎをしよう、みたいな。

あるいは、メモリをBTOで沢山載せさせる為の、Appleの策略とか………なわきゃないかw

あ、ちなみに、大規模なシステムアップデート(多分カーネルがらみの)が入ると、/etc/rcが設定前のものに戻る(アップデータに含まれる/etc/rcで上書きされてしまう?)ので、注意されたし。