パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

swap割り当てルール、やっぱりRAMの2倍?」記事へのコメント

  • そもそも「スワップファイルは実メモリの2倍、約束な!」
    の根拠ってなんだったんでしたっけ?

    また、同様にWindows 98使ってたころは
    「Windowsのスワップファイルは実メモリの3倍、約束な!」
    っていわれた記憶もあります。

    なんかそれぞれのOSのページングのアルゴリズムに
    依拠した数字なんでしたっけ?
    --
    屍体メモ [windy.cx]
    • FreeBSDのオンラインマニュアルを見たときに「仮想記憶ページングのアルゴリズムがメインメモリ2倍以上あるときにうまく動くようにチューニングしてある」と書いてあり、それ以来2倍ですね。ほかのOSではチューニングの方向性が違うかも知れませんが。

      The kernel's VM paging algorithms are tuned to perform best when there is at least 2x swap versus main memory. Configuring too little swap can lead to inefficiencies in the VM page scanning code as well as create issues later on if you add more memory to your machine.
      (引用元: FreeBSD man page tuning(7) [freebsd.org])
      親コメント
    • おそらく、「2倍以上のスワップ領域を用意しても、それを活用するような事態はとてつもなく性能が悪化した事態だから考慮しなくてよし」ではないかと想像します。 つまり、OSのページングアルゴリズムではなく、プロセスのワーキングセットの大きさの特性からではないかと。

      僕が物心ついた頃、VAX11とか68020のSun3/4.2BSDあたり、だと、「スワップはメモリの3倍」と習いました。

      メモリは貴重で高価でした。 32ビットCPUが採用された初期ですら、主記憶は数100KBとかせいぜい4MB(それ以上ほしい人はオプションメモリを買ってね)が標準でしたから。 一方、CPUは遅かった。CPU速度vsHDD速度比は今より数ケタ小さかったので、ページングのダメージは相対的に小さかった。 プログラム全体をメモリに置けないとページングが発生しますが、メモリが高価だった昔は「ページングは頻度が低ければよし、つまりスラッシングにならなければよし」という価値観でした。

      たとえば、各プログラムの初期化ルーチンなどは、起動直後に利用された後はページアウトされても全体の性能悪化はごく少しです。 では、名目上のプロセスサイズのどれだけの部分が実メモリに乗っていれば、プログラムは調子よく(ページング動作による性能悪化が許せる程度で済む)走るかというと、1/3だと、OSの教科書に書いてあった(→ワーキングセット)と、記憶しているのですが元ネタの本を見つけだすことができません。

      さて、ここからが、推測です。 昔の仮想記憶の実装だと、プロセスイメージの1/3が実記憶に載っている状態でメモリを目いっぱい使いきるにはスワップは3倍必要です。 その後の、「実メモリ使用量+スワップ使用量=プロセスイメージサイズ」という仮想記憶だと、2倍になりますね。

      昔のUNIXはinetdなんてなくて、telnetd, ftpd, fingerd, talkd・・・とたくさんのサーバデーモンが起動されていました。何せメモリが足りないのでそれらdaemonは誰かに呼ばれるまでページアウトされているのが当然。というわけで、実際swapはたくさん使ってました。

      親コメント
    • by Anonymous Coward on 2008年10月04日 10時51分 (#1431726)
      昔NECが販売していたEWS-UXはRAMの容量に比例したswapを
      Disk上に確保しないと足りない分をRAMから確保するという
      本末転倒な仕様があって、必ず2倍は取るように言われてました。

      # うろおぼえなのでAC
      親コメント
      • これはNEC独自というよりもSVR2由来の全ての商用UNIXに当てはまります. そのためEWS-UXでもSVR4ベースになった中期以降のものでは物理メモリ+スワップがメモリ空間として認識されます.

        最後までこの古い仮想記憶システムを使っていた商用UNIXはHP-UXで, 例えばスワップが発生しないように主記憶を大量に積むと, その分のディスクが使いもしないスワップ領域に持っていかれることになります. 最近はどうなっているのか分かりませんが, 5~6年ぐらい前はディスクもそれなりに高価だったので, 非常に不評でした.

        親コメント
        • by Anonymous Coward
          > 最後までこの古い仮想記憶システムを使っていた商用UNIXはHP-UXで, 例えばスワップが
          > 発生しないように主記憶を大量に積むと, その分のディスクが使いもしないスワップ領域
          > に持っていかれることになります. 最近はどうなっているのか分かりませんが, 5~6年
          > ぐらい前はディスクもそれなりに高価だったので, 非常に不評でした.

          ちょっと記憶があいまいで申し訳ないのですが、99年だか2000年くらいに出たバージョンからは、
          擬似スワップがデフォルトになっていたので、SWAPは物理メモリの1/4だかそのくらいあればOK
          となっていました。
          もっともダンプ用の領域を(念のため)実メモリ程度確保したかったので、SWAPと兼用ということで
          結局実メモリと同じくらいのサイズにはしていましたね。
          その頃はメモリが4GBとかせいぜい8GBくらいのシステムが主流でしたので、ディスクが36GBとかなら
          それでも余り困ることは無かったと記憶しています。
      • by Anonymous Coward on 2008年10月04日 11時09分 (#1431735)
        >本末転倒な仕様

        それはもともとはHP-UXの仕様だから。
        それに昔のSolraisも同じような仕様だった記憶が。

        HP-UXはフルダンプした際にswapを利用するので最低実メモリより
        多く取らないといけないと教えられましたね。今では任意にダンプ先を
        指定できるのでそこまで気にしなくて良いと思いますけど。

        今となってはディスク容量も気にならないでしょうから、多少多めくらいで
        いいのではないかと個人的には考えています。
        親コメント
    • by Anonymous Coward
      >「Windowsのスワップファイルは実メモリの3倍、約束な!」

      system.ini
      [386Enh]
      PageOverCommit=4

      デフォルトでは、仮想記憶域が実メモリの4倍で予約されるので、予約した仮想記憶域が一杯になる前にスワップファイルの容量不足になることを防ぐためです。実メモリの3倍以上のスワップファイルを用意しても、PageOverCommitの値を変更しないと、余分な分は使用されないので、無駄です。

長期的な見通しやビジョンはあえて持たないようにしてる -- Linus Torvalds

処理中...