Linux를 다시 시작한 후 메모리가 부족합니다.

Linux를 다시 시작한 후 메모리가 부족합니다.

Intel(R) Atom(TM) CPU D525와 1GB RAM을 갖춘 서버가 있습니다. 서버가 약 7일마다 자동으로 종료되고 다시 시작되는 것으로 나타났습니다.

메모리 사용량을 확인해 보니 메모리 사용량이 90%에 도달하면 커널이 재부팅되는 것으로 나타났습니다. 커널 로그 /var/log/messages파일을 확인하면 커널 종료에 대한 정보는 없고 커널 시작에 대한 메시지만 찾을 수 있습니다. 파일을 확인해 보니 /proc/sys/vm/min_free_kbytes값이 "3765" 입니다.


사용 가능한 메모리가 매우 낮은 경우를 추측하지만 시스템이 메모리 회수를 시작하는 양은 아닙니다. 그러면 커널은 아무 작업도 수행할 수 없으므로 재부팅됩니다.

나에게 통찰력을 줄 수 있습니까?

답변1

일부 요청 페이징 가상 메모리 시스템에서 운영 체제는 익명 페이지(즉, 런타임 데이터, 프로그램 스택 등과 같이 파일 시스템 소스가 없는 데이터가 포함된 페이지)를 교환할 수 있는 충분한 스왑 공간이 없으면 할당을 거부합니다. 물리적 메모리를 해제하기 위한 페이지입니다. 이러한 엄격한 계산의 장점은 각 프로세스가 할당된 만큼의 가상 메모리에 대한 액세스를 보장한다는 것입니다. 그러나 이는 사용 가능한 가상 메모리의 양이 본질적으로 스왑 공간의 크기에 의해 제한된다는 의미이기도 합니다.

실제로 프로그램은 사용하는 것보다 더 많은 메모리를 할당하는 경우가 많습니다. 예를 들어, JVM(Java Virtual Machine)은 시작 시 대량의 가상 메모리를 할당하지만 즉시 사용하지는 않습니다. Linux 커널의 메모리 통계는 프로세스가 실제로 사용하는 메모리 양을 추적하여 이를 보상하려고 합니다.과도하게 커밋하다가상 메모리의 양. 즉, 커널이 할당한 가상 메모리의 양은 시스템의 실제 메모리와 스왑 공간을 합친 것보다 클 수 있습니다. 이를 통해 물리적 메모리와 스왑 공간을 더 잘 활용할 수 있지만, 사용된 메모리 양이 사용 가능한 물리적 메모리 및 스왑 공간의 양을 초과하는 경우 커널은 메모리 할당 약속을 충족하기 위해 어떻게든 메모리 리소스를 확보해야 한다는 단점이 있습니다.

재사용을 채우기 위해 메모리를 회수하는 커널 메커니즘을 호출합니다.메모리 부족 킬러(OOM 킬러). 일반적으로 이 메커니즘은 메모리를 많이 차지하는 "불량" 프로세스를 종료하여 다른 프로세스를 위해 메모리를 확보합니다. 그러나 sysctl 설정이 0이 아닌 경우 vm.panic_on_oom시스템 메모리가 부족할 때 커널에 패닉이 발생합니다.

이 설정에 가능한 값은 다음 vm.panic_on_oom과 같습니다.

  • 0(기본값) OOM-killer는 메모리 부족 상황이 발생하면 악성 프로세스를 종료합니다.

  • 1커널은 일반적으로 패닉 상태가 되지만, 프로세스가 사용되거나 mbind(MPOL_BIND)설정된 메모리 할당 한계에 도달하면 cpuset프로세스가 종료됩니다.

  • 2커널은 메모리가 부족할 때 항상 패닉 상태가 됩니다.

OOM-killer에서 사용하는 경험적 방법은 vm.oom_kill_allocating_tasksysctl 설정을 통해 수정할 수 있습니다. 가능한 값은 다음과 같습니다:

  • 0(기본값) OOM-killer는 작업 목록을 검사하고 메모리 집약적인 악성 작업을 선택하여 종료합니다.

  • 1(0이 아님) OOM-killer는 메모리 부족 상태를 유발하는 작업을 종료합니다.

커널 메모리 통계 알고리즘은 sysctl 설정을 사용하여 조정할 수 있습니다 vm.overcommit_memory. 가능한 값은 다음과 같습니다:

  • 0(기본값) 약한 검사를 통한 경험적 남용.

  • 1항상 지나친 약속을 하고 확인에 실패합니다.

  • 2vm.overcommit_ratio엄밀히 말하면 이 모드의 가상 주소 공간 제한은 다음 공식에 따라 설정된 값에 의해 결정됩니다.

    virtual memory = (swap + physical memory * (overcommit_ratio / 100))
    

엄격한 메모리 통계를 사용할 때 페이지를 저장할 수 있는 여유 물리적 메모리나 스왑 공간이 충분하지 않으면 커널은 더 이상 익명 페이지를 할당하지 않습니다. 이는 시스템이 다음을 수행해야 함을 의미합니다.충분한 스왑 공간이 구성되었습니다..

이 명령을 사용하여 런타임 시 sysctlsysctl 설정을 확인하거나 수정할 수 있습니다. 변경 사항을 영구적으로 적용하려면 /etc/sysctl.conf위 설정을 에 기록할 수도 있습니다./proc/sys/vm상호 작용. 해당 파일은 다음과 같습니다.

  • /proc/sys/vm/panic_on_oom

  • /proc/sys/vm/oom_kill_allocating_task

  • /proc/sys/vm/overcommit_memory

  • /proc/sys/vm/overcommit_ratio

답변2

  • 어떤 프로세스가 메모리를 많이 소모하는지 알아봐야 할 것 같아요. 어쩌면 프로그램에 메모리 누수 버그가 있을 수도 있습니다. 당신은 그것을 고쳐야합니다.
  • 메모리가 충분하지 않으면 Linux는 많은 메모리를 소비하는 일부 프로세스를 종료하거나 자체를 다시 시작합니다. 커널이 일부 메모리를 사용해야 하기 때문입니다.
  • 다양한 동작은 구성에 따라 결정됩니다. 하지만 메모리 누수 오류를 수정해야 한다고 생각합니다.

답변3

일부(커널?) 감시 장치가 시스템 중단을 감지하여 재부팅이 발생한 것 같습니다. 이와 같은 커널 .config옵션은 CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC시스템 정지가 감지되면 특정 시간 초과 후 재부팅을 유발할 수 있습니다.

실제 질문은 시스템이 왜 정지되는가입니다. 나는 이것이 다음과 같은 질문이라고 생각합니다.OOM 킬러가 제대로 작동하지 않아 OS가 정지됩니다.

관련 정보