write 함수 사용시 메모리 증가 현상
안녕하세요..
write를 이용하여 파일에 대량의 데이터를 기록을 하고 있습니다.
그런데 write를 이용하여 파일에 기록시마다 메모리가 증가를 해서 free memory가 모두 고갈이 되고,
결국에는 스왑데몬이 계속 떠서 성능을 저하 시켜 버립니다.
어떤 이유 때문에 이런 현상이 발생하는지 궁금합니다.
또한 해결책은 없는지요?
아래처럼 간단한 테스트 코드를 작성하여 테스틀 해보아도 top 에서 보이는 free 메모리 스페이스가 줄어듭니다.
커널 버전
2.6.9-67.0.1.ELsmp
cpu : x86 64
int main(int argc, char* argv[])
{
int i=0;
char buf[1024*500];
char *pbuf;
unsigned long long tot = 0;
memset(buf, 0x35, 1024*500);
int fd = -1;
fd = open("/mnt/log/test.log", O_CREAT | O_APPEND | O_RDWR, S_IREAD|S_IWRITE);
for (i=0; i<1000; i++)
{
write(fd, buf, 2048);
tot += 2048;
if (i%100 == 0)
{
printf("size=> %lld\n", tot);
tot=0;
sleep(1);
}
}
close(fd);
}
기본적인 프로그램
기본적인 프로그램 제외하고 이 프로그램만 돌렸는데 문제가 됐다는 말씀이세요? 이 예제 프로그램이 참 이상한 일을 하고 있기는 하지만 정상적인 상황에서는 문제가 되지 않을 것입니다. 물론 POSIX system에서 문제가 되거나(S_IREAD|S_IWRITE), 계속 실행하면 용량이 차서 되는 것들은 제외하고요. 실제 코드를 너무 간략히 하신 것이 아닌가 생각합니다.
저 프로그램만
저 프로그램만 돌려도 free 메모리가 줄어듭니다.
프로그램이 종료가 되어도 top 에서 보이는 메모리는 회복이 되질 않고,
free로 보면
-/+ buffers/cache: 2282848 1758780
회복이 되는듯 합니다.
그런데 파일이 close 가 되어도 회복이 되질 않는 것 같습니다.
이건 버그도 아니고
이건 버그도 아니고 문제도 아닌것 같습니다만...
버퍼에 대한 개념은 알고 계시지요 ^^
이렇게 O_DIRECT 나 O_SYNC를 추가해서 테스트 해보세요
/mnt/log 의
/mnt/log 의 파일시스템은 ?
OTL
ㅋㅋㅋㅋ
저도 같은 생각을 하고 있었습니다 ㅋㅋㅋ
http://nicesj.com
https://nicesj.com
https://blog.nicesj.com
메로리 증가 현상..
top 에서 볼때는 free가 감소 되는것으로 보이는데,
free 명령어로 확인 해보니 free 영역이 유지가 되더군요.
리눅스 시스템에서 개발이 처음이라 제가 착각을 한것 같습니다. ^^;;;;
댓글 달기