Scribble at 2022-04-21 12:22:35 Last modified: 2022-04-21 15:33:14

スワップは主に回収の平等さのための機構であり、緊急事態の際の「追加のメモリ」ではないのです。スワップがあなたのアプリケーションを遅くする正体ではありません。全体的なメモリ争奪の状態に入ることがあなたのアプリケーションを遅くする正体なのです。

スワップの弁護:よくある誤解を解く

systemd のメインテイナー(日本ではなぜか「メンテナー」と省略されるが、こんなのはアメリカでは通じない)としても知られる meta (Facebook) の Linux エンジニアであるクリス・ダウンが書いた文章を、さくらインターネットのエンジニアである Hiroaki Nakamura 氏が翻訳されている。

「スワップ」と言うと、Windows の平均的なユーザには何のことかまるで分らないだろうし、LPIC-1 ていどの技術者にも、Linux ディストリビューションをインストールするときにストレージでいくらかの領域を確保する仮想メモリだというていどの認識しかない筈だ。しかし、記事によれば緊急避難的にメモリ領域を保全するといった役割でスワップを使うことは話の本質ではないし、しかもそういう用途でのスワップは悪影響を及ぼすという。では、悪影響を及ぼす用途がありながらもスワップを維持しなくてはいけない(あるいは維持する方が望ましい)という理由はなんだろうか。

これは IT パスポートのレベルの話だが、OS とりわけカーネルの役割として、デバイス制御やプロセス管理などとともに記憶管理(主記憶、キャッシュ、二次記憶など)がある。何らかのタイミングで主記憶上に展開されているプログラムの動作が停止すると、主記憶の容量は決まっているので、他の用途でも使うためには停止しているプログラムを二次記憶へと一時的に退避させておけば、主記憶を有効に活用できる。そのために二次記憶へプログラムを移したり、あるいは必要に応じて主記憶へプログラムを戻すことを、スワッピングと呼んでいる。このスワッピングという手法は、記憶容量の効率的な運用を目的としているわけだが、二次記憶として使うストレージの頻繁な読み書きが発生するため、特に SSD のように読み書きの回数制限があるストレージでは寿命を減らすと指摘されているし、プログラムを退避する必要がない運用状況であれば、いたずらに主記憶よりも遅い仮想記憶へとプログラムを退避したり読み戻すという処理が加わるため、コンピュータのパフォーマンスが低下するとも言われる。また、Windows のヘビー・ユーザなら誰でも知っていることだが、Windows のページング(厳密には異なる意味があるようだが、おおむねスワッピングと同じ機能である)は何も設定しなければ Windows が二次記憶の領域を勝手に可変で設定するため、Windows ではお馴染みの「断片化(フラグメンテーション)」というデータの乱雑化が起きて OS のパフォーマンスが低下するとされているため、二次記憶(仮想メモリ)の容量の最大・最小サイズを同じ値に設定してサイズを固定することが望ましいと言われる。

まず最初に注意しておくと、ページングの設定で二次記憶の容量を固定するという手法は、はっきり言えば時代遅れである。これは用途が限られていて、しかもメモリの容量が少なかった時代の話であり、僕のように Photoshop や InDesign を使ったメディア編集で一時的に多くのメモリを使うような用途が発生する場合には、仮想メモリとして予約される容量(コミット)はあらかじめ分からないほど大きくなるため、不適切な容量に最初から固定しているとコミットできなくなり、逆にアプリケーションのパフォーマンスに悪影響が出るからだ。しかも、この手のメディア編集ツールではアプリケーションの設定としてメモリの何パーセントを使うといった別の設定まであるのだから、なおさらページングの容量は可変にしておく方がよい。

では、このスワッピングそのものが必要だというクリスの「弁護」についてはどうなのか。現在、スワッピングという管理手法に批判的な人の多くは、その理由として「スワップする必要などないくらい、いまのコンピュータはメモリをたくさん積んでいる」と言ったりする。しかし、これはスワッピングについての誤解にもとづいているとクリスは言う。彼が2020年に Arch Conf で発表している動画や(開始から12分頃より本題に入っている)、上記の記事を読めばわかるように、モダンな Linux(とモダンな用途)におけるスワッピングの主な役割は、コンピュータがクラッシュした時の処理内容をバックアップすることなどではないし、メモリがどれほど多くなっても、スワッピングの第一の役割であるメモリ管理の最適化は常に必要なのである。

これは、SunOS や UNIX から Linux のコミュニティに参加するようになった人々も違和感を覚えるらしいが、特に Linux の標準的なレベルの管理者がスワップ領域の確保を拒むという。そして、その理由の多くはスワッピングについての正確な理解が欠けていることと、得てしてメモリが少ない時代に「仮想メモリ」としての役割だけを説明されたまま、コンピュータ・サイエンスとしての正確な知識を学ばずに過ごしてきたことに起因するのだろう。少なくともオペレーティング・システムの標準的な教科書を開きさえすれば、記憶管理としてのスワッピングやページングが処理内容の緊急バックアップや実記憶の単なる物理的な拡張ではないことくらい常識なのである。

  1. もっと新しいノート <<
  2. >> もっと古いノート

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Twitter Facebook