2012-01-01 9 views
4

거대한 데이터 세트에서 작동하는 프로그램을 작성했습니다. 내 CPU와 OS (우분투)는 모두 64 비트이고 4GB의 RAM을 가지고 있습니다. "top"(% Mem 필드)을 사용하여 프로세스의 메모리 사용량이 약 87 %, 즉 3.4GB 이상으로 증가한 것을 확인했습니다.프로세스가 4GB에서 죽는 이유는 무엇입니까?

그런 다음 "uname -m"을 사용하여 프로세스가 액세스 할 수있는 메모리 양을 "무제한"으로 확인했습니다.

OS와 CPU가 모두 64 비트이고 스왑 파티션이 있기 때문에 운영 체제는 가상 메모리 즉 [> 스왑 공간에서 3.4GB + yGB]를 사용해야하며 필요한 경우에만 더 많은 기억, 그것은 죽었 음에 틀림 없다.

그래서, 다음 한 QUES :

  1. 얼마나 많은 물리적 메모리 할 수있는 이론적으로 64 비트 M/C에 프로세스에 액세스 할 수 있습니다. 내 대답은 2^48 바이트입니다.
  2. 실제 메모리가 2^48 바이트 미만인 경우 OS가 가상 메모리를 사용해야하며 맞습니까?
  3. OS가 SWAP 공간을 사용 했어야하는 이유는 OS가 SWAP 공간을 사용해야했기 때문입니다. 우리 프로그램을 코딩하기 위해 특정 시스템 호출을 사용해야한다고 생각하지 않습니다.

좋습니다.

+0

2^48 바이트가 전체 주소 공간입니다. 프로세스는이 모든 것을 사용할 수 없습니다. 커널 주소 공간도 이에 맞아야합니다. OOM 살인자에 의해 살해 됐나요? – fge

+3

앱이 64 비트로 컴파일 되었습니까? 64 비트 시스템의 32 비트 앱은 여전히 ​​4GB 메모리 제한을받습니다. –

+0

또한 어떻게 할당합니까? mmap, malloc, shm, 다른, 모두? – fge

답변

1

fileldd으로 실행 파일이 실제로 64 비트인지 확인하십시오.

리소스 제한도 확인하십시오. 프로세스 내부에서 getrlimit 시스템 호출 (가능한 경우 setrlimit)을 사용하여 프로세스를 변경할 수 있습니다. bash 셸에서 ulimit -a을 시도하십시오. zsh 셸에서 limit을 시도해보십시오.

프로세스가 실제로 소비한다고 생각하는 메모리를 실제로 먹는지 확인하십시오. 그것의 PID가 1234라면 pmap 1234을 시도 할 수 있습니다. 프로세스 내부에서 /proc/self/maps 또는 /proc/1234/maps (터미널에서 읽을 수 있음)을 읽을 수 있습니다. 또한 당신이 믿는 메모리 (그리고 스왑 공간)을 가지고 free/proc/self/ ...

점검 내부의 /proc/self/smaps 또는 /proc/1234/smaps/proc/self/status 또는 /proc/1234/status 및 기타 파일이 있습니다. 임시 스왑 공간을 swapon /tmp/someswapfile과 함께 추가 할 수 있습니다 (초기화하려면 mkswap을 사용하십시오).

Gnu/Linux/Debian/Sid/AMD64에서 7Gb 프로세스 (거대한 cc1 컴파일)를 실행하기 위해 몇 달 (2 년 전), 일상적으로 8Gb RAM .

그리고 작은 테스트 프로그램으로 시도해 볼 수 있습니다. malloc과 같은 다수의 메모리 청크를 할당한다. 32Mb. 내부에 몇 바이트를 쓰는 것을 잊지 마십시오 (최소한 각 메가 바이트에서).

std::map 또는 std::vector과 같은 표준 C++ 컨테이너는 일반적으로 생각하는 것보다 더 많은 메모리를 소비한다고 소문이 있습니다.

필요한 경우 더 많은 RAM을 구입하십시오. 요즘은 꽤 싸다.

+0

- 필자는 실행 파일을 확인하기 위해 readelf를 사용했으며, 이는 64 비트입니다. –

+0

실제로 std :: vector에는 상당한 오버 헤드가 있다고 생각합니다. libstdC++ 소스 코드 (GCC 안에 있음)에 뛰어 들지 않았기 때문에 더 구체적 일 수는 없습니다. –

+0

- 이미 언급했듯이 uname으로 표시되는 메모리 제한은 "무제한"입니다. 확인하고 싶은 다른 것이 있습니까? - pmap 및/prov/self/*에 대한 제안이 좋습니다. 나는 그것을 시도 할 것이다. - swapon을 사용해 볼 수도 있습니다. 하지만 그것은 또한 내 질문 중 하나입니다. 왜 OS 자체가 가상 메모리를 사용하여 관리하지 않는지 궁금합니다. 프로그래머가 걱정해야 할 것은 무엇입니까? - 귀하의 경우에는 bcoz u가 8GB이고 프로세스에 7GB가 필요하다는 점을 이해할 수 있습니다. 내 경우는 그 반대입니다. - 4GB에서 이미 죽어 가고있는 프로그램을 가지고있을 때 malloc이 어떻게 도움이되는지 확신하지 못합니다. –

0

그래픽 어댑터, OS 커널, BIOS 등을 포함하여 글자 그대로 모든 것을 해결할 수 있어야하며 해결할 수있는 양은 SWAP에서도 연장 할 수 없습니다.

또한 프로세스 자체가 64 비트 일 필요가 있다는 점에 유의할 가치가 있습니다. 그리고 일부 운영 체제는 불안정해질 수 있으므로 과도한 RAM을 사용하는 경우 프로세스가 중단 될 수 있습니다.

+0

물론, 이해합니다. 그리고 프로세스도 64 비트입니다. –

2

이유가 될 수있는 데이터 크기가 아닙니다. 예를 들어, ulimit -a을 수행하고 최대 스택 크기를 확인하십시오. 죽이는 이유가 있니? 코어 파일을 얻기 위해 'ulimit -c 20000'을 설정하면, gdb로 검사 할 이유를 알 수 있습니다.

+0

흠, 도움이 될 수 있습니다. 사실, 로컬 변수 인 벡터 을 사용하고 있습니다. 그리고이 벡터는 엄청난 양의 데이터를 담고 있습니다. 그러나 여전히 STL이기 때문에 스택을 사용하지 않고 힙을 사용하여 메모리 요구 사항을 충족시켜야한다고 생각했습니다. 그리고이 경우 최대 스택 세그먼트 크기는 중요하지 않습니다. 너는 무엇을 제안 하는가? –

+0

이미 정확한 살인 이유가 있습니까? –

+0

@ ott-- OOM 살인자, 질문 주석 참조. 튜닝은 PITA입니다 :/ – fge

관련 문제