[질문] 메모리 릭...

익명 사용자의 이미지

또 질문을 쓰게 되었습니다. ^^;

현재 메모리 상태를 확인하기 위해서 저는 top이라는 프로그램을 사용합
니다. 그런데 그걸 통해서 확인해보니 한번에 엄청난 메모리가 증가하는
것을 확인할 수 있었습니다. 그런데 문제는 코드에서는 그렇게 많은 메모
리를 할당할려고 노력하지 않는다는 것입니다. 음... 페이지 테이블의 크
기를 고려해보더라도 이상하리만큼 큰 메모리가 할당된다는 점입니다. 어
느정도냐면 서버를 처음 시작할때 130메가 정도가 사용되고 8XX메가 정도
가 free상태였습니다만 하루가 지나니 그 반대가 되어 있었습니다. ^^;
이게 첫 번째 질문입니다.

물론, 현재 프로그램에는 메모리 릭이 존재합니다. 아직 해결하지 못했습
니다. 그런 상황에서 그 프로세스를 죽이게 되면 그 프로그램에서 할당받
은 자원이 반납되어야 하는것이 아닌가 하는 질문입니다. 예를 들어, 넷
츠케이프에서 메모리 릭이 발생한다고 가정하면, 넷츠케이프를 한 10시
간 사용해서 쓸모없이 늘어난 메모리가 있을때, 넷츠케이프를 종료하면
당연히 운영체제는 그 프로세스에서 사용하던 메모리를 반환해야 하는 것
아닌가 하는 것입니다. 제 사전 지식으로는 그래야 하는 것 같습니다.
^^; 그런데 top으로 확인해보니 전혀 그렇지 않았습니다.
이것이 두번째 질문입니다.

마지막으로 ps나 top는 정확한 메모리 확인이 되지 않습니다. 예를 들
어, 페이지 테이블을 들 수 있습니다. 프로그램이 아무리 작아도 텍스트+
데이타+스택 이렇게 3개의 영역이 필요하고 4KB가 페이지 사이즈이므로
적어도 RSS탭에 12KB이상으로 보일 것이다라고 되어 있습니다. 그렇다
면 이것 말고 좀 더 정확한 측정이 가능한 도구가 있는가 하는 것입니
다. 이상이 세번째 질문입니다.

음... 물론 메모리 할당관련 부분에서 디버깅이 가능하도록 밑에 어느 님
이 지적하신 대로 만들 수 있으나 프로젝트가 끝나가는 시점에서 그것은
제 생각엔 오버헤드가 큰 작업입니다. 또한 다른 라이브러리를 사용하기
때문에 제가 모르는 곳에서 일어날 수도 있는 일이구요. ^^;

그럼 즐거운 하루 보내시기 바랍니다.~

익명 사용자의 이미지

1) 프로그램에서 조금씩 늘어난 릭의 경우 그 코드의 수행 count와
릭 size를 곱한 값이 되겠죠. 처음부터 큰 릭이 발생하면 쉽게
잡을 수 있겠지만 조그마한 것도 쌓이면 크게 됩니다.

2) 예전에 IBM RS6000에서 그러한 상황을 보았는데요.
OS는 AIX 였던걸로 아는데요. IO를 대량으로 발생시키니까.
시스템의 메모리를 모두 BUFFER 쪽으로 할당하면서 시스템
메모리 부족을 일으키더군요. 다시 4GA 메모리를 다 사용하던데
이런현상이라면 system 담당자와 협의하여 buffer의 크기에
제한을 두는 수 밖에는 달리 방법이 없는듯 합니다.

만약 이와 같은 문제가 아니라면 릭을 일으키는 부분이 일반 힙
영역이 아니라 share되는 메모리의 일종으로 보여지기도 합니다.
종류는 (shared memory(shm, mmap[/dev/zero,..],
kernel[device driver] memory) 등이 있을 수 있겠네요.
이 경우는 정확히 찾아서 제거하지 않으면, OS를 reboot할 수 밖에
다른 방법이 없습니다.

3) 여러 상용 패키지들이 존재하는듯 한데, 요즈음은 어떤지(?)
예전에는 tiger, glance(?)등을 사용한 적이 있지만....
이것 대신에 lsof를 포팅할수 있다면 lsof를 통해서 할당 받는
메모리 block들을 확인해 보시는게 좋을듯한데(?).....
아니면 /proc table을 읽어서 메모리 할당 내역들을
직접 추적 해 보시던지요
어찌되었던 별 도움이 안되겠네요.

