[systemd-devel] High CPU usage of journald

Lennart Poettering lennart at poettering.net
Mon Feb 18 18:15:53 PST 2013

On Sun, 17.02.13 17:54, Holger Freyther (holger at freyther.de) wrote:

> So where does _int_malloc come from? I have used gdb to 'sample'
> it by hand. So the answer is from a lot of places. Do you consider
> cutting back on how you dynamically allocate strings? E.g. stop
> using fopen, fgets, only have one dynamically tmp string for the
> various format routines one is using sequentially?

Well this depends. Dynamically allocating strings makes code generally
more readable and just sidesteps the whole "how long should I make this
buffer" issue. As long as these allocations never show up in inner loops
this is a non-issue.

There are many cases where we can easily get rid of dynamic string
allocation. For example, in the various calls that access
/proc/$PID/foobar, we can certainly generate that path string on the
stack, since the PID number is finite.

So, the answer is: it depends on the case. If something is used in inner
loops an doesn't fuck up readability entirely I am more than happy to
merge a patch. In many cases asprintf() can already be replaced by
strjoin() and strappend() which actually is already a major
speed-up. Moving to strings allocated on stack in many cases where the
string is known to have a reasonable max size anyway is good too (but
please, don't just blindly allocate "char buf[256]" everywhere...).

Blindly replacing all uses of asprintf() however, nah, not sure I like
that too much... It does make things a lot more readable.

> Samples:
> Breakpoint 1, _int_malloc (av=av at entry=0x4ddae8e4 <main_arena>, 
>     bytes=bytes at entry=15) at malloc.c:3241
> 3241	malloc.c: No such file or directory.
> (gdb) bt
> #0  _int_malloc (av=av at entry=0x4ddae8e4 <main_arena>, bytes=bytes at entry=15)
>     at malloc.c:3241
> #1  0x4dce2fdc in __GI___libc_malloc (bytes=bytes at entry=15) at malloc.c:2859
> #2  0x4dce7c60 in __GI___strdup (s=s at entry=0x4dd999fc "/etc/localtime")
>     at strdup.c:42
> #3  0x4dcfcdd4 in tzset_internal (always=<optimized out>, 
>     explicit=explicit at entry=1) at tzset.c:441
> #4  0x4dcfd210 in __tz_convert (timer=timer at entry=0xbefc0754, 
>     use_localtime=use_localtime at entry=1, tp=0x4ddb16cc <_tmbuf>) at tzset.c:629
> #5  0x4dcfb618 in __GI_localtime (t=t at entry=0xbefc0754) at localtime.c:42
> #6  0x0000e694 in server_forward_syslog (s=s at entry=0xbefc0b48, 

Please note that this one is a glibc internal issue. It's the
implementation of localtime().


Lennart Poettering - Red Hat, Inc.

More information about the systemd-devel mailing list