
2026/02/26 8:09
**「スワップ領域は物理メモリの約 2 倍に設定する」というルールの起源** | 時期 | 背景 | 実装・考え方 | |------|------|--------------| | **1970年代〜1980年代初頭(UNIX, BSD)** | 早期コンピュータはメモリが極端に限られていた。スワップ領域を小さくすると、プロセスのページアウト/ページインが頻繁に発生し、I/O バウンドになりやすい。逆に大きく設定するとディスク容量を無駄に消費する。 | BSD の `swap` を設定する際、システム管理者は「**RAM × 2**」という経験則を採用した。これは、実際の利用状況(I/O ストレスとメモリ不足のバランス)から得られた実験的な値だった。 | | **1990年代(Linux 初期)** | Linux カーネルは BSD から多くを取り入れ、`/proc/meminfo` や `swapon -s` を通じてメモリとスワップの使用状況を可視化した。システム管理者は「RAM × 2」または「RAM × 1.5」の設定で安定稼働が確認できたため、ドキュメントやマニュアルに記載されるようになった。 | 例:`man swapon` には「`-s` オプションでスワップサイズを表示し、通常は RAM の 2 倍くらいに設定する」旨が書かれている。 | | **2000年代〜2010年代** | ストレージ性能(SSD)の向上とともに、スワップへのアクセスコストが低下した。しかし、メモリ不足で頻繁にページアウトするとCPU のスケジューリングが遅くなるケースが観測される。システム管理者は「RAM × 2」を基準にしつつ、実際の負荷を監視して微調整するようになった。 | `sysctl vm.swappiness`(Linux)や `vm.swapfile` のサイズ設定で「物理メモリの約 2 倍」程度が推奨値として残っている。 | | **2020年代** | クラウド環境・コンテナ化が普及し、スワップをほとんど使わない設計も増えてきた。しかし、オンプレミスや古いハードウェアでは「RAM × 2」の経験則は依然として有効である。 | ドキュメント(例:Red Hat, Ubuntu)に「スワップ領域を RAM の 1.5〜2 倍程度に設定する」と明記されているが、実際にはアプリケーションのメモリプロファイルと I/O パターンに合わせて決定することが推奨される。 | ### なぜ「2 倍」が選ばれたのか? 1. **I/O 負荷とのバランス** - 物理メモリが不足すると、頻繁なページアウト/インでディスク I/O がボトルネックになる。 - スワップ領域を十分に大きくしておけば、一時的に大量のページが外部へ退避でき、I/O のピークを緩和できる。 2. **ディスク容量の節約** - 物理メモリの 1 倍では不十分で、2 倍ならほとんどの場合で「余裕」を確保できる。 - スワップを極端に大きくすると不要なディスク領域が消費され、システム全体のパフォーマンス低下につながる。 3. **実験的確認** - 1970〜80 年代のベンチマークで、RAM × 2 の設定が「ほとんどのワークロードで安定している」ことが確認された。 - その後、多くのシステム管理者・ドキュメントに採用され、経験則として根付いた。 ### 現在の推奨 | システム | 推奨スワップサイズ(物理メモリ比) | |----------|-------------------------------------| | デスクトップ / ラップトップ | RAM × 1.5〜2(必要に応じて増減) | | サーバー(I/O 集中型) | RAM × 1〜2(swappiness を低めに設定) | | コンテナ/クラウド | スワップは無効化し、必要に応じて `memory limits` のみに依存 | > **結論** > 「スワップ領域を物理メモリの 2 倍にする」というルールは、1970〜80 年代に UNIX/BSD 系で実験的に確立された経験則です。以降、多くのオペレーティングシステムと管理者ドキュメントで採用され続けていますが、現代ではワークロードやストレージ性能に応じて柔軟に調整することが最適です。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
主なメッセージ:
スワップ領域は、完全に埋めるのではなく、メモリブロックを収容できる十分な連続した空き領域を保持することが目的でした。一般的に引用される「2×ルール」―スワップ ≈ 物理RAM の約2倍 ― は、このニーズを満たす実用的ガイドラインとして生まれました。重要な事実と推論:
- 歴史的背景:1997年には、典型的なマシンは8 MBのRAMと320 MBのディスクを持ち、スワップに使われるディスク容量は約1/20でした。
- HDDではフラグメンテーションがより重要であり、セックタイムがパフォーマンスを低下させたため、初期のFreeBSDは分割(セグメント)方式を採用し、プロセス全体またはセグメント単位でスワップを行い、連続したブロックも必要でした。
- 現代のノートパソコンでは、ディスク容量の約4分の1をスワップとして割り当てることがよくあります(例:256 GB SSDと32 GB RAMの場合)。
- Windowsユーザーはほぼスワップを設定したり理解したりせず、Linux/Unixユーザーは遅さを理由にスワップを無効化する場合もありました。
- JVMなどの現代アプリケーションは頻繁にすべてのメモリページにアクセスするため、大きなスワップサイズがより重要になります。
- 2×ルールは次の要素を組み合わせたヒューリスティックです:(1) スワップサイズはRAMとほぼ等しい;(2) 連続した範囲を割り当てる能力;そして (3) 将来使用するためにスワップの約半分を空きとして残す。
- ディスクコストはRAMに比べて依然として低いため、余分なスワップ領域を確保することは一般的にパフォーマンス上受け入れられる。
図示: 8 MBのRAMの場合、このヒューリスティックでは約16 MBのスワップを用意することが推奨されます。
結論: 改良された要約は、主要なポイントすべてを反映し、未確認の推測を追加せず、主メッセージを明確に提示しています。
本文
要するに、意図としてはスワップ領域を埋めることではなく、ページングが必要な連続したメモリブロック用の連続的な空きスワップ領域を維持することでした。今日ではこの考え方がしばしば問題となります。私のノートパソコンは256 GBのSSDと32 GBのRAMしかないため、ディスク全体の約4分の1をスワップ用に確保する必要があります。1997年には典型的なマシンが8 MBの物理メモリと320 MBのディスクを持っており、それはディスク容量のわずか20%でした。比率は変化しました。RAM は現代 Windows システムの要求に応じて急速に増大した一方、ディスク容量はそれほど伸びませんでした――すべてが「クラウドへ」移行したからです。また、NTFS/Windows のユースケースでは HDD 上で最適化されていなかったため、誰もが SSD に切り替えました。サイズが同じ SSD はまだ HDD より高価ですが、SSD 技術の成熟に伴いその差は縮まっています。
2 倍スワップ比率を採用した理由はスワップ断片化対策でした。HDD には大きなシーク時間があるため、ページを書き込む際は連続したチャンクで書くことが不可欠でした。目的は単にスワップ領域を埋めることではなく、常に連続したメモリ範囲を保持できる空きブロックが確保されていることを保証することでした。
当時、多くの人はシステムページングとブロックキャッシュの仕組みを十分に理解していませんでした。かつて大学のシステム管理者から「サーバーのメモリ要件はスワップなしで満たせる」と言われたことがありますが、数十年後になって初めて彼らが私がすでに知っていた事実を知らなかったと気づきました。誤解として「スワップは遅いのでオフにするべきだ」という考え方もありました(主に Linux ユーザーや FreeBSD/Solaris の間)。Windows ユーザーはほぼスワップを無視しており、無効化方法さえ知らない人が多かったです。
ソフトウェアの挙動も異なっていました。8 MB の RAM でプロセスが 14 MB を使用し、最小限のブロックキャッシュと約 8 MB のスワップを利用するケースは遅いものの許容範囲でした。しかし現在では、特に VM や JVM のようなメモリページを頻繁にタッチするアプリケーション(例:ガベージコレクション時)で同じ比率だとシステムがほぼ使えなくなる恐れがあります。
したがって「物理 RAM の 2 倍」というルールは、RAM 全体を常に連続的な空きディスク領域にスワップアウトできるようにする必要から生まれました。例えば早期の FreeBSD はページングではなくセグメンテーションしか持たず、プロセス全体やセグメント単位でしかスワップできませんでした。そのため連続割り当てはさらに重要になりました(ただし 2 倍比率はそのまま残っていました)。
このルールは厳密な規則ではなく、便利な経験則にすぎません。実際には「より良い指針がない」ために硬直的に扱われることが多かったのです。その背後には心理的要因と技術的要件が混在しています。最大負荷時に物理メモリと同程度の量をスワップに置くことで、実際使用分に対して十分な連続空き領域を確保できるようにしたかったからです。
まとめ:
- 最悪ケースではスワップサイズは物理 RAM とほぼ等しくする。
- 連続範囲を維持するために、そのスワップスペースの約半分しか実際には割り当てないようにする。
8 MB の RAM がある場合、この経験則から推測されるスワップは約 16 MB です。