참고)
저의 경험을 바탕으로 이야기 한다면 메모리의 릭을 발생시키는
모둘을 찾으시는게 문제의 해결점입니다.
그리고 사용하시는 lib가 많다고 했는데, 의심만 하지 마시고 확인을
하시는게 좋을 것입니다.

예전에 미들웨어 lib와 DB Lib를 link한 서버를 작성했는데
메모리 릭이 발생을 해서 원인을 추적하니,
DB Query(prepare, execute.., close cursor)에서 발생하더군요.
하지만 이들을 분리해서 Test를 하면 정상으로 동작하고요.
그리고 모든 부분에서 릭이 나는 것이 아니라 몇몇 프로그램만 나니..
이와 같은 현상이 일어날수는 있지만, 이해 하기에는 곤란 하지요.
이런 문제는 근본원인을 찾지 않으면 해결하기 쉽지 않지요.
요행으로 해결 될수도 있겠지만, 원인을 모르면 늘 불안해지죠.

익명 사용자의 이미지

메모리 관련 툴을 사용해서 메모리 누수를 제거하는 것이 좋을 것 같습니
다.
Electric Fence나 memprof와 같은 메모리 누수 관련 툴들이 존재하고 있습
니다.
잘 써보시면 어느 부분에서 어떤 함수가 메모리를 반환하기 않는지를 알
수 있습니다.
제가 추천하고 싶은 것은 memprof인데 GUI상태에서 바로 확인하실 수 있
을 겁니다.
컴파일 하실 때에는 반드시 디버그 모드로 하시는 것 잊지마세요.^^

익명 사용자의 이미지

답변해주신 2번에 대해서 다시 질문을 드립니다.

일단 로긴시에 메모리 할당을 하기 때문에 보통때는 메모리가 늘어나지 않
을 것으로 보았으나 4KB씩 메모리가 늘어나는 것을 확인할 수 있었습니
다. 따라서 님께서 말씀하신대로 IO buffer때문일 수도 있을 것 같습니
다. 현재는 서버를 테스트 중이므로 로그를 많이 출력하고 있습니다. 그것
으로 인한 문제일 수도 있다는 생각입니다.

현재 Redhat 7.1 버전을 사용중입니다. stdio buffer의 size를 어떻게 고
정시킬 수 있을지요? 그리고 만약 size를 고정시킨다면 어떤 문제가 생길
수 있을까요?

그럼 즐거운 하루 되시기 바랍니다. ^^;

익명 사용자의 이미지

저도 지금 작업한 서버가 메모리 누수때매 해결책을 열시미 찾고 있으나
쉽지 않네요...

위에 말씀하신 memprof를 사용해볼라거 했으니
콘솔작업이 아니라 리모트 작업이라 뛰어도 버벅 되서리 쩝..
답답해서 사용을 못하겠네요..

지금 파일 open갯수때문에 lsof에 대한 메뉴얼을 보고있는데..
이것으로 메모리 누수를 체크할수 있다고 하시는데..
재가 얼핏 봤을땐 얘가 어떤 라이브러리를 사용하는지는 알려주던데
이것으로 그 라이브러리를 찾아 누수 원인인 라이브러리를 찾으시라는 말
씀이신지...

쩝 요즘 정말 해매고 있네여...
이짓도 3년째지만 아직도 이부분에선 헤매네여 ㅠ.ㅠ

다시 정리하자면 메모리 얼로케이션 한부분에 대한 것은 재가 다 해제를
해주었지만..
이 외적이 요인이 가능하다는 얘기로 들리는데 맞는지..

그럼 님이 말씀 하신방법 lsof를 이용해서 어떻게 찾아내는지
님의 설명으론 쉽게 이해가 되질 않아서요..

그럼 새해 복많이 받으시고 부자 되세여 ^^

익명 사용자의 이미지

ioctl에서 보았던 것으로 기억하고
메뉴얼에서 보니 없는 것 같군요.

단지 setsockopt에서만 변경하는 방법이 있네요.
다른곳에서 한번 찾아 보심이 좋을듯 합니다.

표준 io에서 그렇게 많은 메모리를 사용하지 않을 듯 한데요.
"lsof -p pid"를 해보세요 그러면 io Buffer의 크기를
볼수가 있을겁니다.

익명 사용자의 이미지

저는 각각의 io buffer size를 확인할때
lsof -p pid를 하면 도움이 된다는 의미였습니다.

그리고 어떤 lib들이 동적으로 link되는지도
알게 되니 참조가 될것 같아서요.

기본적으로는 자신의 소스에서 정확히 새는 부분을
찾아야지요. 문제를 system의 lib로 확대하게 되면
아무것도 신뢰를 못하면서 문제의 원인도 파악하기
힘들어 지겠죠.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.