高度なLinuxメモリ管理:完全かつ実践的なガイド

最終更新: 19 4月2026
  • Linuxは利用可能なRAMをすべてキャッシュとページキャッシュに使用するため、空きメモリが少ないからといって必ずしも問題があるとは限りません。
  • スワップ、zram/z​​swap、およびvm.swappinessの適切な設定を組み合わせることで、パフォーマンスと安定性のバランスを取ることができます。
  • cgroup v2、systemd-oomd、およびearlyoomやnohangなどのツールは、メモリ負荷とOOMイベントをきめ細かく制御できます。
  • free、vmstat、htop、sar、またはGlancesを使用した監視は、ボトルネックを検出し、メモリ管理を最適化する上で重要です。

高度なLinuxメモリ管理

システム管理、コンテナ操作、本番サーバーの保守を行うのであれば、Linuxにおけるメモリ管理の徹底的な理解はもはや選択肢ではなく必須事項です。負荷の急増にも動じないサーバーと、処理が滞ったり、スラッシングモードに陥ったり、最悪のタイミングで恐ろしいOOMキラーを起動してしまうサーバーとの違いは、まさにこのメモリ管理の知識の有無にかかっています。

LinuxはRAMを可能な限り効率的に使用するように設計されています。ファイルのキャッシュ、ページの圧縮、データのスワップ領域への移動、そして非常に厳密なポリシーに基づくプロセスの優先順位付けなどを行います。外から見ると「メモリを大量に消費している」とか「空きRAMがまったくない」ように見えるかもしれませんが、実際には最高のパフォーマンスと安定性を実現しようとしているのです。それでは、これらの仕組みと、高度な設定方法について、少し分かりやすく解説しながら、段階的に見ていきましょう。

Linuxにおけるメモリに関する基本概念と誤解

Linuxにおけるメモリの概念

カーネルパラメータをいじったり、明日がないかのようにzramをマウントしたりする前に、メモリの種類、アーキテクチャ、システムがRAMをどのように認識するかについて、いくつかの明確な理解を持っておくのが良いでしょう。

コンピュータが処理できる物理メモリの最大容量は、オペレーティングシステムとプロセッサのアーキテクチャによって決まります。32ビットシステムは通常4GBのRAMに制限されますが、64ビットシステムは数十ギガバイト、あるいは数百ギガバイトを容易に処理できます(理論的にははるかに多くの容量を処理できますが、実際の制限はハードウェアによって決まります)。

Linuxでは、すべてのメモリは仮想メモリとして管理されます。これには物理RAMとスワップ領域の両方が含まれます。RAMは物理モジュールを追加する以外に拡張することはできませんが、仮想メモリはディスク(パーティションまたはスワップファイル)やzram、zswapなどの高度なメカニズムを使用して拡張できます。

La 物理メモリ(RAM) これは高速かつ高価なリソースです。プロセス、ライブラリ、ファイルキャッシュ、I/Oバッファ、共有メモリなどがロードされる場所です。Linuxには非常に明確な哲学があります。空きRAMがあれば、それを空けておくよりもキャッシュとして使用してアクセスを高速化する方が良いのです。そのため、次のようなツールで「空き」メモリが少ないように見えるのです。 free それはあなたに問題があるという意味ではありません。

ディスクメモリ(永続ストレージ)ははるかに低速です。RAMはナノ秒単位で応答しますが、SSDでさえマイクロ秒またはミリ秒単位でしか応答しません。そのため、システムは頻繁に使用するデータをRAMに保持し、実行ファイルの読み込み、使用頻度の低いデータの読み込み、ページのスワップなど、どうしても必要な場合にのみディスクにアクセスします。

仮想メモリ、ページ、および内部カーネル構造

仮想メモリとは、Linuxが各プロセスに独自の隔離された保護されたアドレス空間を提供する仕組みです。ハードウェアとカーネルは、ページテーブルと呼ばれる構造を通して、仮想アドレスを物理アドレスに変換します。

メモリ管理に使用される最小単位はページであり、通常は4KBです。仮想メモリシステム全体はページを中心に構築されており、ページは割り当て、解放、スワップ、キャッシュされ、読み取り専用、実行など、さまざまな権限が付与されます。

