Linuxサーバーのメモリが足りなくなったとき何が起きるのか|OOMキラーとスワップの仕組みとメモリ管理の基本

HOME > リナックスマスター.JP 公式ブログ > Linux学習ガイド > Linuxサーバーのメモリが足りなくなったとき何が起きるのか|OOMキラーとスワップの仕組みとメモリ管理の基本
運営:リナックスマスター.JP(代表 宮崎智広)
「メモリが足りないのか、サーバーがどんどん遅くなっていくのに何を確認したらいいか分からない」

そういう状態でとりあえず再起動してその場をしのいでいると、ある日突然サービスが止まる。Linuxサーバーのメモリ不足はじわじわと進行することが多く、気づいた時にはすでに重要なプロセスが強制終了されていた、という典型的なパターンで障害につながりやすい。

この記事では、RHEL 9系~10系・Ubuntu 24.04 LTSを想定環境として、Linuxサーバーのメモリが不足したとき何が起きるのかをOOMキラー(Out of Memory Killer)とスワップの仕組みから解説する。freeコマンドによるメモリ確認・スワップファイルの追加・swappinessの調整まで、実務で使える手順と考え方をまとめる。

この記事のポイント

・OOMキラーはメモリ枯渇時にカーネルが自動発動しプロセスを強制終了する仕組みだ
・メモリ確認はfree -hのfree列ではなくavailable列を見ること
・スワップ大量使用はメモリ不足のシグナル。増設より前にfuserやpsで原因を特定する
・重要サービスはOOMScoreAdjust=-1000でOOMキラーの対象から除外できる


Linuxサーバーのメモリが足りなくなったとき何が起きるのか|OOMキラーとスワップの仕組みと現役講師が語るメモリ管理の基本
「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

メモリが足りなくなると「何が起きるか」を理解していない人が多い

Linuxサーバーのメモリ管理でよくあるつまずきの一つが、「重くなったらとりあえず再起動する」というパターンだ。再起動すれば一時的にメモリが解放されて回復するため、問題が解決したように見えてしまう。しかし根本原因を把握しないまま運用を続けると、同じことが繰り返される。

メモリが枯渇した時、Linuxカーネルは自動的にOOMキラー(Out of Memory Killer)を発動させる。OOMキラーはシステム全体を守るためにメモリ消費量が大きいプロセスを強制終了する仕組みだ。データベースやWebサーバーのような重要なサービスが突然止まる場合、OOMキラーが原因であることが多い。

「なぜサービスが急に止まったか分からない」という状況の典型パターンがこれだ。OOMキラーが動いたかどうかはdmesgやjournalctlのログに記録される。まず以下のコマンドでOOMキラーが動いていないか確認する。

# journalctlでOOMキラーの発動ログを確認する # journalctl -k | grep -i oom # dmesgでも同様に確認できる # dmesg | grep -i "oom\|killed process"

出力例(環境により異なります):
kernel: Out of memory: Kill process 4821 (mysqld) score 243 or sacrifice child
kernel: Killed process 4821 (mysqld) total-vm:2543232kB, anon-rss:512340kB

上記のようなログが残っていれば、mysqldのプロセスがOOMキラーに強制終了された証拠だ。これを「サーバーの不具合」と判断してmysqldの設定だけ調べ続けても根本原因には辿り着けない。重要なサービスが突然止まったときは、まずこのOOMキラーのログを確認するのが定石だ。

なお、OOMキラーはカーネルが独自のスコアリングアルゴリズムでどのプロセスを終了するかを決める。スコアは各プロセスのメモリ使用量・実行時間・優先度を元に計算されるため、必ずしも「最もメモリを使っているプロセス」が止まるわけではない。この予測しにくさが、OOMキラーによる障害を診断しづらくしている一因だ。

freeコマンドでメモリの現状を正確に把握する

メモリ不足を疑ったら、最初にfreeコマンドで現在の使用量を確認する。freeコマンドの出力を正確に読めるかどうかで、次のアクションが大きく変わる。

1. free -hでメモリとスワップの使用量を確認する

freeコマンドに-hオプション(human-readable)を付けると、GB・MBの単位で表示され見やすくなる。

# メモリとスワップの現在の使用量を確認する # free -h # 5秒おきにリフレッシュして継続監視する # watch -n 5 free -h

出力例(環境により異なります):
              total        used        free      shared  buff/cache   available
Mem:            15Gi        12Gi       512Mi      256Mi       2.8Gi       2.3Gi
Swap:           2.0Gi        1.8Gi      256Mi

ここで注目すべきはfree列よりavailable列だ。Linuxはメモリを効率よく使うために、空きメモリをbuff/cache(バッファとキャッシュ)として積極的に活用する設計になっている。available列はこのbuff/cacheのうち解放できる分を含めた「実際にアプリが使えるメモリ量」を示している。

上の例では、free列が512Miだからといってメモリがひっ迫しているわけではない。available列の2.3Giが実際に使える量だ。この違いを知らないと、buff/cacheが大きいだけなのに「メモリが足りない」と誤判断してしまう。初心者がよくやってしまうつまずきの一つだ。

