단일 프로그램에서 700 개 이상의 스레드를 시작했고 내 /proc/[PID]/status
파일은 다음 출력을 보여줍니다.
VmPeak: 7228104 kB
VmSize: 7228104 kB
VmLck: 0 kB
VmHWM: 3456 kB
VmRSS: 3456 kB
VmData: 7222340 kB
VmStk: 88 kB
VmExe: 4 kB
VmLib: 1540 kB
VmPTE: 2864 kB
StaBrk: 15e84000 kB
Brk: 15ec6000 kB
StaStk: 7fff765095a0 kB
Threads: 706
하지만 2GB RAM과 4GB 스왑 공간 만 있습니다. 누군가 가상 메모리가 7GB 이상이 된 방법을 말해 줄 수 있습니까?
일부 수요 페이징 가상 메모리 시스템에서 운영 체제는 페이지를 스왑 아웃 할 수있는 충분한 스왑 공간이없는 한 익명 페이지 (즉, 런타임 데이터, 프로그램 스택 등과 같은 파일 시스템 소스가없는 데이터를 포함하는 페이지) 할당을 거부합니다. 실제 메모리를 확보하십시오. 이 엄격한 계정은 각 프로세스가 할당 한만큼의 가상 메모리에 대한 액세스가 보장된다는 장점이 있지만, 사용 가능한 가상 메모리의 양이 기본적으로 스왑 공간의 크기에 의해 제한된다는 것을 의미합니다.
실제로 프로그램은 사용하는 것보다 더 많은 메모리를 할당하는 경향이 있습니다. 예를 들어 Java Virtual Machine은 시작시 많은 가상 메모리를 할당하지만 즉시 사용하지는 않습니다. Linux 커널의 메모리 계정은 프로세스에서 실제로 사용중인 메모리 양을 추적하여이를 보상하려고 시도하고 가상 메모리 양을 오버 커밋합니다. 즉, 커널에 의해 할당 된 가상 메모리의 양이 시스템에 결합 된 물리적 메모리 및 스왑 공간의 양을 초과 할 수 있습니다. 이로 인해 실제 메모리와 스왑 공간을 더 잘 활용할 수 있지만 단점은 사용중인 메모리 양이 실제 메모리 및 사용 가능한 스왑 공간을 초과하면 커널이 메모리 할당을 충족하기 위해 메모리 리소스를 해제해야한다는 것입니다. 헌신.
메모리를 회수하는 데 사용되는 커널 메커니즘을 OOM-killer ( 메모리 부족 킬러)라고합니다. 일반적으로 메커니즘은 다른 프로세스를 위해 메모리를 확보하기 위해 메모리를 많이 차지하는 "불량"프로세스를 제거하기 시작합니다. 일부 환경에서 메모리를 확보하고 시스템을 다시 작동시키는 실행 가능한 옵션은 재부팅하는 것입니다. 이러한 경우 커널은 vm.panic_on_oom
sysctl 설정을 통해 메모리 부족 상태에서 패닉하도록 구성 할 수 있습니다 .
커널이 사용하는 메모리 어카운팅 휴리스틱은 vm.overcommit_memory
sysctl 설정을 통해보다 자유롭거나 엄격하게 만들 수 있습니다 . 엄격한 메모리 계정이 사용 중일 때 커널은 페이지를 저장할 수있는 충분한 실제 메모리 나 스왑 공간이 없으면 더 이상 익명 페이지를 할당하지 않습니다. 즉, 시스템이 충분한 스왑 공간으로 구성되어 있어야합니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다