ページフォールトが多発し、処理よりページ入れ替えに時間が取られて性能が急低下する現象。
スラッシングとは、ページフォールト(=アクセスしたページが主記憶に無く、補助記憶から読み込み直すこと)が頻発し、本来の処理よりページの入れ替えに時間を取られて、システム全体の性能(スループット)が急激に低下する現象のことです。
身近な例で考えると、小さな机で何冊もの本を同時に広げようとする状態に似ています。机(=主記憶)が狭いので、1冊出すたびに別の本を棚(=補助記憶)にしまわねばならず、本の出し入ればかりで肝心の作業がまったく進まなくなります。
上のツールで▶ボタンを押すと、多重度(同時実行プロセス数)を上げていくと当初CPU使用率は上がるものの、ある点から急落する様子を確認できます。
スラッシングは、必要なメモリの合計が、実際に使える物理メモリを超えてしまうときに発生します。具体的な条件は次の2つです。
・同時実行プロセスが多すぎる:多重度を上げすぎると、1つの主記憶を取り合うプロセスが増えすぎます
・フレームが必要量に足りない:各プロセスがすぐ使うページの集合(ワーキングセット=そのとき頻繁にアクセスするページのまとまり)に対し、割り当てられるフレーム(=主記憶上のページ1個分の枠)が不足します
どちらも要するに「メモリが足りないのに無理して多くのプロセスを走らせている」状態です。上のツールの「必要量 / 枠」の数値が枠を超えると、ページフォールトが急増します。
スラッシングは「やりすぎ」が原因なので、対策の基本は負荷を下げるか、メモリを増やすかです。代表的な対策は次のとおりです。
・多重度を下げる:一部のプロセスをスワップアウト(=まるごと補助記憶へ退避)し、残りに十分なフレームを回す
・物理メモリ増設:そもそも使える枠を増やす根本的な対策
・ワーキングセットモデル:各プロセスが今必要とするページ集合を見積もり、その分のフレームを確保する
・ページ置換アルゴリズムの改善:次に使うページを追い出さないよう、追い出すページの選び方を賢くする
上のツールの最終ステップで、多重度を下げると性能がピーク付近まで戻る様子を確認できます。やみくもにプロセスを増やすのではなく、メモリに見合った多重度に保つことが大切です。
スラッシングの核心は悪循環(負のスパイラル)です。一度はまると自然には抜け出せません。流れを順番に追ってみましょう。
・① 多重度を上げる:もっと多くのプロセス(=処理の実行単位)を同時に動かす
・② フレーム不足:各プロセスに割り当てられる主記憶の枠が減り、必要なページを置ききれなくなる
・③ ページフォールト多発:枠に収まらないページが頻繁に要求され、補助記憶への読み書きが激増する
・④ 入替作業に時間を取られる:補助記憶(SSDやHDDなど)へのアクセスは主記憶より何万倍も遅いため、入替だけで時間が消費される
・⑤ CPU使用率が急落:CPUは処理をしたくても、ページの到着待ちで手が空いてしまう
さらに悪いのは、OSが「CPU使用率が低い→もっとプロセスを増やそう」と判断してしまい、①に戻ってさらに悪化する点です。抜け出すには外から手を入れる(多重度を下げるか、メモリを増やす)必要があります。
ワーキングセットとは、あるプロセスが「直近の一定時間内」に参照したページのまとまりのことです。「今このプロセスが動くために最低限必要なページの集合」と考えると分かりやすいです。
なぜワーキングセットが重要か。スラッシングは「各プロセスのワーキングセットを全部合わせると、物理メモリ(全フレーム数)を超えてしまう」ときに起きます。逆に言えば、各プロセスのワーキングセット分のフレームを確保できている間は、スラッシングは起きません。
ワーキングセットモデル(=ワーキングセットを使った管理方式)では、次のルールでスラッシングを防ぎます。
・各プロセスのワーキングセットの大きさ(必要フレーム数)を常に監視する
・全プロセスの必要フレーム合計が物理フレーム総数を超えそうになったら、一部のプロセスをスワップアウト(補助記憶へ退避)して多重度を下げる
・こうして「残りのプロセスが各自のワーキングセットをフレームに収められる」状態を保つ