2012-09-24 1 views
1

X86_64 Linux 2.6.32.12에 프로그램이 C++으로 쓰여졌습니다. 두 개의 경우가 있습니다. 하나의 경우는 주입 된 각 파일에 대해 하나의 파일을 생성하고 발송합니다 through UDP(Version A); 또 다른 경우는 파일을 생성하지 않으므로 삽입 된 파일을 UDP(Version B)을 통해 직접 보내십시오.왜 물리적 메모리가 증가하고 리눅스에서 오랜 시간이 지나면 가상 메모리 크기가 약간 증가 할 것인가

=============== 버전 A 통계 그래픽 ============= http://i.stack.imgur.com/8bxI5.png http://i.stack.imgur.com/8bxI5.png

============== 버전 B Statictic Graphic ====================== === http://i.stack.imgur.com/wEnKc.png http://i.stack.imgur.com/wEnKc.png

내가 사용 valgrind이 두 사례를 확인이 보고서는 동일, 어떤 메모리 누수를 볼 수 없습니다. 이 문제는 Linux 커널 메모리 매핑으로 인해 발생합니까? 테스트 컴퓨터는 64G 메모리를가집니다. 이 부분은 memory leak입니까?

업데이트 정보 : Version A에서

, 우리는, 다른 응용 프로그램으로 원래의 파일 내용을 보내 처리 결과가 필요한 파일을 생성받을 UNIX socket를 사용합니다. 그래픽이 보여 주듯이 실제 메모리가 증가합니다. 나는 또 다른 경우를 시도했다. 유닉스 소켓을 통해 파일을 보내지 말고, system 함수를 사용하여 다른 응용 프로그램을 호출하여 필요한 파일을 생성하면 메모리가 증가하지 않는다는 것을 알 수있다. 새로운 생성 된 파일이 문제가 아닌 것으로 보입니다. 유닉스 소켓 때문입니다. 우리는 소켓 풀을 사용하고, 나는 lsof을 사용한다. 여분의 소켓은 열리지 않는다. Unix socket이 메모리를 차지합니까?

답변

2

버전 A가 파일 내용에 메모리를 할당하고 있으며 메모리 관리자가 메모리를 해제하면 시스템이 메모리를 반환하지 않는다고 추측합니다 (메모리가 재사용된다는 것을 올바르게 알고 있으므로).

메모리에 대한 부담이있는 경우 커널이 메모리를 다시 사용합니다.

+0

버전 A에서는 UNIX 소켓을 사용하여 원본 파일 내용을 다른 응용 프로그램에 보내고 프로세스 결과를 받아 필요한 파일을 생성합니다. 그래픽이 보여 주듯이 실제 메모리가 증가합니다. 나는 다른 경우를 시도했다. 유닉스 소켓을 통해 파일을 보내지 말고, 시스템 기능을 사용하고, 다른 애플리케이션을 호출하여 필요한 파일을 생성한다. 메모리가 증가하지 않을 것임을 보여준다. 새로운 생성 된 파일이 문제가 아닌 것으로 보입니다. 유닉스 소켓 때문입니다. 우리는 소켓 풀을 사용하고, 나는 lsof를 사용한다. 여분의 소켓은 열리지 않는다. 유닉스 소켓이 메모리를 차지합니까? – robin

0

아마도 메모리 조각이 OS로 반환되는 메모리 블록을 중지시키고 있습니다.

+0

처음에는 또한 메모리 조각화 이유라고 생각합니다. 또한 tcmalloc과 jemalloc을 사용합니다. 결과는 동일합니다. tcmalloc 또는 jemalloc을 잘 알지 못했지만, 작은 블록, 큰 블록으로 메모리가 분할됩니다. – robin