[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: slapd leaking memory on i386?



On Mon, Apr 13, 2009 at 04:28:58PM -0700, Howard Chu wrote:
> John Morrissey wrote:
> > 2.4.16 (with BDB4.7 + patches and the POSIX threads build options) has
> > been stable on amd64/x86_64 for us, but I'm encountering problems with
> > 2.4.16 on i386.
>
> On what OS?

Linux.

> I've been seeing similar issues on Linux, but using heap profilers / leak 
> checkers don't turn up any results. At least in the Linux case, it 
> appears to be general heap fragmentation caused by continual mmap/munmap 
> of malloc'd memory blocks.

ugh. Finally caught this machine in the act. By the time I got to it, it had
~200 file descriptors left open (each of our consumers normally has 4k+),
most of which were:

slapd   32667 openldap 5466u  sock        0,4            113001170 can't identify protocol

slapd accepts connections but returns no results for any operations. For
example, strace(1) shows ldapsearch(1) connecting successfully, sending a
bind request, and then waiting forever on the result.

Each worker thread was consuming a few percent of CPU and was in a tight
loop failing to read from connections:

futex(0xb7c5dc4c, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xb7c5dc4c, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
send(4, "<167>Apr 14 16:59:34 slapd[32667]"..., 74, MSG_NOSIGNAL) = 74
 | 00000  3c 31 36 37 3e 41 70 72  20 31 34 20 31 36 3a 35  <167>Apr  14 16:5 |
 | 00010  39 3a 33 34 20 73 6c 61  70 64 5b 33 32 36 36 37  9:34 sla pd[32667 |
 | 00020  5d 3a 20 63 6f 6e 6e 65  63 74 69 6f 6e 5f 72 65  ]: conne ction_re |
 | 00030  61 64 28 34 35 35 30 29  3a 20 6e 6f 20 63 6f 6e  ad(4550) : no con |
 | 00040  6e 65 63 74 69 6f 6e 21  0a 00                    nection! ..       |
futex(0xb7c5dc4c, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x895f1b4, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0x895f1b4, FUTEX_WAKE_PRIVATE, 1) = 0
time(NULL)                              = 1239728375
futex(0xb7c5d80c, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0xb7c5d80c, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0xb7c5d80c, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0xb7c5d80c, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0xb7c5d80c, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0xb7c5d80c, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0xb7c5d80c, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0
futex(0xb7c5d80c, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0xb7c5dc4c, FUTEX_WAIT_PRIVATE, 2, NULL

For reference, slapd has been emitting lots of these errors, but their
frequency increases by more than an order of magnitude when slapd begins to
wedge:

# sed -n '/no connection/s/^Apr 14 \(..\).*/\1/p' slapd.20090414|sort|uniq -c
[...]
  46916 10
  48511 11
  50828 12
  53492 13
 229907 14
1040360 15
 808565 16

At this point, slapd's VSIZE had increased to ~2.6GB, which was consistent
with /proc/PID/smaps. Most of its mappings were 1Mbyte or 2Mbytes, with a
1GB region for its SHM cache:

# awk '/Size/ {print $2}' smaps |sort|uniq -c|sort -rn|head
    307 2048
    149 1024
     67 4
     18 8
     13 1020
[...]

I saved a core and backtrace of this slapd image. I blocked off all LDAP
connections to this host, and slapd's memory consumption seems stable for
the moment, but is still not sending responses to any LDAP operations. Is
there anything else I can poke at to help troubleshoot this? Howard, do you
still think this is due to churn-related heap fragmentation?

john
-- 
John Morrissey          _o            /\         ----  __o
jwm@horde.net        _-< \_          /  \       ----  <  \,
www.horde.net/    __(_)/_(_)________/    \_______(_) /_(_)__