パスワードを忘れた? アカウント作成
36696 story
OS

swap割り当てルール、やっぱりRAMの2倍? 87

ストーリー by hayakawa
個人的にはスワップなしで構築することが多くなってきましたが 部門より

あるAnonymous Coward 曰く、

本家「How Big Should My Swap Partition Be?」より

過去10年、自分より知識のある人たちに「swapにはどれだけ割り当てればいい?」と聞くと、皆同様に「RAMの2倍に設定しておいて、あとは考えなくていいよ」と答えてくれた。確かに昔は深く考えるようなことでもなかったように思う。RAMが128MBならswapは256MBにしておけばよかった。でもいま自分のノートPCに載っている4GBのRAMを考えると、8GBのswapって本当に必要?と考えてしまう。

デスクトップのswapには本当はどれ位割り当てるのがいいのだろうか?「RAMの2倍」ルールは今も当てはまるだろうか?このルール、これからもずっと有効なのだろうか?
SWAPに8GB割り当てるのに全く問題がないHD容量があればいいが、例えばUMPCのようにメモリ容量に対するHD容量があまり大きくないような場合はどのようにすればいいのだろうか?またHDではなく、SSDしかないような場合はどうだろう?/.Jの皆様のswap割り当てルールはやっぱり「RAMの2倍」でしょうか?
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by manmos (29892) on 2008年10月02日 19時44分 (#1430710) 日記
    Machのようにどんどんswapfileを大きくしていく奴は別として、どうせ、swapサイズと実メモリ
    を足した分以上にメモリを使いたければswaponするしかないわけで、自分が使うであろうサイズ
    の実メモリを載せて、swapは申し訳程度でよいです。

    swapは実メモリの2倍ってのはsunos 4以前のsunosは実メモリ以下のswapだと動作しなかった時
    代の制限。

    数GByteのswapをバリバリ使うようだと、快適な動作は望めませんよね。
    • by Anonymous Coward on 2008年10月04日 9時53分 (#1431701)
      確かに。

      特にサーバはswapしだすと負荷分散バランスが急に崩れたりしてサービス品質が
      悪くなったりするので、最大に負荷がかかったときもswapしないよう搭載メモリの
      見積もりやアプリのチューニングの見積もりを行うのが一番良かったりしますね。

      直接必要ないけどメモリリークの発見が楽なので申し訳程度に設定するくらいです。
      親コメント
  • by 335 (4199) on 2008年10月04日 8時28分 (#1431658) 日記
    ハードディスクがいっぱいになったときに必要になるから。
  • by meta (7332) <{meta} {at} {vmeta.jp}> on 2008年10月04日 8時40分 (#1431666) 日記
    物理メモリと同容量〜2倍は確保するようにしてます。
    ハイバネーションで使用するので。
    --
    I'm not right, but I'm right.
    • by Funayoi (3170) on 2008年10月04日 10時32分 (#1431717)
      Linuxではハイバネートするときのメモリの待避先がswapなんですよね。
      私が以前メモリを増設したときにスワップパーティションはそのままで使っていたら、ハイバネートに失敗して困ったことがありました。
      メモリの使用量がスワップパーティションの容量を超えないようにプログラムを終了したらちゃんとハイバネートできたのですが、いちいちウインドウを閉じていてはハイバネートの意味無いような…。

      というわけで、昔とは理由は違えど、今でも実メモリより多く確保しておいた方がいいと思いました。
      親コメント
      • by Anonymous Coward on 2008年10月04日 13時26分 (#1431821)
        >Linuxではハイバネートするときのメモリの待避先がswap
        ですが、専用パーティション必須というわけでもなかったりして。
        試験運用中なLinux備忘録 [hatena.ne.jp]さんの記事になってますけど、スワップ「ファイル」にハイバネートするようにも出来ます。
        とはいえ、ちょっと手間がかかるので、私は普通にパーティション切ってます。
        容量は実メモリの1.5倍程度ですね。

        >ハイバネートに失敗して困った
        同じように、メモリ増設後にハイバネ失敗したときは、ライブCD(確かUbuntuかKnoppix)で立ち上げてパーティションエディタ(gpartedかqtparted)でスワップ領域を拡張しました。
        親コメント
    • Linuxはハイバネートをswapにとりますね。

      MacOS Xはハイバネート用に実メモリと同サイズのファイルが作成されていて、それが使用されます。

      まあMacOS Xはswapをパーティションではとらないので、関係のない話かもしれませんね。
      親コメント
  • そういうわけで、1Gのメモリを乗っけたWindowsXPマシンを利用していますが、
    スワップをゼロにしてかれこれ四年ほど運用してますが、
    ゲームにしろ、VisualStudioにしろ落ちた覚えが無いですね。
    先日、Sporeで落ちたこと以外は・・・。

    スワップを有効にしていると、実メモリが足りているのに、
    勝手にスワッピングするので、そちらのほうが重かったりします。
    なので、いい加減にPCごと買い換えることを検討しています。
    • by Anonymous Coward on 2008年10月04日 13時26分 (#1431823)
      > スワップを有効にしていると、実メモリが足りているのに、
      > 勝手にスワッピングするので、そちらのほうが重かったりします。

      それはXPだからです。Vistaからは、メモリに余裕があればスワッピングしないので
      大容量のメモリを本当の意味で効率よく使えます。
      具体的な例では、XPでアプリケーションを最小化すると、
      空きメモリに関係なくスワップされてしまい、ウィンドウを復帰したときに
      ハングアップに等しいディスクアクセスに見舞われることがあります。
      Vistaではこの種の現象を見ることはなくなりました。
      親コメント
    • by Anonymous Coward on 2008年10月04日 11時08分 (#1431734)

      スワップを有効にしていると、実メモリが足りているのに、
      勝手にスワッピングするので、そちらのほうが重かったりします。

      それは、Windows だから。
      他にもそういう OS があるかもしれないが、少なくとも FreeBSD では十分な実メモリがあるのにスワップしたりしないよ。
      どちらが良いのかは、使い方によるんだろうけど。

      # 今 FreeBSD 7.0 で試したら、空きが10%を切ってもスワップしなかった。

      スワップをゼロにしてかれこれ四年ほど運用してますが、
      昔の Windows(2000?)は完全にゼロにすることはできなかったと思うけど、XP ではできるの?
      親コメント
      • by Anonymous Coward on 2008年10月04日 11時44分 (#1431757)
        >完全にゼロにすることはできなかったと思うけど、XP ではできるの?

        出来ます。してます。
        少なくともOS提供のコンパネで、なしを指定できます。裏で何やってるかはともかくとして。
        物理メモリは2G。

        用途によるんでしょうけど、
        TV録画だのFirefoxだのOracleXE+Ruby+Eclipseだのごた混ぜに使ってる行儀悪い当方の環境で、
        やばくなったことは無いです。

        というかメモリ使用量のメーターを日常的に見てて「あーこれ立ち上げたら足りなくなりそうだなーこっち落とすかー」とか手動でやってます。本末転倒?

        あと職場PC(自分の)は何故かHDDだけ古い奴で、
        サイズは小さいわ、速度は遅いわなので、
        これも(たまたま余ってたので)メモリ2G積んで、SwapはOFFにしてます。
        SwapOFFだと時折(アプリ起動時とか)しか重くならないけど、ONだとほぼ常時重いです。
        親コメント
      • Windows2000でもSwapOffにできるけど、それをやると何故か動かないソフトが多発。
        結局SwapOnしました。

        Swapがある前提で組まれたコードがOSの一部にあるんだろうと思ってあきらめたけど、
        迷惑なOSだこと。

        #でもいまだに使ってる
        親コメント
  • ディスク上のスペース的には8Gbyte確保しています。

    64bitマシンなのに1Gbyteしかメモリがありません(会社がけちすぎるんです)。そんな環境でWiresharkで1Gbyte以上ある pcap ファイルパケット解析をする、なんて事になったらswap領域は必須です。

    『swap領域』自体はディスク上に確保しても、無駄率はたかが知れています。500Gの中の8Gなんざ2%にもならない。なので、64bitマシンが持つ「仮想アドレス空間の広さ」を目一杯使えるようにデザインするのが一番よい、と考えました。

    .

    32bitマシンの場合はAtomのチップセット以外4Gbyte以上搭載できて当たり前の状態です。この場合はマシンの仮想空間の大半は物理メモリで埋め尽くす事ができる。ならば、予算とチップセットのどちらかの限界ぎりぎりまでメモリを搭載し、swapの必要がない事が判ったらswap offで運用でも構わないと思います。緊急時用のswap領域はメインメモリの1.2倍もあれば十分でしょう。この領域は普段は使わない。緊急時にいちいちディスク領域の確保から開始する手間を省くための領域です。

    .

    こう考えると、「メモリの何倍」ではなく「全部で何バイトの記憶領域が必要なのか」で計算した方が良い/計算できる時代になったのではないか、と思います。
    --
    fjの教祖様
    • 引用が前後しますが、

      > こう考えると、「メモリの何倍」ではなく「全部で何バイトの記憶領域が必要なのか」で計算した方が良い/計算できる時代になったのではないか、と思います。

      この意見に大賛成ですが、

      > swapの必要がない事が判ったらswap offで運用

      は逆ですね。緊急時にswapon。まあ、この感覚はMachを使用していることが多かったからでしょうね。
      で、可能な限りの実メモリ。最近の1cpuのマザーなら、8Gbyte載って、メモリ代が高くて2万円以下。
      ノートでも4Gbyte。ちょっと悲しいのが、4Gbyteしか載せてないと、その下のVMwareに1.5Gbyteしかあげられないことかなぁ。

      合言葉は「メモリ長者でいこう」ですよ。

      > なので、64bitマシンが持つ「仮想アドレス空間の広さ」を目一杯使える

      のはmmapでディスク上のファイルをバシバシmapすると感じられます。これなら、実メモリやswapがなくとも感じられる。まあ、実メモリがないと快適とは程遠くなりますが。
      親コメント
      • 最近の1cpuのマザーなら、8Gbyte載って、メモリ代が高くて2万円以下。

        ふ…メモリがどんなに安くても、「固定費にならないように」という足かせが邪魔をするのですよ。特に液晶モニターとセットで買わないといけない場合とか。予算がそもそも足りていない場合とか。

        なので、

        > swapの必要がない事が判ったらswap offで運用

        は逆ですね。緊急時にswapon。

        「貧乏だと四六時中緊急時」。

        (T.T)(T.T)(T.T)(T.T)(T.T)(T.T)(T.T)
        --
        fjの教祖様
        親コメント
  • やはり使い道によるところが大きいと思います。

    最近のPCには2GB程度メモリを積んでますので、個人用PCの場合はインストーラが
    要求する量のswapパーティションを作っています。インストーラが512MBを要求することが多いですかね(単なる感覚です)。
    インストーラが要求しなければ0でもいいです。Out of Memoryになることも無いですし。

    フロントのWebサーバとかでもそれで十分だったりします。壊れたらロードバランサから
    切り離せば良いですし。

    APやDBなどの重要な業務用の場合は(Solarisですが)念のため大きめに作っています。
    ただ、coreadmでcoreの出力先が変えられるので昔みたいに実メモリの3倍もとることは
    無くなりましたね。どれだけとるかは業務次第です。
  • たしか (スコア:2, 興味深い)

    by CowardDuck (25674) on 2008年10月04日 9時33分 (#1431693)
    むかしの UNIX の実装にはカーネルのコアダンプを一旦、swap 領域に作成する
    ものがあったからじゃなかったっけ。

    したがってコアダンプをとるためにはその時点で最低、実メモリと同じ大きさの
    swap 領域の空きが必要。

    このため swap の大きさは コアダンプ用の大きさ + 本当に仮想メモリに使う大きさ で
    結局、実メモリの2倍くらいにするという話だったと思う。

    いまどきの UNIX の眷属では「swap 実メモリの2倍」という根拠はないはず。
    • by jsi (25633) on 2008年10月05日 2時10分 (#1432083)
      Windows ではコアダンプ採取のため、実メモリ+α のページファイル容量が必要です。

      Windows Server 2003、Windows XP、および Windows 2000 のメモリ ダンプ ファイル オプションの概要 [microsoft.com]

      完全メモリ ダンプは、コンピュータが予期せず停止したときに、システム メモリの内容をすべて記録します。"完全メモリ ダンプ" オプションを選択する場合、物理 RAM 全体に 1 MB を加えたサイズのページング ファイルを保持できるだけの領域がブート ボリュームに必要です。

      親コメント
  • by Anonymous Coward on 2008年10月04日 10時52分 (#1431727)
    Red Hat (RHEL5) のインストールマニュアル [redhat.com]には

    Swap は 2 GB までの物理 RAM サイズまでは、その物理 RAM の二倍に等しい量にして、 2 GB 以上の物理 RAM では、その増加分と同等の量を追加します。しかし決して 32 MB 以下 であってはいけません。

    次のようになります:

    M = RAM の GB 数 として、S = swap の GB 数とすると、

    M < 2 ならば
    S = M *2
    その他
    S = M + 2

    この方式を使うと、2 GB の物理 RAM があるシステムには 4 GB の swap となり、3 GB の物理 RAM があるシステムには 5 GB の swap となります。大きな領域の swap パーティションを作成するとあとで RAM をアップグレードすることがある場合、特に役立ちます。

    かなり規模の大きい RAM (32 GB 以上)があるシステムの場合、小さめの swap パーティションでも構いません(物理 RAM x1 、またはそれ以下くらい)。
    となってますね。

    RHEL4のインストールマニュアル[PDF] (p.32-33) [redhat.com]では、

    Swap の大きさは、2GBの物理RAMまではx2 (2倍)に、2GBを越える容量分はx1 (1倍)にしてください。ただし、必ず32MB以上にします。
    この方式を使うと、2GBの物理RAMがあるシステムには4GBのswapとなり、3GBの物理RAMがあるシステムには5GBのswapとなります。大きな領域のswapパーティションを作成するとあとでRAMをアップグレードすることがある場合、特に役立ちます。
    となっています。
    私はこれを読んで、M > 2 ならば「 S = 2 * 2 + (M-2) * 1 」と解釈しましたが、日本語の説明文はRHEL4とRHEL5で同じ事を言ってるようにも思います。
    3GBの物理RAMの場合、どっちの式でも5になるので。。
  • by mer (347) on 2008年10月04日 11時04分 (#1431732) ホームページ
    メモリや HDD がこれだけ安くなると swap とかとらなくていいかなあ、小さくていいかなあと思ってたんですが。

    RAM 2GB + SWAP 2GB の構成で Linux x64 をインストールしたときに、初めて 64 bit CPU をゲットしたうれしくてですね。malloc で 4GB 確保しようとしてメモリ不足で失敗して。それ以来多めで確保しています。

    VM をたくさん起動して仕事するようになった今では、RAM 6GB + SWAP 16GB ですね。でも、RAM 容量を超えて VirtualBox の VM インスタンスを起動したらすごいことになったので、SWAP いっぱいあっても関係ないかもしれないです。

    余談ですが、OS が起動しなくなったときに、とりあえず SWAP パーティションをつぶして、そこにミニマムで Linux をインストールしてレスキューするなーんて話も聞いたような気がします。今じゃこの必要もないんでしょうけど。
  • スワップ領域を用意せず、実メモリーだけで動かそうとすると
    ちょっとメモリーを使いすぎただけで過敏に Out Of Memory Killer が働いてしまうから
    というのが理由じゃないかな?

    # 先日納品した 64GB のマシンに SAS 15krpm 72GB が2本しか入っていない...。
    --
    PCにECC Registeredメモリの利用を推奨します。
  • そもそも「スワップファイルは実メモリの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 on 2008年10月04日 11時09分 (#1431735)
        >本末転倒な仕様

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

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

        今となってはディスク容量も気にならないでしょうから、多少多めくらいで
        いいのではないかと個人的には考えています。
        親コメント
  • いまどきスワップ領域なんてわざわざ作らないしサイズは自動でしょう。
    たいていの用途でメモリ容量にもマシンパワーにも余裕があるし、
    わざわざパーティション切って固定サイズのスワップ作って、
    HDD別に用意するならともかく、たいしたパフォーマンスアップするでもないし。
    管理の手間が無駄なだけなんじゃ?
  • OSまかせ (スコア:1, 興味深い)

    by Anonymous Coward on 2008年10月04日 9時01分 (#1431679)
    昔は手動でRAMの2倍に固定してたもんですが、
    今ではそんなことやってたらDVDの1枚や2枚分のメモリがあっという間に飛んでいくので
    Windowsならば自動設定、Linuxならばインストーラのおすすめ設定に従っています。
  • ボトルネック (スコア:1, 参考になる)

    by Anonymous Coward on 2008年10月04日 13時57分 (#1431857)
    スワップの必要性はシステムの用途によって変わってきますが、プロセ
    ッサやメモリが飛躍的に高速になったのに比較して性能向上の緩やかな
    ハードディスクは多くの場合イマドキのPCの最大のボトルネックになっ
    ているため、快適なデスクトップPCとして使用するためには普段の使用
    でスワップが使われることがあってはいけません。

    しかしながらスワップが全くないと物理メモリを使い切ってしまった時、
    殆ど何の前触れもなくメモリ不足を理由にメモリ確保が失敗する、プロセ
    スがこけるといったことが起こります。最低限のスワップを用意しておく
    と本当にメモリとして使える領域がなくなってしまう前に劇的にパフォー
    マンスが低下し、ユーザに何かがメモリリークしているのではないか、と
    いったことを疑う時間的余地を与える手段として利用することが出来ます。

    これらのことからデスクトップPCとして利用するのであれば物理メモリ
    の容量に関わらず256MBあるいは512MBあたりを上限にすれば十分だと思
    います。

    ちなみに、少なくともLinux環境ではループバックデバイスをスワップに
    することが出来るので、性能を犠牲にしても膨大なメモリが必要な時だ
    けスワップを追加するのは大して面倒な作業ではありません。

    # ただ他のコメントで触れられている通り、Linuxのソフトウェアハ
    # イバネーションを使うような場合は少なくとも物理メモリと同じサ
    # イズのスワップが必要です。
  • 10gだったと思いますが、Oracleのインストール時にメモリと同量のスワップを求められた覚えがあります。 メモリあるから少なくていいやーと思っていたら、インストーラーが立ち上がらなかった記憶が……
    --
    ---- あやね @ angelic network
  • 私は実メモリ分しかSWAPを設けてません。 かつてはメモリの2,3倍設けてましたが、これだけ大容量メモリになると SWAPアウトすることは無いでしょうし、 SWAPアウトした時点で×なのではないでしょうか?
  • by Anonymous Coward on 2008年10月04日 8時58分 (#1431675)
    デスクトップはswapdで済ませてます。
    ノートはsuspend to diskしたいので大きめに切りますが・・・
typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...