デフォルト設定を使用する場合:
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
これらの値は/proc/meminfo
ファイルから読み取ることができます。
CommitLimit: 2609604 kB
Committed_AS: 1579976 kB
しかし、vm.overcommit_memory
を0
から2
に変更すると、変更前に開始できたのと同じアプリケーションセット、特にamarokを開始できなくなります。 vm.overcommit_ratio
を300
に変更する必要があったため、制限を増やすことができました。 amarokを起動すると、/proc/meminfo
に次のように表示されます。
CommitLimit: 5171884 kB
Committed_AS: 3929668 kB
このマシンのRAMは1GiBのみですが、vm.overcommit_memory
が0に設定されている場合、amarokは問題なく動作します。ただし、2
に設定した場合、amarokは2GiBを超えるメモリを割り当てる必要があります。これは正常な動作ですか?もしそうなら、たとえば、Firefox(これはamarokより4〜6倍多くのメモリを消費します)が変更の前後で同じように動作する理由を説明できますか?
ドキュメントは _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ガイダンス をご覧ください。
これは定評のある古い質問ですが、まだまだあります。
まず、vm.overcommit_memory = 0
の場合、vm.overcommit_ratio
の値は関係ありません。カーネルはヒューリスティックアルゴリズムを使用してメモリをオーバーコミットするため、amarok
プロセスには、利用可能なメモリよりも多くのメモリを割り当てることができます。
vm.overcommit_memory
を2
に設定すると、vm.overcommit_ratio
値が適切になります。デフォルトでは、この値は50
に設定されています。これは、システムがRAM(プラススワップ)の最大50%のみを割り当てることを意味します。これは、開始できない理由を説明します。 vm.overcommit_memory = 0
で問題がなかったプログラム-割り当て可能なメモリが500MB未満であるため(スワップがない場合)。
300
に設定すると、システムが最大300%のRAM(存在する場合はスワップ))を割り当てることができるようになります。これがCommitLimit
/proc/meminfo
の値が大きすぎます。
vm.overcommit_memory = 2
は通常、オーバーコミットを防ぐために使用されますが、ここでは、オーバーコミットできる量の上限を設定するために使用しています。システムに300
のメモリがないため、5171884 kB
に設定するのは危険です。そのため、使用しているスワップスペースの量に応じて、システムはスワップ(低速)を使用するか、または完全にメモリ不足になります。
amarok
がvm.overcommit_memory = 2
のときにより多くのメモリを使用する理由については、これはおそらくamarok
がより多くのメモリで最適に機能するが、より少ないメモリでもうまく機能するためです。そのため、プログラムのロジックは最初に2 GBのメモリを割り当てようとする場合がありますが、失敗した場合は1 GBを試します。