데몬에 메모리 누수가 발생 하는데 찾기가 어렵습니다.

dao_3651의 이미지

시스템에 malloc/calloc 을 빈번하게 하는 데몬이 있습니다. 대략 1시간에 100만건 정도 됩니다.

큰 블록을 할당 하는것이 아니라 10byte ~ 1M 까지 다양한 크기의 메모리를 그때 그때 할당 하고 free가 되는 시점은 메우 불균일 합니다.

그리고 일부 알려진 누수 (하루에 1M 미만)이 있습니다. 그런데 실제 malloc 한 메모리보다 누수량이 훨씬 더 많습니다.

top을 통헤서 메모리를 확인 해보면, 메모리가 계단식으로 증가 하는데, virt가 치고 올라가면 res가 따라가는 식입니다.

그리고 처음에는 250mb에서 시작하여 점점 상승량이 줄어들면서 1주일 정도 후면 2gb정도에서 상승이 멈추게 됩니다.

누수라면 계속 상승 해야 하는데, 일정 구간에서 수렴 한다는게 정말 이상 합니다.

다른 .so 공유 라이브러리를 로딩 하지 않고 스레드가 쌓이는 구조도 아닙니다.

mtrace, valgrind, LD_PRELOAD를 통한 malloc 후킹 과 같은 알려진 방법으로 malloc/realloc/calloc/mmap 등의 heap을 사용하는 함수를 추적해보면 항상 open 되어 있는 memory의 총량은
100mb를 넘기지 않고 있으나 프로그램 전체의 메모리는 계속 증가 하는 현상입니다.

/proc/[self]/pid를 보아도 heap이 하염없이 늘어나네요;;;

1 00400000-0109e000 r-xp 00000000 08:05 1184112 /opt/bin/wmtad
2 0129e000-01408000 r--p 00c9e000 08:05 1184112 /opt/bin/wmtad
3 01408000-01425000 rw-p 00e08000 08:05 1184112 /opt/bin/wmtad
4 01425000-01435000 rw-p 00000000 00:00 0
5 0291c000-078aa000 rw-p 00000000 00:00 0 [heap]
6 7f6720000000-7f6720240000 rw-p 00000000 00:00 0
7 7f6720240000-7f6724000000 ---p 00000000 00:00 0
8 7f6728000000-7f67282c5000 rw-p 00000000 00:00 0
9 7f67282c5000-7f672c000000 ---p 00000000 00:00 0
10 7f672c000000-7f672c265000 rw-p 00000000 00:00 0
11 7f672c265000-7f6730000000 ---p 00000000 00:00 0

****

저기서 heap 늘어난 총량 모두 더하면 대략 누수로 추정 되는 분량만큼 되더라고요..

분석 초기에는 어딘가에서 malloc 해놓고 free를 빼먹었다고 생각 했는데.. 지금은 다른 생각도 많이 드네요.

지금은 다른 생각이 드네요.. 저는 다음 3가지가 가능성 있다고 생각 됩니다.
- mmap/malloc/calloc/realloc 이외에 누수의 원인이 되는 다른 함수가 있음
- 불규칙한 할당 및 해제 때문에 메모리 내부단편화가 원인
- 그냥 free 안한건데, 찾지 못한 것

한 3일 정도 봤는데.. 너무 어렵네요 malloc이 아닌 것 같아서 여렵네요. ㅜㅜ

혹시 비슷한 경험을 하신 분 있으면 답변 부탁 드립니다. ㅠㅠ

라스코니의 이미지

잘은 모르지만 그냥 정상적인 커널 동작의 일부일지도 모른다는 생각이 드네요.
시간당 그렇게 많은 할당과 해제가 일어난다면 처음에 크게 메모리를 할당해 놓고 소프트웨어적으로 잘게 짤라서 쓰는 방법도 있습니다.

Hodong Kim@Google의 이미지

malloc / free 가 쌍으로 있어야 됩니다. 그런데 흔히 하는 실수가 있습니다.

char *func
{
  char *a;
 
  a = malloc (10);
 
  /* 어쩌구 저쩌구 연산 수행합니다. */
 
  if (a[1] == 0)
  {
    /* free (a); 를 누락하는 실수가 있는지 확인해야 함 */
    return NULL;
  }
 
  return a;
}

printf ("%s\n", func ()); /* 이 부분에서 또 버그가 발생 */

이러한 실수는 유명한 오픈소트 프로젝트에서도 흔히 발견할 수 있는 메모리 누수 버그입니다.
그런 어플이 한두개도 아니고 버그 보고하려면 귀찮고 실용상의 문제가 없으므로 그냥 넘어가기도 합니다. stdlib, stdio 만 사용하여 개발하지는 않았을 것 같은데 사용 중인 라이브러리에도 버그가 있을 수 있습니다.

그리고 이번에 nimf 를 두 달 동안 테스트하면서 알게 된 사실이 있습니다.
엔진 로딩/ 언로딩을 100,000 번 이상 수행했는데 dbus 관련하여 할당/해제 시점 버그, 메모리 누수가 발생함을 확인하였습니다. 실용상의 문제는 없기 때문에 따로 보고하지는 않았습니다.
귀하께서 사용중이신 daemon 이 직접적/간접적으로 dbus 를 사용한다면 메모리 누수를 겪을 수 있습니다.

그외 이유로 커널에 버그가 있을 수도 있습니다.
커널은 제가 까막눈이라 패스합니다.

마루터 컴퓨터를 만들어서


시스템에 malloc/calloc 을 빈번하게 하는 데몬이 있습니다. 대략 1시간에 100만건 정도 됩니다.

큰 블록을 할당 하는것이 아니라 10byte ~ 1M 까지 다양한 크기의 메모리를 그때 그때 할당 하고 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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.