저는 SOC 플랫폼을 기반으로 임베디드 Linux 시스템을 개발 중입니다.
동일한 메모리 작업 부하를 실행하는 두 대의 컴퓨터가 있고 다음과 같은 메모리 출력을 얻습니다.
기계 1.
total used free shared buff/cache available
Mem: 50616 35304 2516 48 12796 13100
Swap: 0 0 0
기계 2.
total used free shared buff/cache available
Mem: 57328 45320 2856 56 9152 9572
Swap: 0 0 0
머신 1은 머신 2보다 메모리가 적지만 free
머신 1은 머신 2보다 메모리가 더 많습니다 available
. 이 경우 OOM Killer를 실행할 위험이 더 높은 시스템은 무엇입니까?
메모리 조정 제안 사항이 있습니까?
overcommit_memory 설정으로 업데이트됨(약간 벗어난 주제)
Fritz의 답변을 바탕으로 다른 시스템에서는 다른 변경 사항 없이 2 overcommit_memory
로 변경하여 초점을 맞췄습니다.
# cat /proc/sys/vm/overcommit_ratio
50
#
# free
total used free shared buff/cache available
Mem: 84244 25256 35196 92 23792 56772
Swap: 0 0 0
# echo 2 > /proc/sys/vm/overcommit_memory
#
# ls
-/bin/sh: can't fork: Cannot allocate memory
비율은 50이지만 cannot allocate memory
메모리 오버커밋이 비활성화된 경우를 나타냅니다.
echo 100 > /proc/sys/vm/overcommit_ratio
을 하더라도 여전히 echo 2 > /proc/sys/vm/overcommit_memory
오류가 발생하여 시스템을 재부팅해야 했습니다.
따라서 내 테스트에 따르면 메모리 오버커밋을 변경해도 pre-defined
분할 오류가 발생하지 않을 수 있습니다.
커널 메모리 회수 available
및 free
.
Linux 메모리 과잉 할당에 대해 논의하기 위해 또 다른 질문을 열 수 있습니다.
답변1
free
메모리는 완전히 사용되지 않으며 available
필요한 경우 커널에 의해 즉시 해제될 수 있습니다. 여기에는 디스크에서 읽는 것을 방지하고 시스템 속도를 높이기 위한 파일 시스템 캐시와 같은 기능이 포함되어 있습니다. 자세히 보시면 금액이 available
비슷하다는 것을 알 수 있습니다 buff/cache
.
그러므로 커널~해야 한다available
메모리가 모두 소모되지 않으면 OOM Killer가 호출되지 않습니다.
Andrew가 의견에서 지적했듯이 안전한 옵션은 다음과 같습니다.커널에서 메모리 과잉 할당 비활성화. 이렇게 하면 프로그램이 현재 사용 가능한 것보다 더 많은 메모리를 요청할 때 호출이 성공하는 대신 malloc
반환됩니다 . NULL
즉, 실제로 사용 가능한 것보다 더 많은 메모리가 할당되지 않으므로 OOM 킬러가 호출되지 않기를 바랍니다.
# Assuming swap is disabled because it is an embedded system:
echo 100 > /proc/sys/vm/overcommit_ratio # Commit max 100% of physical RAM (+ Swap, which is off)
echo 2 > /proc/sys/vm/overcommit_memory # Disable overcommit heuristics
그러나 이를 위해서는 (a) 프로그램이 사용하려는 것보다 더 많은 메모리를 요청하지 않고 (b) malloc
모든 호출의 반환 값을 확인하고 특정 작업을 수행해야 합니다.현명한그들이 돌아올 때 NULL
. 그렇지 않으면 OOM 킬러와 동일한 동작에 직면하게 됩니다(프로세스가 무작위로 종료됨). 이 경우에는 segfaults/null 역참조로 인해 발생합니다.
현재 직면하고 있는 특정 시나리오에 대한 정보가 없으면 조정에 대한 추가 제안을 제공하기가 어렵습니다. 그러나 오버커밋으로 인해 실제 메모리가 고갈되면 커널은 다음을 제외하고는 아무것도 할 수 없습니다.교환,프로세스를 죽인다, 또는당황하다. 활성화해 볼 수 있습니다zram
또는 zswap
(따라서 RAM으로 "교체") 또는 추가 swapfile
하지만 메모리가 (거의) 가득 차면 둘 다 시스템 성능이 저하될 수 있습니다. 애플리케이션에서 메모리가 누출되지 않는지 확인하는 것이 가장 좋습니다.