スワップファイルをなくそう

  • 投稿日:
  • by
  • カテゴリ:

('07 2/26大幅改訂)
('07 3/14続編 スワップファイルをなくそう2追加)

MacOSXスワップファイル増殖防止協会会員の私です。

OSXは結構メモリの管理(特に解放)がずさんなため、 アプリを立ち上げまくり、ブラウザでタブも開きまくっていると、 スワップファイルが5つ、サイズ2GB、とかなってしまう (これ自体はブラウザのメモリリークが原因っぽいが、それがうまく解放されないということか?)。 こうなると、ブラウザのタブ切り替えるのにも虹色カーソルグルグル、 アプリ切り替えるのもカーソルグルグル、と何をするにも動作がもっさりしてくる。 この状態はかなり腹立たしく、ストレスフルである。 ちなみに私の環境では、スワップファイル4つ目ぐらいから激しく遅くなる。 どうやら2つまでは無害らしいので、3つ目以上ができないようにがんばってみる。

この現象は、実際に積んでいる物理メモリが足りなくなり、 仮想メモリにページアウトされまくることが原因だ。 そこでページングされるのを避けようと、 こまめにアプリを終了し、メモリを解放してやろうとしてみても、 メモリの空き容量は今一つ戻りきらない。 というかあんまり戻らない。

これは、OSXのメモリ管理のクセで、あるアプリが終了しても、 再びそのアプリが開かれたときに備えて、メモリを解放せずに取っておいているのだ。 要は、捨てられない症候群。 この状態は、ログインし直しだけだと解決せず、 再起動しないと元に戻らない。 しかしメモリがいっぱいになるたびに再起動なんてやってられない。 なので、再起動せずに解決する方法を探りましょう。



正しいのかわかりませんが、とりあえずできたのでやり方を書きます。

オススメ解消法

  1. Finderの再起動
  2. Dockの再起動
  3. Weekly Maintainance Script実行

この順番にやると(1,2は順不同)、メモリがガバッと解放される (少なくとも私の環境では)。 Menu Meterでメモリの使用状況を表示しておき、 危なくなってきたら上記のことをすると幸せになれるでしょう。

やり方は以下参照。


Finderの再起動

やり方1:MainMenuを使う

Main Menu をダウンロードして、立ち上げるとツールバーにこんなアイコンが表示される。

追記:
MainMenuが1.7.2になって、OS10.4.9にも対応した。 それと大きな変更点として、メニューが日本語化した。 それ自体はとても喜ばしいのだが、下の画像を見てもらえばわかるように、 フォントがステキであるところを私は高く評価したい。
追記ここまで

MainMenu.png
↑こんなの。これをクリックするとプルダウンメニューが出てくるので・・・

Finder再起動1
↑ここを選ぶだけ


やり方2:Dockから実行

Dockのファインダーのアイコンを、optionを押しながら右クリックすると 「再度開く」という選択肢が出てくるのでこれを選択。 これも効果あった。

Dockの再起動

これもMainMenuからできる。


↑ここ

他にもいくつか方法はある。
・アクティビティモニタでDockを選択して「プロセスを終了」
・ターミナルで「killall Dock」と打ち込みReturn
(参考:DashboardのWidgetをデスクトップ上に置く

Weekly Maintainance Scriptの実行

OS付属のメンテナンススクリプトを実行する。 この作業では、
・locate databaseの再構築
・whatis databaseの再構築
・log fileのローテーション
と3つのことをしているが、 メモリの解放に効いているのはlocate database の再構築のみだった。 従って、ここだけを実行しても、同じ効果が得られるはずだ。


やり方1:Main Menuを使う

MainMenuから「メインテナンススクリプト」「毎週」を選択(下図)。

↑ここを選択。

すると、MainMenu.pngこのアイコンの+マークが赤く点滅し、メモリがガサッと解放される。やったぜ!

このときプルダウンメニュー上の方の「ログウインドウを表示」を選択しておくと、 文字通りログウィンドウが表示され、以下のように何をやっているかが表示される。

毎週のメインテナンススクリプトを実行中です

Sun Feb 25 23:44:39 JST 2007

Rebuilding locate database...

Rebuilding whatis database...

Rotating log files: ftp.log lpr.log mail.log netinfo.log

Mon Feb 26 00:06:00 JST 2007

メインテナンススクリプトは完了しました

メモリが解放されるのは実行後数分だが、全部完了するまでには20分ぐらいかかっている。


やり方2:Onyxを使う

Onyxをおもむろに立ち上げ
「メンテナンス」「Scripts」
で「ウィークリースクリプト」のチェックを入れて「実行」。 実行にはしばらく時間がかかるが(5〜10分位?)、下のようなメッセージが表示される。

Rebuilding locate database:

Rebuilding whatis database:

Rotating log files: ftp.log lpr.log mail.log netinfo.log ipfw.log secure.log

結果は同じで、インアクティブなメモリが減るはず。 立ち上げているけど使っていないアプリを落としてからやると効果大。

この作業では、Onyxは
・locate databaseの再構築
・whatis databaseの再構築
・log filesのローテーション
と3つのことをしているが、メモリの解放に効いているのはlocate database の再構築のみだった。 従って、ここだけを実行することができれば、同じ効果が得られるはずだ。


まとめ
・上の方法でインアクティブなメモリを解放できそうなことがわかった
・しかしLocate Databaseを再構築してなぜメモリが解放されるのかは不明。 Maintenanceの一環なのだから、実行しすぎて悪いことは特にないんじゃないかと思いますが、一応自己責任で
・Menu Meterでメモリを見ておき、ページアウトが始まりそうになったら(メモリの「空き」が0に近づいたとき)、 使っていないアプリを落として対処するといい
・これで、あまり虹色カーソルぐるぐるにならずに暮らせるので満足度アップ

メモリの管理について知りたい人は、以下のサイトを参考されたい。

参考:
・MacfreakさんのSoftのページ
「Memory Monitor (version 1.2.3)」の項を参照して欲しい。 メモリとスワップファイルの管理についてとても参考になる。


2/7追記)

mutaさんにこの件について言及してもらったのだが、 どうやらこちらの書き方が誤解を招くものであったようだ。 Update Locate Databaseの主目的は、 あくまでLocate DatabaseのUpdateであり、メモリの解放はオマケである。

面倒くさいので書かなかったが、UNIXにはlocateというコマンドがあって
> locate uhyouhyo
とターミナルで打つと、全ファイルシステムの中から、 "uhyouhyo"という文字列を含むファイル・ディレクトリ名を検索し、表示してくれる (参照:UNIXの部屋 検索:locate)。 これはfindコマンドのようにその場で検索をかけるわけではなく、 あらかじめ作られているdatabaseを検索するから、findよりもずっと高速であるという特徴がある。 ということで、「locate database」というのは、このlocateコマンドで使う、 全てのファイルシステムのファイルやディレクトリ名をデータベース化したものであり、 「Update Locate Database」はこのデータベースを更新するものだということだ。

追記ここまで)