mmap / munmap 에 관하여 질문 드립니다..
글쓴이: zzang3757 / 작성시간: 일, 2012/06/24 - 12:03오전
mmap, munmap 으로 테스트 코드를 만들어 보고 있습니다..
루프를 돌면서 파일 10만개에 mmap 으로 데이터를 쓰고 있습니다..
#define PAGE_SIZE 1024 * 4
if ((pmmap = (char *)mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED)
{
perror("mmap error : ");
return -1;
}
memcpy(pmmap, (char*)&m, sizeof(m));
if(munmap(pmmap, PAGE_SIZE) == -1)
{
perror("munmap error : ");
}
mmap 이랑 munmap 부분만 위에 기재하였씁니다..
이게 루프를 도는 동안 top 같은 명령어로 메모리 사용량을 보면 쭉 올라가는데,,
프로그램이 끝나고 메모리 사용량이 당췌 내려오질 않네요/.
munmap 을 저렇게 쓰는게 아닌가요 ?;;
신기한게,,
mmap으로 데이터를 쓴 파일들을 모두 지워버리면 메모리 사용량은 원래 대로 돌아오구요..
어떻게 해야 루프를 돌면서도 메모리 사용량을 안늘릴수 있을까요..
Forums:
제 생각에는 파일에 쓴 데이터가 물리적인 디스크에
제 생각에는 파일에 쓴 데이터가 물리적인 디스크에 저장되기 전에
운영체제의 버퍼에 저장되므로 프로그램이 끝난다고해도 바로 메모리 사용량이
줄어들지는 않을것 같습니다.
버퍼에 있는 데이터가 디스크에 저장되고나면 메모리 사용량이 줄어들겠지요.
저도 실험을 안해봐서 확실히는 모르겠습니다만
프로그램의 메모리 사용량을 늘리지 않으려면
msync같은 시스템콜을 써서 직접 버퍼에있는 내용을 디스크로 써주면
메모리 사용량이 좀더 빨리 줄어들지않을까요?
내일 출근해서 실험해보고 다시 답글을 올리겠습니다.
msync 로 SYNC / ASYNC 돌아가면서
msync 로 SYNC / ASYNC 돌아가면서 해보고 있는데,, SYNC는 당연히 버퍼에 내용을 디스크로 쓰기 때문에 메모리 사용량이 바로바로 줄어들 줄알았는데,,
계속 메모리 사용량은 올라가서 내려올 기미가 안보이네요,,ㅎ
계속 다른 방법으로 테스트해봐야겠네요 ㅎ
음 ..
아마도 썼던 메모리는 캐시로 들어갔을 겁니다.
빠른 억세스를 위해 최근 사용한 메모리를 바로 free 영역으로 보내지 않고 캐싱을 하는거죠.
free 메모리가 부족하다면 적당히 캐시에서 가져다 쓸테니 free + buffers + cached 가 충분하다면..
별로 고민하실 필요는 없을 것 같네요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
저도 그렇게 생각했었는데 얼마전에 일하다보니
저도 그렇게 생각했었는데 얼마전에 일하다보니 요구사항에 메모리를 얼마 이상 사용하면 안된다는게 있었습니다.
서버쪽에서는 메모리 사용양도 문제가 되나보더라구요.
음 ..
그쪽에서 말하는 메모리 사용량은, 순수 어플에서 사용하는 메모리 사용량을 얘기하는 게 아닐까 싶네요.
memory full 나서 엔진 죽고, 서버 죽어나는 거 보고 싶지 않을테니..
그 외에는 OS 가 free 메모리를 최대한 캐시로 활용하도록 내버려 두는게 오히려 바람직 할 것 같네요.
free 메모리가 항상 일정 이상 펑펑 남아 돈다면, 이거야 말로 오버 스펙에 낭비일 것 같습니다.
만약 정말로 free 용량이 문제가 된다면, free/cache/used 로 세분화 해서 모니터링 해줘도 되지 않을까 싶습니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
그런데 그게 실제로 일어났습니다!! 갑님께서 OS의
그런데 그게 실제로 일어났습니다!!
갑님께서 OS의 free 메모리 수치가 문제가 된데요 ;-)
흐미,, munmap 해도 free 메모리 양이
흐미,, munmap 해도 free 메모리 양이 늘어나지가 않네요 ㅜ
파일을 꼭 지워버려야지만 free 메모리 양이 늘어나느데,,
대체 원인이 몰까요 ㅜ
fsnyc로 파일 데이터를 디스크에 쓰면
munmap을 하면 프로세스의 메모리 양은 바로 줄어드는걸 확인하셨나요?
fsnyc로 파일 데이터를 디스크에 쓰고 fclose로 파일을 닫으면 어떤가요?
운영체제의 동작을 지정해야할것 같은데 어떻게 해야할지 어렵네요.
이따가 저도 비슷한 코드를 한번 만들어보겠습니다.
음 ..
일단 drop caches 로 검색해 보세요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
http://www.unix.com/linux/913
http://www.unix.com/linux/91399-free-linux-memory-dropping-caches.html
위사이트에서 캐쉬지울라면 # sync; echo 1 > /proc/sys/vm/drop_caches 이런 명령어를 입력하라 해서 해봤는데,,
mmap 으로 늘어난 메모리가 확 줄어드는군요,,,, munmap 해도 실제 파일의 데이터는 메모리에 올라가 있는건가요... munmap 의 정체가 의문 스럽군요,.ㅎ
음 ..
간단히 정리하자면, 모든 디렉토리나 파일에 대한 접근 역시 cache 에 저장됩니다.
다음에 그 파일을 읽어들일 때에는 cache 에서 읽어들일 테니 disk 에서 읽을때보다 빠르겠죠.
cache 는 OS 에서 잡아서 쓰는거라, 엄밀히 말하면 free 에 해당하진 않지만..
언제든지 자동/수동으로 free 로 될 수 있는 녀석인거구요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
오...바보같이 관리 명령쪽을 찾아봐야되는데
오...바보같이 관리 명령쪽을 찾아봐야되는데 시스템콜만 찾으니 못찾고 있었네요.
sys 파일시스템이 있다는건 잊고있었습니다.
munmap은 그야말로 프로세스와 메모리간의 매핑을 끊어주는 것이지요.
그래서 프로세스가 소유한 메모리는 줄어듭니다.
munmap은 커널이 가지고 있는 버퍼와는 상관없습니다.
아, 그렇군요, ㅎ 답변 감사드립니다.
아, 그렇군요, ㅎ 답변 감사드립니다.
댓글 달기