메모리 부족
Out of memoryOut of Memory(OOM; 메모리 부족)는 프로그램이나 운영 체제에서 사용하기 위해 추가 메모리를 할당할 수 없는 컴퓨터 작동의 바람직하지 않은 상태입니다.이러한 시스템은 추가 프로그램을 로드할 수 없으며, 많은 프로그램이 실행 중에 추가 데이터를 메모리에 로드할 수 있기 때문에 이러한 프로그램은 제대로 작동하지 않습니다.이 문제는 일반적으로 디스크 스왑 공간을 포함하여 사용 가능한 모든 메모리가 할당되었기 때문에 발생합니다.
역사
지금까지 메모리 부족 상태는 현재보다 더 일반적이었습니다.이는 초기 프로세서가 대량의 메모리를 처리할 수 없을 뿐만 아니라 비용도 고려했기 때문에 초기 컴퓨터와 운영체제는 소량의 물리적 랜덤 액세스 메모리(RAM)에 한정되어 있었기 때문입니다.가상 메모리의 등장으로 스왑 공간을 사용할 수 있게 되었기 때문에 이 상태는 빈도가 낮아졌습니다.거의 모든 최신 프로그램은 실행 시 자유롭게 메모리를 할당 및 할당 해제할 수 있을 것으로 예상되며, 이러한 기대치가 충족되지 않을 경우 제어되지 않는 방식으로 장애가 발생하는 경향이 있습니다. 오래된 프로그램에서는 메모리를 한 번만 할당하고 모든 작업을 수행할 수 있는지 확인한 후 더 이상 할당되지 않을 것으로 예상합니다.따라서 즉시 장애가 발생하여 "메모리 부족" 오류 메시지가 표시되거나 [citation needed]예상대로 작동합니다.
MS-DOS와 같은 초기 운영 체제에서는 멀티태스킹이 지원되지 않았습니다.프로그램에는 필요에 따라 사용할 수 있는 물리적 메모리가 할당되었습니다.물리적 메모리는 종종 희소 리소스였고, Terminate and Stay Resident 기능 등의 애플리케이션으로 인해 소진되면 실행 중인 애플리케이션을 닫을 때까지 더 이상의 애플리케이션을 시작할 수 없었습니다.
최신 운영체제는 가상메모리를 제공합니다.가상메모리는 프로세스에는 메모리 범위가 주어지지만 실제 물리 RAM에 직접 대응하지 않습니다.가상 메모리는 물리 RAM, mmap(Unix 파생 모델) 또는 MapViewOfFile(Windows)을 통한 디스크 파일 또는 스왑 공간으로 백업할 수 있으며 운영체제는 필요에 따라 가상 메모리 페이지를 이동할 수 있습니다.가상 메모리는 물리 메모리에 의해 백업될 필요가 없기 때문에 이를 모두 사용하는 경우는 드물며 일반적으로 운영체제에 의해 자원 [citation needed]사용량에 대한 기타 제한이 있습니다.
Moore의 법칙에서 예측한 바와 같이, 모든 컴퓨터의 물리적 메모리의 양은 거의 기하급수적으로 증가했지만, 프로그램과 파일 자체의 크기가 커짐에 따라 어느 정도 상쇄되었습니다.경우에 따라 로드된 데이터의 대부분이 하드 디스크에 상주하는 가상 메모리가 지원되는 시스템에서 물리적 메모리가 부족하지만 가상 메모리가 부족하여 과도한 페이징이 발생할 수 있습니다.이 상태(스래싱)는 보통 일부 프로그램을 닫거나 시스템을 재부팅할 때까지 컴퓨터를 사용할 수 없게 됩니다.이러한 이유로 메모리 부족 메시지는 최신 [citation needed]컴퓨터를 사용하는 응용 프로그램에서 거의 발생하지 않습니다.
그러나 최신 컴퓨터에서는 OOM 상태가 발생할 수 있습니다.최신 컴퓨터의 일반적인 OOM 케이스는 잠재적인 백업 디바이스가 모두 채워졌거나 최종 사용자가 가상 메모리를 비활성화했기 때문에 운영 체제가 가상 메모리를 더 이상 생성할 수 없는 경우에 발생합니다.이 상태는 fork() 뒤에 copy-on-write가 있기 때문에 발생할 수 있습니다.
메모리 관리 부족
Linux 등의 운영체제 커널은 하나 이상의 프로세스([1]OOM Killer로 알려진 메커니즘)를 종료함으로써 이러한 유형의 OOM 상태에서 복구를 시도합니다.Linux 4.6(2016년 5월 출시)은 OOM 상황의 변화를 도입하여 검출과 신뢰성을 향상시켰으며,[2][3] 2018년 10월에 출시된 Linux 커널 4.19에 OOM 킬러에 대한 cgroup 인식이 구현되어 cgroup을 하나의 [4]유닛으로 소멸시킬 수 있는 기능이 추가되었다.
일부 Linux 시스템에서는 [5]OOM Killer가 늦게 활성화되기 때문에 너무 늦기 전에 OOM 상태에서 메모리를 복구하는 데 도움이 되는 데몬 및 커널 패치가 몇 개 있습니다.
earlyoom
[6]nohang
[7]- PSI(Pressure Stall Information) 커널 패치 및 그에 따른 패치
oomd
데몬, 패치는 Linux 커널 4.20에서 [8][9]병합됩니다.
프로세스별 메모리 제한
시스템 전체의 물리 메모리의 제한과는 별도로, 일부의 시스템에서는, 각 프로세스에서 사용할 수 있는 메모리의 양을 제한하고 있습니다.통상, 이러한 제한은, OS 의 주소 영역이 프로세스 레벨에서 사용 가능한 것보다 큰 경우에도 발생합니다.일부 하이엔드 32비트 시스템(Physical Address Extension이 유효한 시스템 등)에는 8기가바이트 이상의 시스템 메모리가 포함되어 있습니다.단, 32비트 플랫 메모리 모델에서는, 1개의 프로세스로 4GB 밖에 액세스 할 수 없습니다.
프로세스별 제한을 초과한 프로세스에서 추가 메모리를 할당하려고 하면 오류 상태가 발생합니다.예를 들어 메모리 할당을 위한 C 표준 함수입니다.malloc()
는 NULL을 반환하며 정상적으로 동작하는 어플리케이션이 이 상황을 처리해야 합니다.
레퍼런스
- ^ "How to Configure the Linux Out-of-Memory Killer". Retrieved 19 February 2015.
- ^ "Toward more predictable and reliable out-of-memory handling [LWN.net]". lwn.net.
- ^ "Linux_4.6 - Linux Kernel Newbies". kernelnewbies.org.
- ^ "Linux_4.19 - Linux Kernel Newbies". kernelnewbies.org.
- ^ "linux kernel - Is it possible to make the OOM killer intervent earlier?". Super User. Retrieved 7 March 2021.
- ^ rfjakob (7 March 2021), rfjakob/earlyoom, GitHub, retrieved 7 March 2021
- ^ Avramov, Alexey (5 March 2021), hakavlad/nohang, GitHub, retrieved 7 March 2021
- ^ "linux-psi.git - Linux resource pressure metrics". git.cmpxchg.org. Retrieved 7 March 2021.
- ^ facebookincubator/oomd, Facebook Incubator, 3 March 2021, retrieved 7 March 2021
외부 링크
- Linux OOM 킬러
- 메모리 부족 처리
- 기사: Greg Nakhimovsky의 "어플리케이션 서브프로세스를 작성하기 위한 메모리 사용량 최소화"
- Goldwyn Rodrigues의 기사 "OOM 킬러 길들이기"
- 기사: Mulyadi Santosa의 "Linux의 메모리가 부족할 때"
- 문서: John Boyland의 "메모리 부족 오류 처리"