ページテーブルは、カーネルによって管理される階層構造です。各プロセスの仮想ページごとに、実際の物理ページの位置(存在する場合)、アクセス権限、および現在の状態が格納されます。この変換により、プロセスを分離し、ページをプロセス間で共有し、ファイルをメモリに直接マッピングすることが可能になります。

プロセスが有効なアドレスにアクセスしようとした際に、ページがアクセス可能な状態になっていない場合、ページフォルトが発生します。ページフォルトは、軽微なもの(ページはRAMに存在するが、更新が必要な状態にある)と、負荷の高いもの(ページがディスク、スワップ領域、またはファイル上にあり、RAMに読み込む必要がある)があります。ページフォルトが頻繁に発生すると、ディスクからの読み込みに時間がかかりすぎるため、システムの動作が遅くなります。

ページキャッシュは、カーネルによって管理されるファイルページのキャッシュです。ファイルやディレクトリのデータとメタデータを保存することで、ディスクアクセスを削減します。LinuxがすべてのRAMを使用しているように見える理由の一つは、実際にはアプリケーションが積極的に使用していないメモリを活用してディスクアクセスを高速化しているからです。

メモリの種類:ファイルベース、匿名メモリ、およびそれらがスワップとどのように関連しているか

Linuxでは、通常、ファイルメモリと匿名メモリは区別されます。どちらもRAM上に存在しますが、その起源とディスクへのバックアップの可能性は異なります。

呼び出し ファイルメモリ システムファイルによってバックアップされているのは、実行可能バイナリ、共有ライブラリ、マッピングされたデータです。 mmap ファイルなどから読み込んだデータです。必要に応じて、そのメモリを破棄して元のファイルから再読み込みすることができます。

La 匿名メモリ プロセスが予約するファイルに関連付けられていないすべてのもの: 動的ヒープ、スタック、プライベート領域、 MAP_ANONYMOUSコピーオンライトでコピーされた領域 fork()このメモリはRAM(または移動された場合はスワップ領域)にのみ存在し、その唯一のバックアップ手段はまさにそのスワップ領域です。

カーネルがRAMを解放する必要がある場合、まず再構築可能なページ(通常はページキャッシュやファイルベースの領域)を解放しようとします。メモリに空きがなくなったり、メモリ負荷が非常に高くなった場合にのみ、匿名メモリをスワップ領域に押し込みます。これはコストは高くなりますが、システムに負荷を軽減する効果があります。

  Bashスクリプトとユーティリティ:Linux自動化のための完全ガイド

メモリ負荷、スラッシング、およびOOMキラー

メモリ不足は、空きページ数が一定の内部しきい値を下回ったときに発生します。カーネルは、キャッシュのクリア、ダーティページのディスクへの書き込み、使用頻度の低いページの削除など、メモリを解放するために絶えず処理を行わざるを得なくなります。

メモリ負荷が高くなると、ウェブサービスの遅延、グラフィカルインターフェースの動作の遅さ、リモートセッション(SSH、VNC、RDP)からの応答の遅延、マウスの動作のぎこちなさ、ウィンドウの反応に数秒かかるなど、非常に明確な症状が現れます。このような状態では、システムは有用な作業を行うことよりも、生き残ることに重点を置くようになります。

スラッシングは、プロセスが常に使用するページを保持するのに十分なRAM容量がない場合に発生します。カーネルはページを継続的にスワップし始めます。つまり、あるページを削除して別のページを挿入しますが、すぐに削除したページが必要になります。その結果、ページフォルトとディスクアクセスが繰り返され、パフォーマンスが低下します。

スワップが有効になっている場合、スラッシングとは、匿名ページがRAMとスワップ領域の間を行き来し、ディスクを飽和させることを意味します。スワップが無効になっている場合は、問題がファイルページに移行します。ファイルページはファイルシステムから繰り返し破棄され、再読み込みされるため、マシンが事実上使用不能になる可能性があります。

