いよいよ出ますよ、新しいMacが。こちらの記事にあるとおり、おそらくは新MacBook or 新MacBook Proかと。マシンを入手次第レビューさせていただく予定なので、乞う御期待。

さて、今回は「仮想メモリ」について。旧Mac OSの時代はいざ知らず、仮想メモリが常時オンのOS Xに設定のコツはないが、できるだけ「スワップ」を発生させないというノウハウは存在する。アクティビティモニタやvm_statコマンドを使い、その辺りの事情を説明してみよう。

なぜ「仮想メモリ」を意識するのか

結論からいうと、仮想メモリは使わないほうがいい。物理メモリが不足するとき、磁気ディスク (一般的にはHDD) に確保した領域をデータの一時保存に使うという機構ゆえに、搭載した物理メモリ容量をオーバーしない範囲で使用するに越したことはないからだ。

しかし、現実では仮想メモリに頼らざるをえない。グラフィックソフトや仮想化ソフトなど、巨大なメモリ空間を必要とするアプリケーションは多く、物理メモリ容量2GBでも心許ないほど。Safariなど利用頻度の高いアプリケーションの中にも、"メモリ喰い"は多く存在する。これらのアプリケーションが仮想メモリを使い始めると、一気にシステムのレスポンスが低下するため、仮想メモリの使用状況に目を配る必要があるのだ。

ちなみにOS Xの場合、仮想メモリファイル (スワップファイル) は/var/vmに作成される。ファイル名は「swapfile*」(*は数値) の連番形式で作成され、システムの起動直後は「swapfile0」のみ存在する。その後必要に応じて作成され、「1」までのファイルサイズは64MBだが、「2」は128MB、「3」は256MB、「4」は512MB、「5」は1GBとボリュームアップを続ける。そしてその数が増えるほど、システムパフォーマンスに悪影響を及ぼすことになる。

/var/vmの内容を表示したところ。いくつかswapfileが作成されている……

悩みのタネは「Inactive」

ここで、OS Xにおけるメモリ分類基準について触れておこう。システム標準装備のシステム監視ツール「アクティビティモニタ」の用語では、空き (Free)、固定中 (Wired)、現在使用中 (Active)、現在非使用中 (Inactive) の4種類が定義され、それぞれ使い分けられている。

Leopardに付属の「アクティビティモニタ」。仮想メモリの使用状況は「システムメモリ」タブで確認できる

この中で、まったく使用されていないFreeと、システムの稼働に不可欠なWiredの2つについては、小手先による対処療法は難しい。前者はメモリを増設するかアプリケーションを実行しないか、後者はOS X以外のシステムに入れ替えるか (もちろん本末転倒です) しかないだろう。アプリケーションが実際に使用しているActiveについても、アプリケーション次第ということになる。

残るInactiveがクセモノ。基本的には、BSDレイヤーに実装されたメモリ管理機構が必要なときにInactiveを解放する、すなわちInactive→Freeの処理を適宜実行するのだが、なんらかの理由でこれが行われないことがあるのだ。

その結果、メモリ領域を確保しようと、Inactive領域が潤沢にあるにもかかわらず/var/vm/swapfile*が作成される。一度その領域に書き込まれた (Swap Out) プロセスは再び物理メモリに戻ることはないため、/var/vmにはswapfile*が順次作成されることになるのだ。そしてswapfile*へのアクセスは物理メモリに比べ遅く、しかもswapfile*のサイズが大きいほどパフォーマンスは低下する。本来Inactive領域の解放はシステムに任せるべきだが、現実にはそう言ってもいられない。手動でのInactive領域の解放は、OS Xを快適に使ううえで1つの解法 (これが言いたかっただけちゃうんかと) となりうるのだ。

「Inactive」を解放せよ

このInactiveな領域が解放されない問題は、いくつかの方法で回避することができる。1つはシステムの再起動。そうすれば、仮想メモリの使用状況は初期化され、/var/vm/swapfile*もすべて消去される。これは確実だが、システム再起動はできれば避けたいところ。もう1つは、アクティビティモニタを横目で睨みつつ、Inactiveが解放されるまで適当なアプリケーションを起動 / 終了する方法だが、こちらは確実性が低い。

確実なのは「起動ディスクのアクセス権修復」だ。数分程度の時間はかかるが、処理が進む間にInactiveな領域が順次解放され、終了した暁にはInactive→Freeへの振り替えが一気に進む。当然、swapfile*の増加によるパフォーマンス低下も目に見えて改善される。ディスクユーティリティの起動が面倒な場合は、Terminalから以下のとおり実行してもいいだろう。なお、起動中のアプリケーションをできるだけ少なくした状態で実行したほうが効果的なので、念のため。

$ sudo diskutil repairPermissions /

アクセス権修復実行前 / 後の仮想メモリ使用状況。「空き」と「現在非使用中」の変化に注目