Linuxサーバーのメモリ不足を確認する方法|free・topで原因を調べる手順
Linuxサーバーを運用していると、突然処理が遅くなったり、アプリケーションが停止したりすることがあります。
CPU使用率を確認しても特に問題がない場合は、メモリ不足が原因になっていないか確認してみましょう。
Linuxでは、メモリが少なくなるとSwapが使われたり、さらに深刻な場合にはOOM Killerによってプロセスが終了させられたりすることがあります。
ただし、freeのusedが大きいからといって、すぐに「メモリ不足」と判断するのは適切ではありません。
まず現在のメモリ状態を確認し、どのプロセスがメモリを使っているのかを順番に調べていきます。
最初にfree -hでメモリを確認する
Linuxのメモリ状況を確認するとき、最初に使いやすいのがfreeです。
free -h
実行すると、例えば次のような情報が表示されます。
total used free shared buff/cache available
Mem: 4.0Gi 3.2Gi 250Mi 120Mi 550Mi 600Mi
Swap: 2.0Gi 1.5Gi 500Mi
ここで確認したいのが、主に次の項目です。
total:搭載されているメモリ容量used:使用中のメモリfree:完全に未使用のメモリbuff/cache:バッファやキャッシュなどに使われているメモリavailable:新しい処理に利用できるメモリの目安Swap:ディスク上に確保されたSwap領域
特に**availableがどの程度残っているか**を確認することが重要です。
freeが少なくてもすぐにメモリ不足とは限らない
Linuxでは、空いているメモリをファイルキャッシュなどに利用することがあります。
そのため、
free = 100MB
と表示されていても、それだけで「メモリがほとんどない」と判断することはできません。
キャッシュとして利用されているメモリは、必要になれば別の処理に利用できる場合があります。
そのため、free -hを確認するときはfreeだけでなく、availableも見るようにしましょう。
「usedが90%だから危険」という単純な判断ではなく、実際に新しい処理へ使えるメモリがどの程度残っているかを確認することがポイントです。
topでメモリを使っているプロセスを確認する
次に、どのプロセスがメモリを多く使用しているか確認します。
top
topを実行すると、CPUやメモリの使用状況とプロセス一覧が表示されます。
メモリ使用量を確認したい場合は、topの画面でMを押すと、メモリ使用率の高いプロセスを確認しやすくなります。
例えば、
PID USER %CPU %MEM COMMAND
1234 www-data 5.0 35.2 php-fpm
2345 mysql 8.0 25.1 mysqld
のように、特定のプロセスが多くのメモリを使用していることがあります。
psコマンドでメモリ使用量を確認する
topを使わず、コマンド一つでメモリ使用量の多いプロセスを確認することもできます。
ps aux --sort=-%mem | head
これでメモリ使用率の高いプロセスから表示できます。
例えば、
- MySQL
- PostgreSQL
- PHP-FPM
- Node.js
- Java
- Docker関連プロセス
- 独自アプリケーション
などが上位に表示されることがあります。
重要なのは、メモリを多く使っているプロセスを見つけたあと、そのプロセスが本当に異常なのかを確認することです。
データベースなどは、正常な状態でも一定量のメモリを使用します。
使用率が高いという理由だけで、プロセスを停止しないようにしてください。
メモリ不足の原因を考える
メモリが少なくなっている場合、原因は一つとは限りません。
代表的な原因には次のようなものがあります。
- アプリケーションのメモリ使用量が大きい
- プロセスが長時間動作している
- 同時に多くのサービスを起動している
- データベースの負荷が高い
- Dockerコンテナがメモリを大量に使用している
- メモリリークが発生している
- サーバーのメモリ容量そのものが不足している
特に、時間が経つほどメモリ使用量が増え続ける場合は、アプリケーションやプロセス側の問題も疑います。
Dockerを使っている場合はdocker statsを確認する
Docker環境でメモリ不足が起きている場合は、コンテナ単位で確認すると原因を見つけやすくなります。
docker stats
実行すると、各コンテナのCPUやメモリ使用量を確認できます。
例えば、
CONTAINER CPU % MEM USAGE / LIMIT
web 2.5% 800MiB / 1GiB
database 5.2% 1.2GiB / 2GiB
のように表示されます。
特定のコンテナだけが大量のメモリを使用している場合は、そのコンテナ内のアプリケーションや設定を確認します。
Dockerだからメモリを無制限に使えるわけではないため、複数のコンテナを同時に動かしているサーバーでは、それぞれの使用量にも注意が必要です。
Swapが使われているか確認する
物理メモリが不足すると、LinuxはSwapを利用することがあります。
free -h
の結果で、
Swap:
の項目を確認できます。
例えば、
Swap: 2.0Gi 1.8Gi 200Mi
のように大部分が使用されている場合、メモリ不足が発生している可能性があります。
Swapはディスクを利用するため、物理メモリと比べて高速ではありません。
そのため、Swapが大量に使われている状態では、サーバーの処理が遅く感じられる場合があります。
ただし、Swapが少し使われているだけで、必ず問題が発生しているとは限りません。
Swapが多く使われているときの注意点
「Swapを使っているから、すぐにSwapを無効にする」という対応は避けてください。
Swapは、メモリが不足したときにシステムを支える役割を持つことがあります。
Swap使用量が増えている場合は、
- 物理メモリが不足していないか
- 特定のプロセスが大量にメモリを使っていないか
- アプリケーションの設定に問題がないか
- サーバーのメモリ容量が用途に合っているか
を確認することが先です。
OOM Killerとは?
メモリが極端に不足すると、Linuxでは**OOM Killer(Out Of Memory Killer)**が動作することがあります。
これは、システムが必要なメモリを確保できなくなったときに、プロセスを終了させてメモリを確保する仕組みです。
そのため、突然、
- Webアプリケーションが停止した
- データベースが落ちた
- Dockerコンテナが停止した
- 特定のプロセスが突然終了した
という場合、OOM Killerが関係している可能性があります。
OOM Killerが動作したか確認する
Linuxでは、カーネルログなどからOOM関連の記録を確認できます。
例えば、
dmesg | grep -i "out of memory"
や、
dmesg | grep -i "killed process"
などで関連するメッセージを探せます。
環境によっては権限やログ管理の仕組みが異なるため、dmesgで十分な情報が得られない場合があります。
systemdを利用している環境では、
journalctl -k
などからカーネル関連のログを確認する方法もあります。
OOMに関する記録が見つかった場合は、「なぜメモリが不足したのか」まで調べることが重要です。
メモリ不足だからといってキャッシュを無理に削除しない
Linuxのメモリ使用量を見ていると、キャッシュが大量に表示されることがあります。
そのため、「キャッシュを全部削除すればメモリが増えるのでは」と考えることがあります。
しかし、通常の運用ではキャッシュを理由に無理な削除操作をする必要はありません。
キャッシュはシステムの処理を効率化するために利用されています。
まずavailableやプロセスの使用量を確認し、本当にメモリ不足が起きているのかを判断してください。
メモリリークが疑われる場合
メモリ使用量が時間とともに増え続け、プロセスを再起動すると一時的に改善する場合は、メモリリークなどの問題も考えられます。
例えば、
起動直後
↓
メモリ使用量 30%
↓
数時間後
↓
メモリ使用量 60%
↓
さらに時間が経過
↓
メモリ使用量 90%
という状態が繰り返される場合です。
この場合は、単純にサーバーのメモリを増やすだけでなく、アプリケーションや使用しているライブラリなども確認する必要があります。
原因を特定できないまま再起動だけを繰り返すと、問題が再発する可能性があります。
PHP-FPMやデータベースも確認する
Webサーバーでは、PHP-FPMやデータベースがメモリを多く使用していることがあります。
例えばWordPressなどのPHPアプリケーションを運用している場合、アクセス増加やプラグイン、PHP処理などが原因でメモリ使用量が増えるケースがあります。
データベースについても、同時接続数や処理内容によってメモリ使用量が変化します。
そのため、
Linux
↓
Webサーバー
↓
PHPなどのアプリケーション
↓
データベース
という構成全体を確認することが大切です。
メモリ不足の確認手順
原因が分からない場合は、次の順番で調べていくと整理しやすくなります。
1.現在のメモリ状態を確認
free -h
availableやSwapの使用量を確認します。
2.メモリ使用量の多いプロセスを確認
ps aux --sort=-%mem | head
3.リアルタイムで確認
top
必要に応じてMを押してメモリ使用量順に確認します。
4.Dockerを利用しているなら確認
docker stats
コンテナごとのメモリ使用量を確認します。
5.OOM Killerの記録を確認
dmesg | grep -i "killed process"
などでメモリ不足によるプロセス終了がないか確認します。
6.ログやアプリケーションを確認
メモリ使用量の多いプロセスが見つかったら、そのサービスのログや設定を確認します。
7.必要に応じてサーバーの構成を見直す
原因を確認したうえで、アプリケーションの設定変更、不要なサービスの整理、メモリ増設などを検討します。
メモリ不足が起きたときにやってはいけないこと
メモリ不足に気づいたとき、原因を確認せずに次の操作を行うのは避けたほうが安全です。
- 必要なプロセスを強制終了する
- キャッシュを無条件に削除する
- Swapをすぐに無効化する
- 原因を確認せずサーバーを再起動する
- Dockerコンテナをすべて削除する
- 設定値を一度に大量に変更する
まずは現在の状態を記録し、どのプロセスがメモリを使用しているのかを確認してください。
まとめ
Linuxサーバーのメモリ不足を調べるときは、まず、
free -h
で全体の状態を確認します。
その後、
top
ps aux --sort=-%mem | head
などを使って、メモリを多く使用しているプロセスを探します。
Dockerを利用している場合は、
docker stats
でコンテナごとの使用量も確認できます。
さらに、メモリ不足によってプロセスが強制終了されている場合は、OOM Killerのログを確認することで原因を絞り込めます。
重要なのは、「メモリ使用率が高い=すぐに異常」と決めつけないことです。
available、Swap、プロセス、ログなどを合わせて確認し、実際にメモリ不足が発生しているのかを判断しましょう。
Linuxのメモリ使用率が高い場合はどうすればいいですか?
まずfree -hでavailableとSwapを確認し、その後topやpsでメモリ使用量の多いプロセスを調べます。
単純にメモリ使用率だけを見てプロセスを停止するのは避けてください。
freeの値が少ないとメモリ不足ですか?
必ずしもそうではありません。
Linuxはメモリをキャッシュなどにも利用するため、freeだけでなくavailableを確認することが重要です。
Swapが増えるとサーバーは遅くなりますか?
Swapはディスクを利用するため、物理メモリより処理速度が遅くなります。
Swapが大量に利用されている場合は、物理メモリ不足やメモリ使用量の多いプロセスがないか確認してください。
OOM Killerが動作するとどうなりますか?
システムが必要なメモリを確保できなくなった場合、Linuxがプロセスを終了させてメモリを確保することがあります。
突然アプリケーションやDockerコンテナなどが停止した場合は、OOM関連のログを確認すると原因を調べる手がかりになります。