カーネルがそれでも空きメモリを確保できない場合は、以下の手順が実行されます。 メモリ不足(OOM)メカニズム削除、圧縮、または交換できるものがすべて使い果たされたら、カーネルは各プロセスのスコアを計算します(oom_scoreそして、どちらを犠牲にするかを決定します。そのプロセスは、 OOMキラー 大量のRAMを解放し、完全なクラッシュを回避するため。

スワップとは何か、どれくらい投入すべきか、そしてなぜ「悪魔の所業」ではないのか

スワップメモリ​​は、時代遅れの助言や「RAMがたくさんあるならスワップは不要」といった単純化しすぎた考え方などが原因で、評判が悪い。しかし実際には、スワップ領域は、RAMが豊富なシステムであっても、Linuxのメモリ設計において重要な要素である。

スワップとは、カーネルが非アクティブなメモリページを格納するために使用するディスク上の領域(パーティションまたはファイル)のことです。これにより、実際にRAMを必要とするプロセスのためにRAMを解放することができます。スワップ自体は仮想メモリではありませんが、仮想メモリを実現するメカニズムの一つです。

スワップがない場合、メモリ負荷が増加すると匿名ページは行き場を失います。カーネルはキャッシュやファイルベースのページを利用することはできますが、匿名メモリが危険なほど高くなると、事実上、OOMキラーをより早く起動せざるを得なくなります。技術的には、Linuxはスワップなしでも動作しますが、実際には、ほとんどのシナリオで不必要なリスクとなります。

スワップ領域のサイズを決定するにあたって、決まった方法はありませんが、マシンの役割に応じて、現代において妥当な基準がいくつかあります。

  • 休止状態のないサーバー十分なRAMを搭載している場合でも、通常は4~8GBのスワップ領域があればバッファとして十分です。メモリを大量に消費するサービス(データベース、仮想化など)の場合は、RAMの1,5倍まで増やすことができますが、物理RAMの増設を優先すべきです。
  • 休止状態のないデスクトップRAMが16GB以上であれば、2~4GBのスワップ領域は安全策として十分すぎるほどです。
  • 休止状態対応デバイススワップ領域はRAMと同等か、わずかに大きいサイズでなければなりません。なぜなら、システムは休止状態になる際にメモリの内容すべてをスワップ領域に書き込むからです。

スワップ領域の作成は非常に柔軟です。専用パーティションを使用することも、スワップファイルを使用することもできます。スワップファイルは、ディスクが既にパーティション分割されている場合や、システム全体を再構成せずにサイズを調整したい場合に最適です。

メモリメトリクス:free、vmstat、ps、RSS、PSSなど

従来のLinuxメモリ管理ツールは、各列の意味を知らないと誤解を招く可能性があります。 free -h これは、総メモリ量、使用済みメモリ量、空きメモリ量、キャッシュ、スワップ量を一目で確認できる最も簡単な方法です。

出口で free バッファとキャッシュを差し引く行を見ることが重要です。なぜなら、その列は プロセスによって実際に使用されるメモリカーネルがキャッシュとして使用し、必要に応じて迅速に解放できるものは含まない。

とともに vmstat -s -S M 合計メモリ、使用済みメモリ、空きメモリ、アクティブメモリ、アイドルメモリ、スワップキャッシュなど、より詳細な概要が表示されます。 /proc/meminfo 各指標を詳細に確認することもできますが、出力はより簡潔で、ユーザーフレンドリーとは言えません。

RAMに最も影響を与えるプロセスを調べるには、 ps aux 次のような列を表示します VSZ (プロセスがすべてをロードした場合に使用できる仮想メモリの合計) RSS (常駐セットサイズ、RAMに現在格納されている実際のメモリ容量)。注:RSSには共有ライブラリメモリも含まれ、複数のプロセスで使用されている場合は複数回カウントされます。

ここに登場 PSS(比例セットサイズ)これは、共有ライブラリのコストを、それを使用するプロセス間で分散します。PSSを簡単に取得するには、次のようなツールがあります。 smemこれは、共有ライブラリによるデータの歪みを生じることなく、どのアプリケーションが本当に「データ消費量が多い」のかを確認するのに非常に役立ちます。

メモリ断片化、スタック、ヒープ、および ulimit

メモリ管理におけるもう一つのあまり知られていない側面は、断片化です。断片化には、内部断片化(4、8、または16バイトの倍数でブロックが丸められて割り当てられ、使用できない部分が残る場合)と外部断片化(空きメモリが存在するものの、大きな連続した割り当てを使用できないほど小さな断片に分割されている場合)があります。

Redisのようなアプリケーションでは、システム(RSS)によって報告されるメモリと、アプリケーション自体が有用と考えるメモリ(used_memoryこの距離は通常、主に 外部断片化システムが占有されているとみなすが、実際にはプロセスが使用しないギャップ。

プロセスの記憶は概念的に以下のように分割される。 積み重ねて山積みにするスタックはローカル変数や関数呼び出しに使用され、ヒープは動的メモリ割り当てに使用されます。 malloc() 同様です。データ構造がスタックの容量を超えると、ヒープから取り出され、ポインタを使用して処理されます。

  Windows 11:ホットパッチを使用して再起動せずにアップデートを行う方法

プロセスごとの最大スタックサイズは、 ulimit -a システム構成にも影響します。この値を小さくすると、大きなローカル変数の数が制限され、大きくすると、より多くの変数や深い再帰が可能になります。このパラメータを調整することで、メモリ使用量をより適切に制御し、特定の種類の断片化を軽減できますが、万能薬ではありません。

高度な監視と診断:top、htop、vmstat、sarなど

RAMを消費しているプロセスを特定するには、まず top さらにユーザーフレンドリーなものが欲しい場合は、 htop後者はCPU、メモリ、スワップの使用状況を示すバーを表示し、プロセスの対話的な並べ替えとフィルタリングを可能にする。

Debianとその派生ディストリビューションでは、 htopをインストールする とともに sudo apt install htopAlmaLinuxやその他のRed Hat系システムでは、 sudo dnf install htop一度内部に入ると、メモリ使用量でソートしたり、特定のプロセスを検索したり、問題のあるタスクをインターフェースから直接終了させたりすることができます。

より詳細な分析とバッチモードについては、 vmstat 5 プロセス、メモリ、ページング、ブロックI/O、割り込み、CPUスケジューリングに関する定期的な情報を提供します。メモリ負荷が時間とともにどのように変化するかを把握するのに最適です。

以下の sysstat 次のようなツールが組み込まれています。 sarこれにより、メモリやその他のリソースの使用状況を記録および分析できます。たとえば、 sar -r 1 5 メモリとスワップの使用量を1秒ごとに5回表示します。Debianでは、以下の方法でインストールされます。 sudo apt install sysstatそしてAlmaLinuxでは sudo dnf install sysstat.

カーネルレベルの詳細なデバッグが必要な場合は、 bpftrace これはeBPFに基づいた強力なツールです。システムコールを計測したり、メモリアクセスを監視したり、再コンパイルや再起動なしでボトルネックを検出したりできます。通常は以下の方法でインストールされます。 sudo apt install bpftrace Debian系システムの場合。

実践的なメモリ管理:スワップ、スワップネス、キャッシュのクリーンアップ

多くのサーバーにおける基本的なタスクは、 スワップの現在の状態。 ととも​​に swapon --show アクティブなスワップ デバイスとファイル、そのサイズ、タイプ、優先度の一覧があります。実行時にスワップを追加する必要がある場合は、次のファイルを作成できます。 fallocate許可証を取得する chmod 600フォーマットして mkswap そしてそれをアクティブにする swapon永続化するには、対応するエントリを以下に追加するだけです。 /etc/fstab.

パラメータ vm.swappiness これは、カーネルがRAMの使用を継続するよりもスワップの使用を優先する度合いを制御します。値の範囲は0から100です。低い値(10~20)では、システムは絶対に必要になるまでスワップの使用を避け、高い値(60以上)では、空きRAMを維持するために、システムがページをより積極的にスワップに移動するように促します。

ディスク速度が遅いサーバーや大規模なデータベースでは、多くの場合、 交換頻度を下げる例えば、10または20まで、 sudo sysctl vm.swappiness=10高速なzramやSSDを搭載したデスクトップPCの場合、30~60といった中間値を用いることで、レイテンシとメモリ使用率のバランスを良好に保つことができます。

記憶が良好な状況では、時には強制的に キャッシュリリース とともに sudo sync && sudo sysctl -w vm.drop_caches=3これはページキャッシュとdentryの大部分を空にします。非常に限られたシステムでテストしたりメモリを解放したりする場合には時折役立ちますが、キャッシュによるパフォーマンス向上効果も失われるため、日常的に使用すべきではありません。

高度な制御ツール: cgroup v2、memory.pressure、およびユーザー空間でのOOM

systemdとcgroup v2を使用する最新のシステムでは、プロセスグループによってメモリ管理を細かく調整できます。cgroup v2はタスクを階層構造に整理し、個々のプロセスレベルだけでなく、グループレベルでリソース制限と優先順位(CPU、メモリ、I/O)を適用します。

メモリ階層内では、次のようなパラメータがあります。 memory.low これらを使用することで、特定のcgroupのメモリをグローバルな負荷からより保護する一方で、RAMを解放する必要がある場合は、他のcgroupのメモリをより柔軟に利用できるように指定できます。

ファイル memory.pressure これは非常に有用な指標を公開します。そのcgroup内のタスクがメモリ不足のためにブロックされた時間が、10秒、60秒、300秒間隔で表示されます。 一部 これは、少なくとも1つのタスクが遅延しているかどうかを示し、 全体像を これは、グループ全体の業務が同時に影響を受けた瞬間を反映している。

カーネルのOOMキラーに加えて、次のようなユーザー空間ソリューションも登場しています。 Earlyoom, ノハング o systemd-oomdEarlyOOMはRAMとスワップを監視し、それらが一定のしきい値を下回ると、積極的にプロセスを強制終了します。 oom_score より高い値に設定することで、機械がフリーズする前に使いやすさを回復させる。

NoHangはさらに一歩進んでおり、より多くの選択基準をサポートし、メモリ負荷を考慮に入れることができ、高度な構成ともうまく統合できますが、その開発には紆余曲折がありました。一方、systemd-oomdはsystemdおよびcgroup v2と直接統合されており、現在多くのディストリビューションで、メモリ不足の状況をよりインテリジェントかつきめ細かく管理するための推奨オプションとなっています。

最新のスワップ:zram、zswap、およびデバイスの優先順位

Linuxは、従来のディスクスワッピングに加えて、RAM圧縮と選択的なディスク使用を組み合わせることでパフォーマンスを大幅に向上させる最新のメカニズムを提供しています。

zramは、RAM自体にブロックデバイスを作成するカーネルモジュールであり、ページは圧縮された状態で格納されます。これらは通常、超高速スワップデバイスとして使用されます。圧縮と解凍にはCPUリソースが消費されますが、論理メモリ容量が増加し、ディスク使用量が大幅に削減されます。

多くのディストリビューションでは、インストールするだけで十分です zram-tools o zramジェネレーター そしてそのサービスを有効にします。たとえば、Debianでは、 sudo apt install zram-tools アクティベートします zramswap systemd を使用。AlmaLinux では、 sudo dnf install zram-generator およびそれに対応するサービス。

一方、zswapはディスクスワップの前に圧縮キャッシュとして機能します。まず、スワップされたページを圧縮RAMに格納しようとします。このキャッシュがいっぱいになった場合、またはページが非アクティブになった場合にのみ、実際のスワップ領域に書き込みます。これにより、ディスクI/Oが削減され、SSDの寿命が延びますが、CPU使用率が若干増加します。

  NTFS、exFAT、FAT32、APFS、HFS+、EXT4の完全な分析

複数のスワップ デバイス (zram とディスク ファイルなど) を組み合わせる場合、 優先順位。 ととも​​に swapon -p またはオプション pri= en /etc/fstab どのデバイスを優先的に使用するかを指定します。一般的には、zramに高い優先度(例えば100)を、ディスクスワップに低い優先度(10)を割り当てることで、カーネルがディスクにアクセスする前にRAM内の圧縮されたスワップ領域を最大限に活用できるようにします。

サーバーに適用されるメモリ管理:スワップ、サービス、およびセキュリティ

ウェブサーバー(Apache、Nginx)、データベース(MySQL、MariaDB、MongoDB)、あるいはリソースを大量に消費するアプリケーションにおいて、メモリは最も重要なリソースです。RAMとスワップ領域の設定は、システムが処理能力の低下に陥る前に同時に処理できるリクエスト数を直接的に決定します。

MongoDBのようなデータベースエンジンの場合、物理RAMがデータベースの要件を上回っていることが非常に重要です。そうでなければ、スワップ領域が使用され始め、RAMアクセスとディスクアクセスの大きな差によってパフォーマンスが著しく低下します。MySQL/MariaDBでも同様で、MySQLTunerなどのツールは利用可能なRAMに基づいてメモリパラメータを推奨します。

メモリの無駄遣いを避けるため、使用していないサービスを停止し、不要になったコンテナ、イメージ、Dockerボリュームをクリーンアップすることをお勧めします。開発環境やQA環境では、気づかないうちに数ギガバイトものRAMとディスク容量を消費する、忘れ去られたリソースが蓄積されてしまうことがよくあります。

セキュリティも重要な役割を果たします。 不要なポートが開いている それらは攻撃対象領域を拡大します。システムに侵入することに成功したマルウェアは、たとえば、CPUとメモリを消費するマイニングプロセスを起動し、タスクをスケジュールすることができます。 crontab そしてシステムをクラッシュさせる可能性があります。受信ポートと送信ポートをチェックし、不要なものをすべて閉じ、疑わしいcronジョブをクリーンアップすることは、メモリリソースを保護するための基本的なシステム管理の一部です。

メモリとファイルシステム:ext4、XFS、Btrfs、ジャーナリング

一見すると別の問題のように思えるかもしれませんが、ファイルシステムの選択とその構成も、メモリの動作やI/O負荷に影響を与えます。例えば、Ext4はジャーナル方式を採用していますが、負荷によってはディスクに余分な負荷がかかり、結果としてキャッシュ管理にも影響を及ぼします。

要求の厳しいサ​​ーバー環境では、多くの管理者がXFS、あるいはBtrfsを選択します。XFSは通常、大容量ファイルや高性能システムにおいて非常に優れたパフォーマンスを発揮します。Btrfsは、スナップショット、透過的圧縮、サブボリュームといった高度な機能を提供しますが、その分複雑さが増し、バージョンやディストリビューションによっては、あらゆるワークロードにおける成熟度について議論が続いています。

カーネルはファイルシステムの特性に合わせてキャッシュと書き込みポリシーを調整するため、ext4からXFSやBtrfsに切り替えると、生のI/Oだけでなく、RAMとページキャッシュが読み書き操作のバッファリングにどのように使用されるかにも影響します。

管理者向けの必須グラフィックツールとユーティリティ

ターミナルは依然としてあらゆる管理者にとって万能ツールですが、メモリやリソースの管理をはるかに容易にするツールも存在します。その一つがGlancesです。Glancesは、CPU、メモリ、ディスク、ネットワーク、プロセスなどを1つの画面にリアルタイムで表示するモニターで、オプションでWebインターフェースも用意されているため、ブラウザから複数のサーバーを監視できます。

Debianに素早くインストールするには、以下の手順に従ってください。 sudo apt install glancesGlances は非常によく補完します htop, vmstat y sarこれにより、負荷がかかった状態でのシステムの挙動をより視覚的に把握できます。

グラフィカルなサーバー管理の分野において、Cockpitはメモリ、プロセス、およびサービスを監視するためのユーザーフレンドリーなWebインターフェースを提供します。単一のコンソールから複数のサーバーを管理したり、systemdユニットの起動と停止、スワップとzramの使用状況の監視、およびログの確認をブラウザから離れることなく行うことができます。

デスクトップシステムでは、多くのディストリビューションが独自の資源モニターを統合していますが、GUIのない​​環境や軽量なものが必要な場合は、これらのコンソールツールとカスタムスクリプトを組み合わせることで、メモリの状況をいつでも詳細に把握できます。

Linuxにおける適切なメモリ管理には、カーネルがどのようにRAMを使用するか、swap、zram、zswapの役割、cgroup v2や各種OOMが負荷にどのように反応するか、そしてシステムを監視および微調整するためのツールを理解することが重要です。free 、vmstat、PSS、memory.pressureからzram、swappiness、systemd-oomdに至るまで、これらの要素をすべて組み合わせることで、「LinuxがRAMを消費しすぎる」という問題に悩まされることがなくなり、サーバー、デスクトップ、高負荷環境など、あらゆる役割においてハードウェアのパフォーマンスを最大限に引き出す、高度に調整された安定したシステムを構築できるようになります。

高度なRAMメモリ診断
関連記事:
高度なRAM診断:実際の障害を検出するための完全ガイド