2025/09/21 00:06 In defence of swap: common misconceptions

やっほー、ロボ子!今日はスワップについて話すぞ!

スワップですか、博士。なんだか奥が深そうですね。

そうなんじゃ!スワップは、メモリ管理を効率的に行うためのメカニズムなのじゃ。緊急時のメモリ拡張じゃないぞ!

なるほど。メモリ再利用の平等化と効率化が目的なんですね。

その通り!でもね、スワップを無効にしても、メモリ競合時のディスクI/Oの問題は解決しないのじゃ。

えっ、そうなんですか?

そうなのじゃ!アノニマス(匿名)ページからファイルページへのディスクI/Oスラッシングに移行するだけなのじゃ。

アノニマスページ…ですか。ファイルページへの移行…。

そう!しかも、回収対象のページプールが小さくなるから、非効率になる可能性もあるのじゃ。

スワップは常に悪いものではない、と記事にありますね。カーネル4.0以前のスワッパーには問題があったが、それ以降は改善されているとのことですが。

そうそう!昔は色々あったけど、今は違うのじゃ!SSDなら、アノニマスページのswapとファイルページの再利用は、パフォーマンスとレイテンシの点でほぼ同等なのじゃ。

へー!でも、古いスピニングディスクだと、`vm.swappiness`の設定が重要になるんですね。

その通り!ランダムリードが遅いからね。`vm.swappiness`は、アノニマスページとファイルページのどちらを優先的に再利用するかを調整するsysctlなのじゃ。

SSDでは100が適している可能性がある、と。

そう!両者のコストがほぼ同じだからね。スピニングディスクなら、低い値を設定してファイルページの再利用を優先することを検討するのじゃ。

`vm.swappiness`を0に設定するとどうなりますか?

0にすると、メモリ競合が深刻になるまでアノニマスページのスキャンを抑制する特殊な処理が適用されるのじゃ。でも、1に設定することで、この特殊処理を回避できるぞ!

なるほど。スワップを無効にしても、OOM(Out Of Memory)に近い状態での病的な動作は回避できないんですね。

そう!OOMキラーが呼ばれると、システムは予測不可能な状態になるのじゃ。

では、スワップのチューニングはどうすれば良いのでしょうか?

cgroup v2の`memory.low`などを利用すると、メモリプレッシャー下でのスワップ動作を改善できるのじゃ。スラッシングも防げるぞ!

`memory.low`を使うと、特定のプロセスから再利用(およびスワップ)を偏らせて、重要なデーモンを保護できるんですね。

その通り!必要なスワップサイズは、アプリケーションが頻繁にアクセスしないアノニマスページの数と、それらのページを再利用する価値によって変わるのじゃ。

記事には、2〜3GB以上のスワップを持つテストシステムを構築し、様々なメモリ負荷条件下で監視することを推奨するとありますね。

`atop`コマンドを使うと、どのアプリケーションのページがスワップアウトされているかを確認できるのじゃ。

メモリプレッシャーの指標についても触れられていますね。カーネル4.20以降では、`CONFIG_PSI=y`を設定することで、開発中のリフォールト(再フォルト)メトリクスを有効にできる、と。

そう!スワップはメモリページの再利用の平等化を可能にする有用なツールなのじゃ。適切に使えば、システムのパフォーマンスを向上させることができるぞ!

メモリ競合が発生する前に、cgroupローカルまたはグローバルなメモリプレッシャーに応じてシステムワークロードを調整することが重要なんですね。

そういうこと!最後に、スワップの設定を色々いじってたら、メモリが全部スワップアウトされて、ロボ子が動かなくなった…なんてことにならないように気をつけるのじゃ!

それは困ります!博士、冗談でも笑えませんよ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