一方でSwap行を見ると、2.0GiのスワップのうちUsedが1.8Giとほぼ満杯に近い。これは物理メモリがすでに枯渇してスワップ領域(ディスク上の仮想メモリ)を大量に使っているシグナルで、放置するとOOMキラーが発動しやすい状態だ。

2. vmstatでリアルタイムのスワッピング状況を確認する

スワップの出し入れ(スワッピング)がリアルタイムで発生しているかどうかはvmstatコマンドで確認できる。

# 2秒間隔で10回サンプリングしてスワッピング状況を確認する # vmstat 2 10

出力例(環境により異なります):
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  1 1843200 524288 65536 2883584  420 1250  850  1300  480 220 45  8 10 37  0

si列(swap in:ディスクからメモリへの読み込み量)とso列(swap out:メモリからディスクへの追い出し量)がゼロ以外の値を継続的に示している場合は、スワッピングが頻繁に発生している証拠だ。wa(I/O待ち)の値が高い場合もこれが原因のことが多い。スワップはディスクへの読み書きを伴うため、物理メモリと比べて桁違いに遅く、サーバーのレスポンス悪化の直接原因になる。

スワップの仕組みと応急処置としての追加方法

スワップ(swap)とはディスク上に確保した「仮想的なメモリ領域」のことだ。物理メモリが枯渇した際に、使用頻度の低いメモリページをスワップ領域に追い出すことで物理メモリに空きを作る仕組みになっている。本番サーバーのメモリスペックが足りない場合の応急処置として、スワップファイルを追加することができる。

3. スワップファイルを追加する手順

# 2GBのスワップファイルを作成する(RHEL 9・Ubuntu 24.04 共通手順) # fallocate -l 2G /swapfile # パーミッションをroot専用(600)に変更する(注意: 必ず600にすること) # chmod 600 /swapfile # スワップ領域として初期化する # mkswap /swapfile # スワップを有効化する # swapon /swapfile # スワップの状況を確認する # swapon --show

出力例(環境により異なります):
NAME      TYPE  SIZE   USED PRIO
/swapfile file 2048M 256.0M   -2

再起動後も有効にするには/etc/fstabに追記する。

# /etc/fstabにスワップファイルを登録する(再起動後も有効) # echo '/swapfile none swap sw 0 0' >> /etc/fstab # 追記内容の確認 # tail -1 /etc/fstab

注意点として、/swapfileのパーミッション(chmod 600)を忘れると他のユーザーがスワップ領域の内容を読もうとする可能性があるため、必ずroot専用(600)に設定する。fallocateが使えない環境ではddコマンド(dd if=/dev/zero of=/swapfile bs=1M count=2048)で代替できる。

4. swappinessでスワップ使用の積極度を調整する

vm.swappinessはLinuxがスワップをどれだけ積極的に使うかを0~100で制御するカーネルパラメータだ。デフォルト値は60。サーバー用途では物理メモリを優先して使いたいため、10前後に下げることが多い。

# 現在のswappiness値を確認する # cat /proc/sys/vm/swappiness # swappinessを一時的に変更する(再起動で元に戻る) # sysctl vm.swappiness=10 # 恒久的な変更は/etc/sysctl.d/以下に設定ファイルを作る # echo 'vm.swappiness=10' > /etc/sysctl.d/99-swappiness.conf # sysctl -p /etc/sysctl.d/99-swappiness.conf

vm.swappiness=10に設定すると、物理メモリをギリギリまで使い切ってからスワップを使うようになるため、不要なディスクI/Oを減らせる。ただし0に設定するとスワップをほとんど使わなくなり、物理メモリが枯渇した時にOOMキラーが即座に発動しやすくなるため注意が必要だ。

エラー・トラブル:OOMキラーが発動してプロセスが止まった時の対処

5. 発動ログを確認してどのプロセスが止まったかを特定する

OOMキラーが発動した後、最初にやることはログで「どのプロセスが強制終了されたか」を確認することだ。

# systemdのジャーナルログでOOM関連を確認する # journalctl -k --no-pager | grep -i "oom\|kill" # 直近のカーネルメッセージをリアルタイムで確認する # dmesg -w | grep -i oom # Apacheが再起動しているか確認する(HTTPDを例に) # systemctl status httpd

出力例(環境により異なります):
httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
     Active: active (running) since Wed 2026-10-21 07:32:15 JST; 2min 31s ago

プロセスが止まってすぐにsystemdが自動再起動した場合は「起動時刻が最近」のことがある。起動時刻が想定より新しければ再起動が発生した可能性が高い。

6. 重要なサービスをOOMキラーから守る設定

OOMキラーはどのプロセスを終了するかをoom_scoreというスコアで決める(0~1000の範囲で高いほど終了されやすい)。重要なサービスのoom_score_adjを-1000に設定すると、OOMキラーの対象から除外できる。

