[Linux]Swap領域をクリアする方法

開発に使ってるLinuxサーバで、Swap領域が大量に使用されて動作が重くなっていたのでSwap領域を解放するためにやったことのまとめ。

単純にサーバ再起動してもよいのだけど、それだと作業中のEmacsが落ちてしまうので開発効率がおちる。
サーバ再起動させずにSwapを空にする方法はないかと試行錯誤してみたら、うまくいきました。

メモリに空き容量がある場合

Swap usedの容量よりも実メモリの空き容量の方が大きい場合、単純にスワップをoffにしてonにすれば解決します。
swapoff -a && swapon -a
(swapoffコマンドが見つからない場合は /sbin/swapoff などをあたってみてください。)

メモリに空き容量がない場合

「スワップをoffにする」とは、ディスクに退避されてるデータをメモリに移動させることです。
なのでメモリの空き容量が足りない場合はswapoffが失敗します。
"swapoff failed: Cannot allocate memory"
このエラーが出た場合は次のようにして対処します。
まずメモリ使用量の多いデーモン類、使ってないプロセスを全て終了させる。
topコマンドをたたいてRES値順にソートして、RES値の大きいものから終了させていきましょう。
メモリのキャッシュ領域を解放させる
sync
echo "3" > /proc/sys/vm/drop_caches
# しばらく待ってから、
echo "0" > /proc/sys/vm/drop_caches
ちなみにsudoでリダイレクトする場合は下記のようにします。
sudo sh -c "echo 0 > /proc/sys/vm/drop_caches"
さてここまでやって、Swap usedの容量 <  実メモリの空き容量 となったら、
晴れて最初のswapoff -aが成功するはずです。
カテゴリ: