write 함수 사용시 메모리 증가 현상

dnehdgns의 이미지

안녕하세요..

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);

}

modestcode의 이미지

기본적인 프로그램 제외하고 이 프로그램만 돌렸는데 문제가 됐다는 말씀이세요? 이 예제 프로그램이 참 이상한 일을 하고 있기는 하지만 정상적인 상황에서는 문제가 되지 않을 것입니다. 물론 POSIX system에서 문제가 되거나(S_IREAD|S_IWRITE), 계속 실행하면 용량이 차서 되는 것들은 제외하고요. 실제 코드를 너무 간략히 하신 것이 아닌가 생각합니다.

dnehdgns의 이미지

저 프로그램만 돌려도 free 메모리가 줄어듭니다.

프로그램이 종료가 되어도 top 에서 보이는 메모리는 회복이 되질 않고,
free로 보면
-/+ buffers/cache: 2282848 1758780

회복이 되는듯 합니다.

그런데 파일이 close 가 되어도 회복이 되질 않는 것 같습니다.

vamf12의 이미지

이건 버그도 아니고 문제도 아닌것 같습니다만...

Quote:

프로그램이 종료가 되어도 top 에서 보이는 메모리는 회복이 되질 않고,
free로 보면
-/+ buffers/cache: 2282848 1758780

회복이 되는듯 합니다.


버퍼에 대한 개념은 알고 계시지요 ^^
fd = open("/mnt/log/test.log", O_CREAT | O_APPEND | O_RDWR, S_IREAD|S_IWRITE)

이렇게 O_DIRECT 나 O_SYNC를 추가해서 테스트 해보세요

fd = open("/mnt/log/test.log", O_CREAT | O_APPEND | O_RDWR | O_DIRECT, S_IREAD|S_IWRITE);
bushi의 이미지

/mnt/log 의 파일시스템은 ?

OTL

sjpark의 이미지

저도 같은 생각을 하고 있었습니다 ㅋㅋㅋ

http://nicesj.com

dnehdgns의 이미지

top 에서 볼때는 free가 감소 되는것으로 보이는데,

free 명령어로 확인 해보니 free 영역이 유지가 되더군요.

리눅스 시스템에서 개발이 처음이라 제가 착각을 한것 같습니다. ^^;;;;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.