vm.overcommit_memoryはどのように機能しますか?


49

デフォルト設定を使用する場合:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

これらの値を/proc/meminfoファイルから読み取ることができます:

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

しかし、vm.overcommit_memoryから02変更すると、特にamarokのように、変更前に起動できるのと同じアプリケーションセットを起動できません。に変更vm.overcommit_ratioする必要300があったため、制限を増やすことができました。これで、amarockを起動すると/proc/meminfo、次のように表示されます。

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

このマシンにはRAMが1GiBしかありませんがvm.overcommit_memory、0に設定する2とamarok は問題なく動作します。しかし、設定する場合、amarokは2GiB以上のメモリを割り当てる必要があります。それは正常な動作ですか?もしそうなら、例えば、Firefox(amarokの4-6倍のメモリを消費する)が変更の前後で同じように機能する理由を説明できますか?

回答:


66

man 5 procまたはkernel.orgで)ドキュメントを見つけることができます:

/proc/sys/vm/overcommit_memory
       This file contains the kernel virtual memory accounting mode.
       Values are:

              0: heuristic overcommit (this is the default)
              1: always overcommit, never check
              2: always check, never overcommit

       In mode 0, calls of mmap(2) with MAP_NORESERVE are not
       checked, and the default check is very weak, leading to the
       risk of getting a process "OOM-killed".

       In mode 2 (available since Linux 2.6), the total virtual
       address space that can be allocated (CommitLimit in /proc/mem‐
       info) is calculated as

           CommitLimit = (total_RAM - total_huge_TLB) *
                         overcommit_ratio / 100 + total_swap

単純な答えは、オーバーコミットを1に設定すると、プログラムがmalloc()メモリのチャンクを割り当てるようなものを呼び出すときにステージが設定されることです(man 3 malloc)を求めました。

理解する基本的な概念は、仮想メモリの概念です。プログラムは、実際の物理メモリにマッピングされる場合とされない場合がある仮想アドレス空間を参照します。オーバーコミットチェックを無効にすることで、仮想空間をバックアップするために常に十分な物理メモリがあると仮定するようにOSに指示します。

これがときどき重要になる理由を強調するには、Redisのガイダンスで、なぜvm.overcommit_memory1に設定する必要があるかを見てください。


2
しかしCommitted_AS、両方のケースで値を同じにすべきではありませんか?
ミハイルモルフィコフ14年

@MikhailMorfikov:理論的にはそう信じていますが、誰がこれらのプログラムが何をしているのか知っています。Mallocを介してRAMのギグを言うだけの単純なプログラムで、より制御された環境を見たいと思うでしょう。そして、テスト間で再起動した後にテストを実行します。
カイルブラント14年

わかりましたので0、今のところ滞在します。
ミハイルモルフィコフ14年

2
@MikhailMorfikov:はい、実際には0が最も理にかなっていると思います。私の環境では、1を有効にしたのはRedisのみです。Redis は、fork()により使用しているメモリをより多く要求することを期待する処理を行います。それはそれは(あなたがもっと知りたい場合:2倍のメモリが使用されると想定している安全であると述べている子はほとんどすべて同じメモリページを使用しますが、Linuxは知らないredis.io/topics/faq
カイルをブラント14年

あなたの答えの最後の文は「オーバーコミットを有効にすることによって」のように始まってはいけませんか?1に設定すると、オーバーコミットするように要求することになるからですよね?
asgs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.