Linuxのvm.swappinessを設定してスワップを制御する方法|メモリ実態の確認からサーバー種別ごとの推奨値まで

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxトラブルシューティング > Linuxのvm.swappinessを設定してスワップを制御する方法|メモリ実態の確認からサーバー種別ごとの推奨値まで
「サーバーが急に重くなった。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に書けば永続化できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

スワップを使い続けると性能が落ちる理由

スワップはディスク上に確保した「仮のメモリ」です。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

この例では available が 8,250 MB(約 8 GB)あります。RAM 総量の約 50% が実際には使えるにもかかわらず、スワップが 346 MB 使用されています。こうした場合、vm.swappiness が高すぎてカーネルが不必要にページキャッシュをスワップへ退避している可能性があります。

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

si・so が継続的に 0 より大きい値になっている場合はスワッピングが発生しています。vm.swappiness を下げた後に si・so が 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
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、vm.swappiness のようなカーネルパラメータチューニングも含め「なぜそう設定するのか」まで腕に落ちる 2 日間のハンズオンセミナーをご用意しています。現場で使えるスキルを効率よく習得したい方は、Linux Master Pro Seminar の詳細をご確認ください。
>> セミナー詳細・お申し込みはこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。