[syslog-ng] Memory leak reintroduced in 3.3.3. (was: Re: Known memory leak issues in 3.3.4?)

Jakub Jankowski shasta at toxcorp.com
Sun Mar 25 01:45:23 CET 2012


On Thursday 22 of March 2012, Peter Czanik wrote:
> On 03/22/2012 02:46 PM, Jakub Jankowski wrote:
> > 
> > I know at least about one memory leak that has been once fixed, but then
> > reintroduced between 3.3.2 and 3.3.3, and I think is present since then.
> > I've mentioned it on this list in February:
> > https://lists.balabit.hu/pipermail/syslog-ng/2012-February/018334.html
> > 
> > It would be really nice if developers could take a look at the code
> > again. :)
> 
> Check this: https://bugzilla.balabit.com/show_bug.cgi?id=160 The
> mentioned patch is available at
> http://git.balabit.hu/?p=bazsi/syslog-ng-3.3.git;a=commit;h=3c14a264ab4c76b9372b1288d6808d19ec4d0aed

Unfortunately, this doesn't fix the memleak I'm seeing. I've just recreated
my testbed and tried current 3.3 HEAD (using Gergely's tarball as source:
http://packages.madhouse-project.org/syslog-ng/3.3/3.3.4/syslog-ng-3.3.4-20120313-v3.3.4-7-gfd3b.tar.gz)
and can confirm "my" leak is still happening.

Below are steps to reproduce it:

Client is a loggen, started as:
$ loggen --read-file access.random.10000.munged --active-connections 1 --interval 600 --syslog-proto <SERVERIP> 514

where access.random.10000.munged is a 10000-line file containing munged fragments 
of Apache accesslog:
$ head access.random.10000.munged
Sep 15 23:59:56 www142 accesslog: exyrqpxwva a.b.c.d - - [15/Sep/2011:23:59:56 +0200]
Sep 15 23:59:57 www142 accesslog: mnufil a.b.c.d - - [15/Sep/2011:23:59:57 +0200]
Sep 15 23:59:57 www142 accesslog: bvbgdknlvxibais a.b.c.d - - [15/Sep/2011:23:59:57 +0200]
Sep 15 23:59:57 www83 accesslog: ttmpmlgf a.b.c.d - - [15/Sep/2011:23:59:57 +0200]
Sep 15 23:59:57 www146 accesslog: igncmpwudj a.b.c.d - - [15/Sep/2011:23:59:57 +0200]
Sep 15 23:59:57 www146 accesslog: pjecagrmuywulbro a.b.c.d - - [15/Sep/2011:23:59:57 +0200]
Sep 15 23:59:57 www147 accesslog: ghjwjejsetvq a.b.c.d - - [15/Sep/2011:23:59:57 +0200]
Sep 15 23:59:57 www22 accesslog: zcnalgemoowpunhtj a.b.c.d - - [15/Sep/2011:23:59:57 +0200]
Sep 15 23:59:57 www146 accesslog: houclrfiukhbfofueill a.b.c.d - - [15/Sep/2011:23:59:57 +0200]
Sep 15 23:59:57 www146 accesslog: kwqplgsulzkryhdnr a.b.c.d - - [15/Sep/2011:23:59:57 +0200]
$

The most important thing are the random strings (which in real scenario are vhosts names).
Destination filenames on server are based upon those strings.

Server is configured like this:

$ cat /etc/syslog-ng/syslog-ng.conf
@version: 3.3
options {
        time_reap (3);
        log_fifo_size (100000);
        use_dns (no);
        use_fqdn (no);
        create_dirs (yes);
        keep_hostname (yes);
        log_msg_size(16384);
        # doesnt matter, with threaded(yes) it fails aswell
        threaded (no);

        owner ("root");
        group ("root");
        perm (0644);
        dir_owner ("root");
        dir_group ("root");
        dir_perm (0755);
};
source s_web {
    syslog(ip(0.0.0.0) port(514) flags(no-multi-line) log_iw_size(6000) max-connections(30));
};
parser p_apache_split {
    csv-parser(
        columns("APACHE.ACCESS.VHOST", "APACHE.ACCESS.LOG_MESSAGE")
        flags(greedy)
        delimiters(" ")
    );
};
destination d_test { 
    file("/logs/${APACHE.ACCESS.VHOST}-${R_YEAR}${R_MONTH}${R_DAY}" 
        template("${APACHE.ACCESS.LOG_MESSAGE}\n"));
};
log { source(s_web); 
    parser(p_apache_split); 
    destination(d_test);
    flags(final);
};
$

Running it under valgrind like this:
# G_SLICE=always-malloc valgrind --log-file=s3.3.4-fd3b-1.log \
  --leak-check=full -v --show-reachable=yes --track-origins=yes  \
  syslog-ng -F --no-caps -p /var/run/syslog-ng.pid

produces following log file: http://toxcorp.com/stuff/syslog-ng-leak/s3.3.4-fd3b-1.log

I'm pretty sure this particular memory leak was fixed in 3.3.2,
but then got reintroduced in this commit:
http://git.balabit.hu/?p=bazsi/syslog-ng-3.3.git;a=commitdiff;h=c7070e2a6f1c3a312260bcecf49d62028fef27ce
which was done to fix tcp() destination related crash after 3.3.2 was released.

So, Bazsi, yes - it does reintroduce the leak :) (in reply to your comment in
https://lists.balabit.hu/pipermail/syslog-ng/2011-November/017697.html )

Apart from the leak you can see in valgrind logfile, there is another 
symptom - some destination files are created empty:
$ find /logs/ -type f | wc -l
10000
$ find /logs/ -type f -size 0 | wc -l
4410
$ find /logs/ -type f -size 0 | head -n 1
/logs/hcxjscbcnyoktilm-20120325

Even though there is a perfectly valid source record for them:
$ grep hcxjscbcnyoktilm access.random.10000.munged 
Sep 16 00:00:05 www147 accesslog: hcxjscbcnyoktilm a.b.c.d - - [16/Sep/2011:00:00:05 +0200]
$

The number of empty files corresponds to the number of valgrind
reported errors:

==17931== 4410 errors in context 1 of 6:
==17931== Invalid read of size 8
==17931==    at 0x4E4BA05: log_dest_driver_deinit_method (driver.c:172)
==17931==    by 0x6CFE559: affile_dd_deinit (affile.c:1001)
==17931==    by 0x4E4AD33: log_dest_group_deinit (logpipe.h:254)
==17931==    by 0x4E4650A: log_center_deinit (logpipe.h:254)
==17931==    by 0x4E5F63F: main_loop_exit_finish (mainloop.c:585)
==17931==    by 0x4E791A0: iv_run_timers (iv_timer.c:345)
==17931==    by 0x4E777A5: iv_main (iv_main.c:252)
==17931==    by 0x4E6023D: main_loop_run (mainloop.c:731)
==17931==    by 0x40175D: main (main.c:260)


I hope this can help you diagnose and fix this issue.


HTH

-- 
Jakub Jankowski|shasta at toxcorp.com|http://toxcorp.com/
GPG: FCBF F03D 9ADB B768 8B92 BB52 0341 9037 A875 942D


More information about the syslog-ng mailing list