web-dev-qa-db-ja.com

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

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

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

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

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

しかし、vm.overcommit_memory0から2に変更すると、変更前に開始できたのと同じアプリケーションセット、特にamarokを開始できなくなります。 vm.overcommit_ratio300に変更する必要があったため、制限を増やすことができました。 amarokを起動すると、/proc/meminfoに次のように表示されます。

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

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

52

ドキュメントは _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
_

簡単な答えは、overcommitを1に設定すると、プログラムがmalloc()のようなものを呼び出してメモリのチャンク(_man 3 malloc_)を割り当てる場合、ステージが設定され、システムは、要求されているすべてのメモリがないことを認識しています。

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

なぜこれが重要なのかを強調するには、_vm.overcommit_memory_を1に設定する必要がある理由について Redisガイダンス をご覧ください。

72
Kyle Brandt

これは定評のある古い質問ですが、まだまだあります。

まず、vm.overcommit_memory = 0の場合、vm.overcommit_ratioの値は関係ありません。カーネルはヒューリスティックアルゴリズムを使用してメモリをオーバーコミットするため、amarokプロセスには、利用可能なメモリよりも多くのメモリを割り当てることができます。

vm.overcommit_memory2に設定すると、vm.overcommit_ratio値が適切になります。デフォルトでは、この値は50に設定されています。これは、システムがRAM(プラススワップ)の最大50%のみを割り当てることを意味します。これは、開始できない理由を説明します。 vm.overcommit_memory = 0で問題がなかったプログラム-割り当て可能なメモリが500MB未満であるため(スワップがない場合)。

300に設定すると、システムが最大300%のRAM(存在する場合はスワップ))を割り当てることができるようになります。これがCommitLimit/proc/meminfoの値が大きすぎます。

vm.overcommit_memory = 2は通常、オーバーコミットを防ぐために使用されますが、ここでは、オーバーコミットできる量の上限を設定するために使用しています。システムに300のメモリがないため、5171884 kBに設定するのは危険です。そのため、使用しているスワップスペースの量に応じて、システムはスワップ(低速)を使用するか、または完全にメモリ不足になります。

amarokvm.overcommit_memory = 2のときにより多くのメモリを使用する理由については、これはおそらくamarokがより多くのメモリで最適に機能するが、より少ないメモリでもうまく機能するためです。そのため、プログラムのロジックは最初に2 GBのメモリを割り当てようとする場合がありますが、失敗した場合は1 GBを試します。

3
d4nyll