こんにちは。
社内一のハードウェアオタク(自称)、のむしんです。
メモリのSWAP(スワップ)?という単語をご存じでしょうか。今どきのコンピュータは高性能化が進み、メモリも潤沢に搭載しているため一般的なパソコンの使い方でこれを意識することは殆どないかもしれません。
弊社業務のひとつであるサーバ監視においてはSWAP監視があり、SWAP消費量が多くなるとアラートが鳴るもんですから
「SWAPは悪!SWAP死すべし!!」
と考えているメンバーも居るかと思います。…え?いませんか??
しかしながらSWAPがどのように動作し、なぜこの仕組みが必要なのか理解している人は意外と少ないのではないでしょうか。
そこで今回はSWAPがどういうロジックで発生し、なぜ監視が必要なのか。SWAPが無かったらどうなるのかをざっくり解説します。
SWAPの具体的な設定などについては本記事では触れませんので悪しからず。
コンピュータ(パソコン、サーバー)の構造 ※超ざっくり
ものすごくざっくり説明すると、コンピュータを構成する主要なパーツとしては以下の3つが挙げられます。
・CPU
・メモリ(DRAM)【主記憶装置】
・ストレージ(SSD, HDDなど)【補助記憶装置】
CPUはご存じの通りコンピュータの頭脳、計算を司るパーツです。
メモリはCPUが計算を行うためにインプットするデータを一時的にためておく場所、ストレージはデータを永続的に保存しておく場所ですね(DRAMは電源を切ると保持しているデータが消えてしまいます)
ここで注意が必要なのは、『CPUはストレージ(補助記憶装置)には直接アクセスできない』ということです。
「いや、俺の書いたプログラムではディスク上のファイルを読み込んでるし!!」とお思いの方もいるかもしれませんが、この場合の動作はストレージ上のファイルを一旦メモリに展開してからCPUが処理するという流れになります。
もうひとつ。
メモリとストレージの大きな違いは「速度」です。
ストレージにHDDからSSDに交換したらびっくりするくらい動作が速くなった!という経験をしたことがある人も居るかと思います(今どきはHDDが搭載されたパソコンの方が少数ですが…)
それもそのはず。SSDはHDDに比べて圧倒的に高速です。
ではメモリ(DRAM)とSSDを比べたら…?
これはDRAMが圧倒的に高速です。桁が違います。
速度の基準はアクセスタイムとか転送速度とか基準が複数ありますが、いずれもDRAMが高速です。
細かいことを言うとCPUの内部にはこのDRAMよりも更に桁違いに高速なキャッシュメモリ(SRAM)が複数階層で搭載されているのですが、今回のお題からは外れるので一旦置いておきましょう。
本題のSWAPについて
コンピュータのざっくり構成は理解できましたか?
では本題のSWAPです。
SWAPという言葉の意味はご存じでしょうか。
Googleさんに聞いたら「交換」「取り換え」と出てきました。
じゃあSWAPが発生するということは何かと何かを取り換えている…???
まずSWAP領域とは何か。
簡単に言えば『ストレージ上に作られる「仮想的なメモリ領域」』です。
「仮想的なメモリ領域」とは言え、ストレージ上に作成されるためデータにアクセスする際の速度的にはストレージと同等で「メモリと比べると非常に遅い」です。
またこのSWAP領域はSWAPが発生した時に使用するために予約した領域になるため、他の操作でこの領域にファイルを書き込むことはできません。故に例えばSWAP領域を1GB確保すると、対象ストレージの空き容量は1GB減ります。
ではこのSWAP領域がいつ使われるのか。
それは『メモリが不足した時』です。
複数のプログラムを一度に実行したり、特定のプログラムが大容量のメモリを消費した場合など、『プログラムを動作させるために必要なデータをメモリに格納しきれない…!溢れる!!』という時です。
前述した通り『CPUはストレージ(補助記憶装置)には直接アクセスできない』ので、プログラムを動作させるために必要なデータは一旦全てメモリ上に持たせる必要があるのです。メモリから溢れちゃったらプログラムは正常に動作しません。メモリ不足でエラーになります。
しかしSWAPが有効になっており、かつ十分なSWAP領域(メモリから溢れてしまうデータを格納可能なサイズ)があれば動作します。
このカラクリは
1) CPUが必要なデータを得るためにメモリ上の利用頻度の低いデータを一旦SWAP領域(ストレージ)に書き込む
2) 1)の結果メモリ上に空いた領域にストレージ上からデータを読み込む
という処理により実現しています。
メモリとストレージの間でデータを交換(= SWAP!!)しているわけですね。
これによりコンピュータは見掛け上あたかもメモリ容量が増えたかのように処理を行う事ができます。
しかしながら当然トレードオフはあります。
何度も言いますがストレージは遅いのです。そこにメモリが不足するたび頻繁にデータの読み書きが発生すると…当然処理は遅くなります。ディスクI/Oも上昇します。
結果として『動くには動くけど、快適とは言い難い…』状況になってしまうわけですね。
でもエラーで止まってしまうよりはマシです。
SWAPが発生しているときに動作が遅くなるのは以上のような原理だからです。
故にSWAPの発生を放置してはいけませんが、そもそもSWAPが無ければ動かないものを動く状態にしてくれる便利な機能なのです。
そう、SWAPとは限られた家計の中で上手にやりくりする母の知恵だったんですよ…!
※ ちなみに上記はLinuxで説明していますが、WindowsにもSWAPに相当するものは「仮想メモリ」という名称で存在します。
↓これですね。
初期状態ではWindowsが搭載されているメモリのサイズから推奨値を算出して勝手に割り当ててくれているはずです。
結論
結論としては以下の通りです。
- SWAPがガンガン発生するとシステムの動作がとっても重くなる
- けれどSWAPを設定していないと、そもそもメモリ不足でプログラムが起動できくなるケースがある
- Linuxが動作するためのメモリまで不足してしまうとOOM Killerが発生する可能性がある
以上を踏まえて、
- システムのメモリ消費量に対して適切なSWAP領域のサイズを設定する必要がある
- 常にSWAP領域を消費しているようなシステムはそもそもメモリサイズの拡張を検討すべき
- 無尽蔵にSWAP消費が拡大していく場合は、プログラムの不具合(メモリリークなど)や設定の不備の可能性があるため調査が必要
といったことが言えるかと思います。
安定したシステムを構築するためにSWAPを適切に設定しましょう!
最後まで読んで下さりありがとうございます。
近年はハードウェアが高性能になり、かつソフトウェア側もメモリを効率よく扱う仕組みが導入されてきたこともあり、SWAPを意識するようなことは少なくなったかもしれません。
ただ現在でも各OSに備わっている重要な機能であることには変わりありません。
本記事ではざっくりとしか説明していませんが、気になった方はぜひ深掘りして調べてみてくださいね。