Macでスワップを完全に無効化する方法

macOSでメモリが逼迫した際のスワップ(ページング)を完全に無効化する方法を紹介。

macOSでは仮想メモリの一機能としてスワップや圧縮があるが、一般的に言う仮想メモリを無効化するのと同義と考えても差し支えないかと思う。

スワップ有効(デフォルト)
スワップ無効

なお、スワップを無効化するとmacOSはキャッシュとキャッシュの圧縮のみを行うようになり、圧縮できるメモリがなくなった場合はカーネルパニックが発生する場合があるため、メモリが潤沢にあってスワップは絶対に使用したくないといった場合に使うのが無難。

macOSスワップ無効化手順

1. 念のため現在の仮想メモリ圧縮モードを確認しておく

まずは下記コマンドをターミナルで実行し、現在の仮想メモリの圧縮モードを確認しておく。

sysctl -a vm.compressor_mode

「vm.compressor_mode(Virtual Memory Compressor Mode):」の数字の部分が現在の仮想メモリの圧縮モード(コンプレッサーモード)となる。

恐らく最近のmacOSならば圧縮モードは必ずデフォルトの4のはず。

なお、コンプレッサーモードの詳細はGitHubで公開されている。

上記のモード一覧を見てみるとスワップを無効にするには「モード2(0x2)」にすればいいことがわかる。

なお、モードを1にすれば圧縮機能も無効にできるが圧縮機能はスワップと違って無効にしてもさほどメリットがないと思われるので無効にするならスワップだけでいいと思う。

2. リカバリーモードで起動しターミナルでコマンドを実行する

続いてMacを再起動するか、システムを終了させてからCommand+Rキーを押し続けリカバリーモードで起動し、ターミナルを開き下記コマンドを実行。

nvram boot-args="vm_compressor=2"

コマンドを実行したら再起動しよう。

3. Macを通常起動したら再度仮想メモリ圧縮モードを確認してスワップが無効になっていれば完了

Macを通常起動すればスワップが完全に無効になっているはずだが、念のため先ほどのコマンドで再度圧縮モードを確認しよう。

sysctl -a vm.compressor_mode

上記画像のように「vm.compressor_mode:」が2になっていればスワップが無効になっている。

スワップ無効後の挙動

スワップ無効後はMacにどんなにメモリ負荷をかけようがスワップが行われなくなり、逼迫したメモリは圧縮されるのみとなる。

冒頭でも書いた通り圧縮できるメモリがなくなった場合はカーネルパニックが発生する場合があるため注意。

管理人は3時間ほど負荷をかけ続けてもカーネルパニックは発生しなかったが、スワップを行わないという想定外の使用はカーネルパニックの他にも問題が発生する可能性がある。

元に戻す場合

挙動を元に戻す場合は再度リカバリーモードで起動してターミナルを開き、下記コマンドを実行する。

nvram boot-args=""

上記コマンドではBoot Arguments(起動時引数/ブート引数)にブランクの値を指定することでデフォルトに戻しているが、下記のようなコマンドでも同様にデフォルトに戻せる。

nvram -d boot-args
nvram boot-args="vm_compressor=4"

コマンドを実行してトラブルが起きた場合

もしコマンドを実行してトラブルが起きた場合はリカバリーモードのターミナルで下記コマンドでNVRAMを全て消去する。

nvram -c

もしリカバリモードなどの起動も不可能なようなら下記キーボードのコンビネーションでNVRAMをリセットする。

Mac起動時にCommand+Option+P+Rキーを長押しすればNVRAMがリセットされる。

管理人は実験でNVRAMに無茶苦茶な値を書き込みmacOSを起動不能にしたことがあるが、その場合でもキーボードでのNVRAMリセットで正常に起動させることが可能だった。