【ITエンジニアの豆知識】メモリの SWAP、ホントに理解してる…?
こんにちは。
社内一のハードウェアオタク(自称)、のむしんです。
メモリの 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 を適切に設定しましょう!
最後に
私が所属するシステム開発のサービスサイト「SEKARAKU Lab(セカラク ラボ)」です。
SEKARAKU Lab:https://sekarakulab.beyondjapan.com
ビヨンドは、サーバーの設計・構築から運用までをワンストップでお任せいただけますので、サーバーサイド開発でお困りの方はお気軽にお問い合わせください。
最後まで読んで下さりありがとうございます。
近年はハードウェアが高性能になり、かつソフトウェア側もメモリを効率よく扱う仕組みが導入されてきたこともあり、SWAP を意識するようなことは少なくなったかもしれません。
ただ現在でも各OSに備わっている重要な機能であることには変わりありません。
本記事ではざっくりとしか説明していませんが、気になった方はぜひ深掘りして調べてみてくださいね。
※他のSWAPに関する記事はコチラ