# プロセスのOOMスコアを確認する(PIDは実際のプロセスIDに置き換える) # cat /proc/PID/oom_score # systemdで管理しているサービスのOOMScoreAdjustを設定する # systemctl set-property httpd.service OOMScoreAdjust=-1000 # 設定を反映する # systemctl daemon-reload # 設定後に確認する # systemctl show httpd.service | grep OOMScoreAdjust

注意点として、oom_score_adj=-1000を重要なすべてのサービスに設定してしまうと、本当に物理メモリが枯渇した時にどのプロセスも終了できなくなり、システム全体がハングする可能性がある。本当に守りたいサービス1~2個に絞って設定するのが実務上の鉄則だ。

7. Cannot allocate memoryエラーへの対処

メモリが枯渇した状態でコマンドを実行しようとすると「-bash: fork: Cannot allocate memory」のエラーが発生することがある。新しいプロセスを起動するためのメモリがシステムに残っていない状態だ。このエラーが出たらfreeコマンドとdmesgを確認し、OOMキラーが発動していないかを調べるのが最初のステップだ。応急処置としてはpsコマンドで不要なプロセスを探して終了し、物理メモリに空きを作ることを優先する。

# メモリ使用量が多いプロセスをRSS(実メモリ使用量)順に表示する # ps aux --sort=-%mem | head -15 # 特定プロセスのメモリ使用量の時系列変化を5秒おきに監視する # watch -n 5 'ps -p PID -o pid,rss,vsz,%mem,comm'

RSS(Resident Set Size)は実際の物理メモリ使用量を示す値だ。このRSS値が時間とともに増え続けているプロセスがあれば、アプリケーションのメモリリークを疑う手掛かりになる。

現役講師が語る「メモリ管理を後回しにしていた人」に多い3つのパターン

3,100名以上を指導してきた経験から、Linuxのメモリ管理を後回しにしていた人がつまずく典型的なパターンを整理する。実際に現場で繰り返されるパターンなので、思い当たることがあれば早めに対処することをすすめる。

パターン1:free列とavailable列を混同してメモリ不足を誤判断する

Linuxはパフォーマンスのためにメモリをbuff/cacheとして積極的に使う設計になっている。そのため「free列が小さい=メモリ不足」と勘違いして不要なプロセスを終了させたり、スワップを増やしたりする対処をしてしまうケースがある。見るべきはavailable列だ。availableが物理メモリ総量の10%を切り始めたあたりから、監視を強化する運用が実務では基本になる。

パターン2:スワップを増やすことで問題が解決すると思い込む

スワップはあくまで「メモリ枯渇時の緊急避難所」であり、スワップを増やしても根本的なメモリ不足は解決しない。スワップが大量に使われている状態は、物理メモリが枯渇しているシグナルだ。本来の対処は物理メモリの増設か、不要なプロセスの整理になる。スワップを増やすことでOOMキラーの発動を先送りにする効果はあるが、スワップを大量に使っている期間はサーバーのI/O負荷が高まりレスポンスが低下し続ける。

パターン3:再起動で解決したと思い込み、原因を記録しない

再起動でメモリはリセットされて一時的に回復する。しかし原因が特定のプロセスのメモリリークである場合、稼働時間が長くなるにつれて同じ状態に戻る。再起動で解決する前に、dmesgやfree -hの出力を記録しておく習慣を持つと、次回の障害対応がずっと楽になる。「再起動してしまうと証拠が消える」と意識するだけで、運用の質が変わってくる。

まとめ

Linuxのメモリ管理でよくあるつまずきと対処方法を一覧で整理する。

確認・操作したいこと コマンド・方法 ポイント
メモリ使用量の確認 free -h free列でなくavailable列を見る
スワッピングの発生確認 vmstat 2 10 si・so列がゼロ以外なら要対処
OOMキラーのログ確認 dmesg | grep -i oom プロセス強制終了時に記録される
スワップファイルの追加 fallocate -l 2G /swapfile && mkswap /swapfile chmod 600の設定を忘れずに
スワップ積極度の調整 sysctl vm.swappiness=10 サーバー用途では10前後が推奨
メモリ使用量の多いプロセス確認 ps aux --sort=-%mem | head -15 RSS値が増え続けるならメモリリークを疑う
OOMキラーから重要サービスを保護 systemctl set-property httpd.service OOMScoreAdjust=-1000 本当に守りたいサービス1~2個に絞る
メモリ管理は「今は動いているから問題ない」と後回しにしやすいテーマだが、サーバーが突然サービスを停止する原因の多くがメモリ不足だ。freeとvmstatでメモリの状態を定期的に確認し、スワップ使用量が増えてきたら早めに対処する習慣を持つことが実務では重要になる。

次に読む記事:
・Linuxのポート確認コマンド(ss・lsof)の使い方
・chkconfigとsystemctlの使い方と違い

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、

メモリ管理・プロセス監視・ネットワーク設定まで、20年以上の現場経験を持つ現役サーバー管理者が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人材の育成に取り組んでいます。