여유 메모리 또는 여유 메모리가 Linux에서 OOM 킬러를 유발합니까?

여유 메모리 또는 여유 메모리가 Linux에서 OOM 킬러를 유발합니까?

저는 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분할 오류가 발생하지 않을 수 있습니다.

커널 메모리 회수 availablefree.

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하지만 메모리가 (거의) 가득 차면 둘 다 시스템 성능이 저하될 수 있습니다. 애플리케이션에서 메모리가 누출되지 않는지 확인하는 것이 가장 좋습니다.

관련 정보