free -m でスワップを大量に使っているのはわかるが、そもそもなぜこんなに使われるのか」こうした疲問の答えが vm.swappiness というカーネルパラメータにあります。この値を適切に設定することで、RAM に余裕があるうちはスワップへの退避を最小限に抑えることができます。
この記事では、RHEL 8系~9系・Ubuntu 20.04 LTS以降を想定環境として、vm.swappiness の仕組みと値の選び方、
/proc/meminfo でメモリの実態を把握する方法、そして再起動後も設定を維持するための永続化手順を解説します。この記事のポイント
・vm.swappiness(0~100)でスワップの積極使用度を制御できる
・データベース・キャッシュサーバーには1か10が推奨される
・/proc/meminfoのMemAvailableが「使える空きメモリ」の正しい値
・sysctl -wで即時変更、/etc/sysctl.dに書けば永続化できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
スワップを使い続けると性能が落ちる理由
スワップはディスク上に確保した「仮のメモリ」です。Linux は物理 RAM が不足すると、しばらく使われていないページをスワップに追い出し、空きを作ります。この仕組み自体は正常な動作であり、スワップが存在すること自体は問題ではありません。問題は、スワップへの出し入れが頻繁に続く状態(スワッピング)です。物理 RAM へのアクセスがナノ秒オーダーであるのに対し、HDD ベースのスワップでは数ミリ秒、SSD ベースでも数十マイクロ秒かかります。スワップが繰り返し使われると、アプリケーションのレスポンスタイムが急激に悪化します。
vm.swappiness を適切な値に設定することで、RAM に余裕があるうちはカーネルがスワップへの退避を抑えるよう誤導できます。
vm.swappinessの仕組みと値の意味
vm.swappiness は 0 から 100 の整数値で、カーネルのページリクレームアルゴリズムに対して「どの程度積極的にページキャッシュよりもスワップを使うか」を示すヒントです。デフォルト値は 60 です。よくある誤解として、「vm.swappiness=0 はスワップを使わない設定」ではありません。0 は「スワップへの退避を最小限にする傾向」を示すだけで、メモリが本当に途迫した場合はカーネルが 0 でもスワップを使います。
各値の目安を示します。
・0:スワップへの退避を最小限に抑える。OOM が迫るまでスワップを使わない傾向
・1:事実上「スワップをほとんど使わない」設定。データベースサーバーでよく採用される
・10:わずかにスワップを許容する。アプリケーションサーバーで多く採用される
・60:Linux のデフォルト値。デスクトップ環境向けに調整された値
・100:積極的にスワップを使う。ページキャッシュよりスワップ退避を優先する
デフォルトの 60 は「デスクトップで GUI アプリを快適に動かす」ことを念頭に置いた設定です。サーバー用途では、RAM に余裕があるうちはスワップへの退避を抑えたいため、より低い値が適切な場面が多くあります。
/proc/meminfoでメモリの実態を読む
vm.swappiness を変更する前に、現在のメモリ状況を正確に把握することが重要です。/proc/meminfo にはカーネルが管理するメモリの詳細な統計情報が含まれています。# 主要フィールドだけを絞り込んで確認する grep -E 'MemTotal|MemFree|MemAvailable|Buffers|^Cached|SwapTotal|SwapFree' /proc/meminfo
MemTotal: 16252456 kB MemFree: 1024316 kB MemAvailable: 8453200 kB Buffers: 384220 kB Cached: 6112048 kB SwapTotal: 4194300 kB SwapFree: 3841024 kB
・MemTotal:物理 RAM の総量
・MemFree:カーネルが完全に未使用の RAM。この値だけを見て「空きメモリ」と判断するのは誤り
・MemAvailable:「新しいプロセスに割り当てられるメモリ」の推定値。ページキャッシュや解放可能なカーネルバッファも含む。本当の「使える空き」を示す値
・Buffers:ブロックデバイスのバッファキャッシュ(ファイルシステムメタデータなど)
・Cached:ファイルの内容を保持するページキャッシュ。メモリが必要になれば解放される
・SwapTotal / SwapFree:スワップ領域の総量と空き
free -m の「available」列は MemAvailable に対応します。free -m の「used」と「free」だけを見て「メモリが足りない」と判断するのは早計で、available 列を確認することが重要です。free -m
total used free shared buff/cache available Mem: 15871 7412 1000 89 7458 8250 Swap: 4095 346 3749
vm.swappinessの値を変更する手順
1. 現在の設定値を確認する
# どちらのコマンドでも確認できる sysctl vm.swappiness cat /proc/sys/vm/swappiness
2. 一時的に変更する(動作確認用)
変更の影響を確認してから永続化する手順が安全です。一時変更は再起動で元に戻ります。# vm.swappiness を 10 に変更する(即時反映・再起動で元に戻る) sudo sysctl -w vm.swappiness=10 # 変更後の値を確認する sysctl vm.swappiness # 出力例: vm.swappiness = 10
3. 永続化する(再起動後も維持する)
/etc/sysctl.d/ 配下にカスタムファイルを作成するのが推奨です。/etc/sysctl.conf に直接書く方法もありますが、パッケージ更新で上書きされるリスクを避けるため専用ファイルの利用が望ましいです。# 設定ファイルを作成する echo 'vm.swappiness = 10' | sudo tee /etc/sysctl.d/99-swappiness.conf # 設定ファイルを即時反映する(再起動不要) sudo sysctl --system
sysctl --system は /etc/sysctl.d/ 配下のすべてのファイルを読み込んで反映します。4. 変更が反映されたことを確認する
sysctl vm.swappiness # 出力例: vm.swappiness = 10 # /proc/sys から直接確認する方法 cat /proc/sys/vm/swappiness # 出力例: 10
サーバーの役割別推奨設定値
適切な vm.swappiness の値はサーバーの用途によって異なります。以下の表を参考に、運用するサービスの特性に合わせて選んでください。Linuxサーバーの性能を最大化するには vm.swappiness 以外にもさまざまなカーネルパラメータや設計上の判断が絡みます。リナックスサーバー構築セミナーではこうした実務レベルの判断基準をハンズオン形式で習得できます。
| サーバーの役割 | 推奨値 | 推奨理由 |
|---|---|---|
| データベースサーバー(MySQL, PostgreSQL) | 1 | バッファプールのページがスワップに追い出されると性能が激減する |
| インメモリキャッシュサーバー(Redis, Memcached) | 1 | データがスワップへ出るとキャッシュとしての役割を果たせなくなる |
| Webアプリケーションサーバー | 10 | スワップをほぼ使わない設定を維持しつつ、極端な制限を避ける |
| Javaアプリケーションサーバー(Tomcat 等) | 1~10 | GCによるヒープスキャンがスワップと重なると STW 時間が伸びる |
| 汎用サーバー・開発・テスト環境 | 60(デフォルト) | 特に制約のない用途ではデフォルトのままでよい |
スワップ使用量の変化を監視する方法
vm.swappiness を変更した後は、実際にスワップの出し入れが減っているかを確認します。swapon --showでスワップデバイスの状況を確認する
# スワップパーティション・ファイルの使用状況を表示する swapon --show
NAME TYPE SIZE USED PRIO /dev/dm-1 partition 4G 346M -2
vmstatでスワップの出し入れをリアルタイムに確認する
vmstat の si(swap in) 列と so(swap out) 列を確認します。si は「スワップから RAM へ戻す量(KB/s)」、so は「RAM からスワップへ追い出す量(KB/s)」です。# 1秒間隔で 5 回計測する(si・so列に注目する) vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 354304 8025600 384220 6112048 0 0 18 42 312 541 8 2 89 1 0 0 0 354304 8024800 384220 6112400 0 0 0 0 298 512 5 1 94 0 0
それでもスワップ使用量が増え続ける場合は、vm.swappiness の調整だけでは解決できません。
free -m で available が慢性的に 0 に近い状態であれば、プロセスの削減や物理メモリの増設を検討する必要があります。本記事のまとめ
| やりたいこと | コマンド・設定 |
|---|---|
| 現在のvm.swappiness値を確認する | sysctl vm.swappiness |
| 「使える空きメモリ」を正確に確認する | grep MemAvailable /proc/meminfo |
| vm.swappinessを一時変更する | sudo sysctl -w vm.swappiness=10 |
| vm.swappinessを永続化する | echo 'vm.swappiness = 10' | sudo tee /etc/sysctl.d/99-swappiness.conf → sudo sysctl --system |
| スワップの出し入れをリアルタイムで監視する | vmstat 1 5(si/so列) |
| スワップデバイスの使用量を確認する | swapon --show |
>> セミナー詳細・お申し込みはこちら
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:Linuxでファイルを削除したのにディスクが空かない時の調査手順|lsofで開いたままのファイルを特定してtruncateで即座に解放する方法
- この記事の属するカテゴリ:Linuxトラブルシューティングへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます