Swap 領域は、必ずしもメモリサイズの2倍ではない

昔から推奨される Swap 領域の目安として、メモリサイズの 2倍を割り当てておけば良いと教えられ、そう信じて今までサーバ業界で生きてきた私ですが、最近、調べ物中に必ずしもそうではないという情報を偶然見つけて凄いショックを受けました。

しかも、ストレージ用とシステム用の推奨値が異なるようです。

なぜ 2倍を割り当てるようになったかについて、改めて調べてみたところ、昔々の話で ページングが多発して実用に耐えない速度の目安が実メモリの2倍だから という説がありました。

Swap とは

本題に入る前に簡単に Swap について。

Swap とは、簡単に言うと物理メモリを使い切った場合に、物理メモリの代わりに使われる領域のことで、パーティション、またはファイルを使って作成できますが、推奨されるのは、パーティションです。

あくまでも保険として確保しておく領域なので、物理メモリの代用として使うという考え方は良くありません。

推奨される Swap 領域の目安 : ストレージ用

ここにありました。 推奨される Swap 領域の目安。

ストレージ用の Swap と OS システム用の推奨値があるようです。 まずは、ストレージが使う Swap 領域の目安から。

Swap 目安計算式Raw Code(S)Raw Code(T)
If Memory < 2
    Swap = Memory * 2
Else
    Swap = Memory + 2

RedHat によると

Swap は、物理 RAM サイズが 2 GB までは、物理 RAM の2倍として、2 GB を超えると、1物理 RAM ごとに同量を追加します。 ただし 32 MB を下回ることはできません。

式が出てくると余計に難しく感じるかもしれないですが、表にまとめると以下になります。

RAM の容量(GB)推奨 Swap 領域(GB)備考
12Mem * 2
24Mem + 2
35Mem + 2
46Mem + 2
57Mem + 2
・・・
3032Mem + 2
3133Mem + 2
3234Mem + 2
3333Mem * 1
3434Mem * 1
3535Mem * 1
・・・

推奨される Swap 領域の目安 : OS システム用

次は、OS のパーティションとして確保する Swap 領域の目安です。

Swap 領域は、OS インストール中に自動的に確定されますが、最適なパフォーマンスを出すためには、Swap サイズを手動で指定することをオススメすると記載があります。 (たまにリンク切れするでの、日本語・英語リンクを両方記載しておきます)

RAM の容量(GB)推奨 Swap 領域(GB)ハイバネートを許可する場合の推奨 Swap 領域(GB)
2GB 以下RAM * 2RAM * 3
2GB から 8GBRAM と同じRAM * 2
8GB から 64GB最低 4GBRAM * 1.5
64GB 以上最低 4GB推奨しない

ハイバネートとは

ハイバネートという言葉が出てきましたが、サスペンドには、3つの手法が存在します。

Suspend to RAM : 通称、サスペンド。 RAM を除いてマシンのほとんど全てのパーツの電源を切る。

Suspend to Disk : 通称、ハイバネート。 hybrid suspend (suspend to both) とも呼ばれる。 マシンの状態を Swap 領域に保存してから電源を完全にオフにする。 電源を入れた時、状態が復元される。

Suspend to Both : マシンの状態を Swap 領域に保存するが、マシンの電源は切らない。 その代わりに、Suspend to RAM (サスペンド) を呼出す。 これによって、バッテリーを使い切っても、システムを RAM から復帰することが可能。

あと、サスペンドは何も設定しなくても動作するはずですが、ハイバネーション機能を使うためには、GRUB にカーネルパラメータの設定が必要です。

参考 : archlinux : サスペンドとハイバネート

上記の表を見て、最初は、~以下~から という表現が非常に分かり辛いと思いましたが、RAM の容量が境界線上になる場合に (例えば、RAM が 2GB、8GB、64GB の場合に) Swap 領域を慎重に決めてくださいという風に記載されているので、表現としてはあってるなと思いました。

一応、Swap 領域の推奨値はあるものの、システムにリソース的に余裕があれば、Swap 領域は、多めに積んどいた方が良いそうです。

終わりに

サスペンドという機能は、よく耳にするし、知ってる方も多いと思いますが、ハイバネート という言葉が出てきたので、さらに調べたらサスペンドの一種でしたね。

最近は、仮想化も進んでいるので、仮想マシンを動かすまま、CPU・メモリ追加もオンラインで出来てしまう時代ですから、ハイパーバイザ用のサーバ以外に、単体物理サーバに大量にメモリ積むことはあまりないでしょうけど、Swap の目安値として参考にしていただければと思います。

ご参考までに。

以上、推奨される Swap 領域の目安 でした