CH-J Server ManagerSSH によるサーバー管理
メニュー
すべてのガイドと記事 →

LinuxサーバーのRAM、キャッシュ、swapの見方

freeの各列の意味、メモリ使用量が多くても問題ないことが多い理由、本当にメモリ不足を示す兆候を説明します。

freeではなくavailableを見る

Linuxは使われていないメモリをディスクキャッシュに利用するため、正常なサーバーで空きメモリが少ないのは普通です。available列は、swapを使わずに新しい処理へ割り当てられるメモリ量をカーネルが推定したものです。注目すべきなのはこの値です。usedの正確な計算方法はツールのバージョンによって異なるため、異なるシステム間で比較しないでください。

free -h
grep -E 'MemAvailable|Shmem:|SReclaimable' /proc/meminfo

キャッシュのうち解放できるものとできないもの

ページキャッシュは通常、アプリケーションがメモリを必要とするときに解放できます。共有メモリとtmpfs(Shmem)もcacheに含まれますが、ディスクにコピーがないデータを保持しているため、単純に破棄することはできません。そのため、キャッシュが大きいのに利用可能メモリが少ない場合、tmpfsや共有メモリセグメントが大きいことがよくあります。

df -h -t tmpfs
sudo slabtop -o | head -15

swapの使用自体は問題とは限らない

使用頻度の低いページをサーバーが何週間もswapに置いたままでも、支障がないことがあります。問題なのは継続的な出し入れです。vmstatのsi列とso列を確認してください。値がゼロを超えたままなら、システムが継続的にswapへの書き出しや読み戻しを行っており、実際のメモリ不足の兆候です。

swapon --show
vmstat 1 5

メモリの使用元を調べる

プロセスを常駐メモリ量で並べ替えます。RSSはプロセス間で共有されるページを各プロセスに計上するため、複数プロセスの値を単純に合計することはできません。smemなどPSSに対応したツールがインストールされていれば、より適切な合計が得られます。

ps -eo pid,user,rss,comm --sort=-rss | head -15

本当のメモリ不足を見分ける

兆候は、利用可能メモリの少なさ、継続的なswapへの出し入れ、out-of-memory killerによるプロセスの強制終了です。カーネルログを確認してください。数値をよく見せるためにdrop_cachesを実行しないでください。サーバーにディスクからの再読み込みを強いるだけで、何も解決しません。

sudo journalctl -k --no-pager | grep -iE 'out of memory|oom-kill'

CH-J Server Managerのメモリ表示

System MonitorはSSH経由でこれらの値を読み取ります。LinuxではusedをMemTotal − MemFree − Buffers − Cached − SReclaimableと定義し、availableにはカーネルの推定値を使います。共有メモリはCachedに含まれ、解放できません。バーの各分類は重複しません。計算式が一部のバージョンのfreeとは異なるため、数値が完全には一致しない場合があります。swapとその使用履歴も表示します。ZFS ARCは別扱いされないため、ZFSホストでは使用済みメモリとして計上されます。

詳しいドキュメント

man: free →

man: proc_meminfo →

生体認証によるロック解除とセキュリティ →