overcommit_memory 및 overcommit_ratio

overcommit_memory 및 overcommit_ratio

이것은 내 현재 설정입니다.

vm.overcommit_ratio = 50 (default)
vm.overcommit_memory = 2

현재 메모리 사용량:

[localhost~]$ free -g
             total       used       free     shared    buffers     cached
Mem:            47         46          0          0          0         45
-/+ buffers/cache:          1         45
Swap:           47          0         47

~에 따르면문서내 이해는 다음과 같습니다

vm.overcommit_memory = 2RAM의 50%를 초과하는 메모리 오버커밋은 허용되지 않지만 (as vm.overcommit_ratio is 50), 현재 메모리 사용량은 47GB 중 46GB인 것을 볼 수 있습니다.

제가 뭔가 잘못 이해한 걸까요?

답변1

실제로 vm.overcommit_memory=2를 설정하면 과잉 커밋이 허용됩니다. overcommit_ratio를 (예를 들어) 200으로 설정하면 메모리를 스왑 + (RAM * 200/100) 범위로 커밋할 수 있습니다.

커널 문서는 약간 오해의 소지가 있습니다. "2"는 오버커밋하지 않음을 의미합니다. 이는 이 제한에 커밋하는 것을 의미하며, 이는 실제로 overcommit_ratio(실제로 백분율이므로 잘못된 이름임)가 100보다 큰 경우에 허용됩니다. .

vm.overcommit_memory는 오버커밋 제한을 설정하는 것으로 더 정확하게 설명됩니다.기본적으로과도한 사용은 허용되지 않습니다.

제출 제한을 확인할 수 있습니다.

    $free -m | awk '$1 ~/[Mm]em/ {print $2}' ; sysctl -a 2>/dev/null | grep vm.over  ; grep -i commitlimit /proc/meminfo


vm.overcommit_kbytes = 0
vm.overcommit_memory = 2
vm.overcommit_ratio = 800
CommitLimit:    23449596 kB

답변2

이러한 vm.overcommit_*설정은 사용자 공간 메모리 할당을 제어합니다. 커널이 할당할 수 있는 메모리에는 영향을 주지 않습니다. 또한 얻는 가치의 50%는 물리적 메모리 + 스왑 공간입니다. 47+47=94. 따라서 사용자 공간은 최대 47GB까지 할당할 수 있습니다.

출력 free에 따르면 1GB는 사용자 공간에서 사용되고 45GB는 커널에서 캐시용으로 사용됩니다. 1GB의 사용자 공간은 94GB의 50%에도 훨씬 못 미칩니다.


추가 수정:

vm.overcommit_memory = 2RAM의 50%를 초과하는 메모리 남용은 허용되지 않습니다.

이 설정은 과도한 사용을 허용하지 않습니다별말씀을요. 와 함께 사용하면 vm.overcommit_ratio=50사용자 공간이 총 메모리의 최대 50%까지 커밋할 수 있습니다. "커밋" != "오버커밋"

관련 정보