🐧 Linux 総合学習プラットフォーム
ストレージ/ファイルシステム ・ 中級

スワップの作成と調整

スワップは、メインメモリが足りなくなったときにディスクの一部を臨時のメモリとして使う仕組みです。ディスクはメモリよりずっと遅いので万能ではありませんが、無いとメモリ不足の瞬間にプロセスが強制終了されかねません。ここではスワップファイルの作り方と、swappinessという「どれだけ逃がしたがるか」の調整値、スワップを持たない選択肢まで見ていきます。

アプリをたくさん開いていたら、動作が急に重くなった経験はないだろうか。メモリが足りなくなると、Linuxはディスクの一部を臨時のメモリとして使い始める。これがスワップだ。

スワップは、メインメモリ(RAM)に入りきらなくなったデータの一部を、一時的にディスクへ追い出しておく仕組みだ。ディスクはメモリに比べて桁違いに遅いので万能の解決策ではないが、無いよりはずっとましだ。

💡
ポイントスワップが無いと、メモリが尽きた瞬間にOOM Killer(メモリ不足時に強制終了させる仕組み)が動き出し、実行中のプロセスが問答無用で強制終了されることがある。スワップは、その最終手段が発動するまでの猶予時間を作ってくれる。
🔗
たとえメモリは机の上の作業スペース、ディスクは足元の引き出しだ。机の上が書類でいっぱいになったら、今すぐ使わない書類を引き出しへ一時的にしまう。引き出しから出し入れするのは机の上より手間だが、床に書類が散らばって仕事が止まるよりはましだ。

👀 まず今の状態を確認する

スワップを設定する前に、いま何がどれだけ使われているかを見ておこう。よく使うのが swapon --show と free -h の2つだ。

swapon --show は、現在有効になっているスワップ領域の一覧を表示する。free -h は、メモリとスワップの使用量をまとめて、人が読みやすい単位(GB・MBなど)で見せてくれる。

$ free -h total used free shared buff/cache available Mem: 3.8Gi 2.1Gi 412Mi 88Mi 1.3Gi 1.4Gi Swap: 2.0Gi 128Mi 1.9Gi
$ swapon --show NAME TYPE SIZE USED PRIO /swapfile file 2G 128M -2

この出力から、Swapの行に total が0であれば、そのマシンにはまだスワップが設定されていないと分かる。

🏗️ スワップファイルを作る手順

スワップ専用のパーティションを切る方法もあるが、後から容量を調整しやすいスワップファイルを使う方法が今は主流だ。手順は4段階で覚えるとよい。

①領域確保fallocate②スワップ化mkswap③有効化swapon④永続化fstabへ追記

1段階目は fallocate で、指定したサイズ分のファイルをディスク上に確保する。2段階目は mkswap で、そのファイルを「スワップ領域として使える形式」に初期化する。ファイルシステムを作るmkfsのスワップ版と考えると分かりやすい。

$ sudo fallocate -l 2G /swapfile $ sudo chmod 600 /swapfile $ sudo mkswap /swapfile Setting up swapspace version 1, size = 2 GiB $ sudo swapon /swapfile
つまずきfallocateの直後、mkswapの前に chmod 600 で所有者以外の読み書きを禁止しておく。スワップにはメモリの中身がそのまま書き出されるため、他のユーザーに読めてしまうとパスワードなどが漏れる恐れがある。

3段階目の swapon で、初期化したファイルを実際にスワップとして有効にする。ここまでで今すぐは使えるようになるが、再起動すると設定は失われてしまう。

4段階目として、既に学んだ /etc/fstab に1行追記しておくと、再起動後も自動でスワップが有効になる。書式は /swapfile none swap sw 0 0 のような形になる。ここまでの4段階は必ずセットで行う。3段階目のswaponだけで満足してfstabへの追記を忘れると、次に再起動したときに「スワップが消えた」と慌てることになるので、作った直後にその場で追記まで終わらせておくのが安全だ。

🎚️ swappiness——どれだけ逃がしたがるか

スワップ領域を用意しただけでは終わらない。次に押さえておきたいのが、Linuxカーネルが持つswappinessという0から100までの調整値だ。これは「メモリに余裕があるうちからどれだけ積極的にスワップへ逃がすか」という度合いを表す。

値が大きいほど、メモリがまだ残っていても早めにデータをスワップへ逃がすようになる。値が小さいほど、本当にメモリが厳しくなるまでスワップを使わずに粘る。この値は用途によって最適な位置が変わるという性質がある。

$ cat /proc/sys/vm/swappiness 60 $ sudo sysctl vm.swappiness=10 vm.swappiness = 10
🔗
たとえswappinessは「引き出しにしまいたがる度合い」のようなものだ。値が高い人は机が半分空いていても早々に引き出しへしまい始める。値が低い人は机が本当に一杯になるまで粘る。どちらが正しいというより、作業スタイルに合わせて調整するものだ。
vm.swappiness 0 ─────────────────── 100小さい値(例: 10)メモリが一杯になるまで粘る体感速度を優先大きい値(例: 90)早めにスワップへ逃がすメモリの空きを優先

デスクトップ用途では、キー入力の反応など体感速度を重視して値を低めにする調整がよく行われる。一方でメモリに常時余裕がないサーバーでは、デフォルトのままか、負荷傾向に応じた値が使われることが多い。

つまずきswappinessの最適値は用途によって変わる。むやみに0へ振り切るとメモリ不足時の猶予が減ることもあるため、変更後は実際の動作を見ながら調整するのが安全だ。恒久的に変えたい場合は /etc/sysctl.conf に vm.swappiness=10 のように書いておくと、再起動後も設定が保たれる。

🤔 スワップ無し運用という選択

近年、メモリを大量に積んだサーバーや、SSDの寿命を気にするクラウド環境などでは、あえてスワップを持たない運用も選ばれるようになってきた。

スワップが無ければ、メモリが尽きたときにすぐOOM Killerが動いて特定のプロセスが終了させられる。挙動が予測しやすく「遅くなってから気づく」より「早く気づいて対処する」方を選ぶ考え方だ。とはいえこれは潤沢なメモリと迅速な障害対応の体制があってこそ成り立つ選択であり、一般的な個人用途では基本的にスワップを用意しておく方が無難だ。

💡
ポイントスワップは「無いと困る保険」であると同時に「使われすぎると体感速度を落とす両刃の剣」でもある。潤沢なメモリと迅速な障害対応が前提にある環境では、あえて外す判断もありうる。

自分の環境がデスクトップなのかサーバーなのか、メモリに余裕があるのかで、スワップとの付き合い方は変わってくる。まずは free -h で現状を眺めるところから始めてみるとよい。

この項目に出てくる用語

swappinessすわっぴねす
メモリに余裕があるうちからどれだけ積極的にスワップへ逃がすかを表す0〜100の調整値。
スワップファイルすわっぷふぁいる
専用パーティションではなく、通常のファイルシステム上に作るスワップ領域。

関連コマンド

swapon

▶ 学習アプリでこの続きを学ぶ・演習する