Macのメモリ環境を再考して、サクサクな環境を得る Tweet
2009年10月に書いたエントリ「MacBook Pro 13-inch Mid 2009のメモリ増設」では、2GB×2枚で4GBのメモリにしたMacBook Pro 13-inch (Mid 2009)ですが、最近はVMware FusionでWindowsを使うことも多く、ものぐさな性格も手伝って、Google Chromeでは大量のタブを開きっぱなしなんてこともあり、4GBでは不足することもしばしばでした。
当時は高価でとても手が出なかった4GBのメモリモジュールも、現在では7,000円を切る勢いです。実は筆者が購入したのは、昨年の9月末、そのときの価格は一枚約9,000円でしたから、さらに価格は下落しています。
そんなわけで、いまMacBook Proのメモリを増設するなら、4GB×2枚で8GBというのも十分射程圏内に入ってきたといえます。しかし、8GBにしたからといって、起動してから長時間使っていると、必ずしも快適な状況が続くとは限りません。今回はMacのメモリ環境を改善してパフォーマンスを向上するヒントを紹介したいと思います。
メモリについて考えるまえに、仮想メモリについて知る
まず、メモリがどれくらい使われているかを把握するには、Mac OS Xが採用している「仮想メモリ」について知る必要があります。
Mac OS Xは、ベースとしているBSDなどのUNIXやLinux、最近のWindows(NTや2000、XP、Vista、7など)と同様、アプリケーションが直接物理的なメモリにアクセスできるわけではなく、OSとCPUが連携してメモリアクセスに介入し、アプリ毎に独立したメモリ空間を持っているように見せています。これによって、他のアプリが使用しているメモリへのアクセスはできなくなり、システム全体が安定性の確保や、セキュリティ確保にも寄与しています。
こうした仕組みを「仮想メモリ(Virtual Memory=VM)」と呼んでいますが、仮想メモリには、物理的なメモリが不足した場合でも、すぐにメモリ上で必要とされないであろうデータを、ハードディスク上の「スワップファイル」に一時的に退避させることで、実際の搭載メモリ以上の『仮想的』なメモリ容量をシステム全体で使えるようにするという、もうひとつの重要な役割もあります。
しかし、ハードディスクはメモリとは違って、非常に読み書きに時間がかかるデバイスですから、実際に搭載されたメモリ容量以上にメモリが消費されている場合、スワップファイルへの書き込み(ページアウト)やスワップファイルからの読み出し(ページイン)が発生し、全体の動作が遅くなります。
この処理はMac OS Xが自動的に行っているため、ユーザーが意識する必要はありませんが、逆に「最近、Macが重いなぁ」という場合には、実際のメモリの使用状況を確認して、もし実メモリが不足しているなら、メモリの増設を検討するのがよいということになります。もちろん、不要なアプリを大量に起動しているなら、それをこまめに終了するのも手ですが、それを気にするくらいなら、メモリを積めるだけ積むというのも、仕事の効率化に多いに寄与するでしょう。
メモリをどれだけ使っているのかを知る。
Mac OS Xでのメモリの使用量を確認するには、標準で装備されている「アクティビティモニタ」というアプリを使うのが簡単です。「アクティビティモニタ」は「アプリケーション」フォルダの中の「ユーティリティ」フォルダに通常は入っています。
OSのメモリ管理の仕組みを知っている前提のツールではあるので、表示内容はわかりやすいとはいえないのですが、詳細はApple自身による文書「Mac OS X:アクティビティモニタでシステムメモリの使用率を確認する」を読むのがいいでしょう。また、ALEXさんという方による「Is my Mac using too much memory???(英語)」というエントリがくわしく考察していて参考になります。
アクティビティモニタのウィンドウをみると、上部はアプリケーションなどのプロセスごとのメモリの使用量やCPUの消費状況が確認できます。メモリの全体の状況をみるには、ウィンドウ下部の「システムメモリ」をクリックすると、その下にメモリの使用状況の概要が表示されます。
空き | Free | 未使用領域。これは名前のとおり、純粋に空いているメモリを指します。 |
---|---|---|
固定中 | Wired | 通常OS自身が使用していて、スワップファイルに移動できないもの。VMware Fusionなどの仮想化ソフトを使う場合も、このタイプのメモリ領域が確保されます。 |
現在使用中 | Active | アプリケーションソフトなどが使用していて、スワップファイルに移動できるもの |
現在非使用中 | Inactive | アプリケーションを終了するなどして、使用しなくなったが、将来同じアプリが再利用できるように一時的に保持されているもの。一定の時間がたてば、「空き(Free)」になるが......。 |
確保中 | Used | 「固定中」、「現在使用中」、「現在非使用中」の合計 |
普段使っている状況で確認して、「空き」がある程度ある状態なら、メモリの増設の必要はないといえます。もし、空きが少なく、「スワップ使用領域」が相当の容量で、スワップファイルとのやりとりされたデータ量を示す「スワップイン」「スワップアウト」が非常に大きい場合には、メモリの増設を検討するか、アプリケーションの使い方を検討するとよいでしょう。
「現在非使用中(Inactive)」を開放したい!
ここでくせ者なのが「現在非使用中(Inactive)」です。本来、この領域は他のアプリが要求したら、すぐに使えてもよいはずです。しかし、「空き(Free)」がわずかしかなく、「現在非使用中(Inactive)」が仮に1GBほどある状況で何かプログラムを起動してみるとわかりますが、驚くべきことに、そうした状況ではスワップが使われ、システム全体が「もっさり」した状態になってしまいます。
現在非使用中のメモリを即開放したいというなら、purgeコマンドを使う方法があります。purgeコマンドは通常はインストールされていませんので、Macに付属もしくは購入したOSの「Mac OS X Install DVD」の中にある「オプションインストール」フォルダから「Xcode」をインストールすると「/usr/bin/」ディレクトリ(通常Finderからは見えません)にインストールされます。
purgeコマンドを実行するには、「アプリケーション」フォルダの中の「ユーティリティ」フォルダにある「ターミナル(Terminal.app)」を起動し「purge」と入力して、Enterキーを押します。しばらく時間がかかりますし、実行中はややMacの動作が重くなることがありますが、順次「現在非使用中」の領域が開放され「空き」になっていき、開放が完了すると終了します。
アクティビティモニタもそれなりにリソースを喰うアプリなので、常時立ち上げておくというわけにもいきません。個人的にお勧めなのは、「iStat Menus 3」というアプリです。これをインストールすると、メニューバー上にCPUやメモリ、ネットワークの使用状況や温度などを表示することができます。そのほか、細かくカスタマイズできる時計もあるのがうれしいところです。価格は16USDですが、その価値は十分にあると思います。
これのメモリゲージをみて、空き(Free)が少なくなってきたり、メモリを多く消費するアプリを終了したあとにpurgeをするというのもありでしょう。
そもそも8GBあったらスワップいらないんじゃない?
しかし、いちいちメモリの消費量を把握して、purgeするというのは面倒です。今回筆者は、MacBoop Proのメモリを8GBに増設したのですが、ここまでの容量があると、筆者の利用目的では、つねに「空き(Free)」と「現在非使用中(Inactive)」の合計は2GB程度あります。
上記のスクリーンショットは、VMware FusionでWindows 7とWindows XPを同時に起動して、あれこれ筆者が普段使っているアプリが起動した、普段の平均的な使用状況です(さすがにWindows 7とWindows XPを同時に起動していることは少ないのですが)。空きは確かに110MBしかありませんが、現在非使用中の領域は2GBもあります。しかし、この状態で何かアプリを起動すると、スワップがどんどん使われていくという悲しい結果になります。もちろん、先に紹介した「purge」を使い、現在非使用中を開放してからアプリを起動すれば大丈夫ですが、それはそれで面倒です。
もし、スワップファイルを使わない設定が可能なら、現在非使用中のメモリをやりくりして、物理メモリだけでシステムが稼働し続けられるはずです。実際、LinuxやFreeBSDなどではそうした運用が可能なのですが、残念ながらMac OS Xではそうした設定は提供されていません。
そこでググってみたところ、すでに同じようなことを考える先人がいらっしゃい、なんとMac OS Xのスワップを抑制してしまうよう、システムそのものをハックしてしまっていました。
Mac OS XはApple自身が開発する「Darwin」というオープンソースのソフトウェアが基礎となっていて、スワップを制御している「dynamic_pager」というプログラムのソースコードも公開されています。この「ハック」は、スワップファイルの作成を抑制するように、dynamic_pagerを変更して、Mac OS Xに付いている標準のdynamic_pagerと置き換えてしまうという荒技です。
- Killing Mac OS X Swapping : How To Disable dynamic_pager
- もともとこのハックを考え、パッチを書いたphilouさんのBlogエントリ
- Mac OS X Leopard - dynamic_pager を骨抜きに
- 上記のphilouさんの変更したdynamic_pager.cをLeopardでコンパイル(IntelとPowerPCのユニバーサルバイナリができる)するためのMakefileを紹介した小飼弾さんのエントリ
- dynamic_pager hack on Snow Leopard
- 弾さんのMakefileをSnow Leopardでコンパイル(Intelバイナリのみ)できるように変更した、id:syuu1228さんのエントリ
筆者の環境はSnow Leopardなので、id:syuu1228さんとほぼ同じMakefile(自分で弾さんのやつを直したけど、結果的にid:syuu1228さんのと等価なものになった)を使って、コンパイルとインストールをしました。
結果、効果は絶大なのですが、いかんせん危険につき、誰にでもお勧めできるものではないので、くわしいやりかたはとかはここでは書きません。上記のエントリの内容ができる方は、ご自身の責任で挑戦してみるとよいでしょう。
残念ながら「Makefileって何?」っていう方にはオススメできません。周りにいる詳しい方に、相談してみるといいでしょう。また、搭載メモリ量が少ないと、スワップを止めるとシステムの動作そのものに問題がでてきますので、その辺の判断ができる方のみにオススメします。
なお、Mac OS Xのスワップの制御についてはyamapさんによる「MacOSX Snow Leopardのswapを止めたりいじったりするメモ」に記載された方法も使えるようです(2011年2月4日 22:20追記)。
ってなわけで、今回増設した8GBメモリは
さて、筆者の最近のMacの使い方だと、以前増設した合計4GBのメモリ環境だとスワップファイルがないと動作できない状況でしたが、今回8GBに増設したことで、スワップファイルなしでも十分使えるようになりました。
適用したメモリの調べ方や、メモリの増設の方法、その後のテストの方法などについては、以前のエントリ「MacBook Pro 13-inch Mid 2009のメモリ増設」と変わりませんが、今回購入したのは、TranscendのDDR3 1066MHz(PC3-8500)の4GBのSO-DIMMモジュール「TS512MSK64V1N」を2枚です。基本的には2009年中旬(Mid 2009)以降に発売されたMacBook Proであれば、DDR3 1066MHzの4GBメモリモジュールを2枚で8GBまでのメモリを搭載することができます(基本的には同容量のメモリを2枚載せます)。※2011年2月24日から発売開始された新しいMacBook Pro (Early 2011)では、DDR3 1333MHzのメモリモジュールに変更されています(2011年3月9日追記)。
上記エントリでも紹介しましたが、最近のMacBook Proの対応メモリについては、Appleによる文書「MacBook Pro:メモリの取り外し方法と取り付け方法」を参照して、お持ちのMacにあったメモリを買うようにしてください(2011年3月9日現在、新しいMacBook Pro Early 2011についての記載はありませんが、英語版のページ「MacBook Pro: How to remove or install memory」に記載のとおり、DDR3 1333MHzのメモリモジュールに変更になっています)。
8GBのメモリでスワップなしだと快適
スワップなしにするのは、誰にでもオススメできるものではありませんが、8GBのメモリを積んだ状態では、きわめて快適です。大抵の使い方ではおそらくメモリが不足することはないでしょう。スワップなしにしないにしても、「現在非使用中」のメモリとの付き合い方が工夫すれば、かなり快適な環境が得られると思います。もちろん、必要なメモリ容量はひとそれぞれですから、実際の使用容量と予算と相談しながら決めるとよいでしょう。