Mnesia, table updates, and (UNIX) process bloat

Scott Lystig Fritchie fritchie@REDACTED
Thu Apr 6 10:00:26 CEST 2006


Greetings.  I'm a bit puzzled about R10B-9's behavior regarding
process size.  My platform is:

	Erlang R10B-9
	Linux EL3 + AMD Opteron (64-bit build), 4GB RAM
	Mnesia disc_copies tables
	Heavy update workload (I'm trying 2000 updates/sec, it's a
	    benchmark workload right now), where a fragmented Mnesia
	    table is updated with something approximately the same
	    size.

Odd behavior: The UNIX process size grows from a comfortable 2.4GB to
an uncomfortable 3.2-3.5GB in under 1 hour.  The 2,000 update/sec
benchmark slows down once the OS's VM paging starts, and then things
go rapidly downhill.

According to erlang:memory(), the 'total' and 'maximum' values only
grow about 100MB during the 1 hour.  But the UNIX process size grows
by roughly 1GB, sometimes a touch more.

Things I've tried:

    1. Adding "+r" to the "erl" command line
    2. Adding "+Mim true +MEas aobf" to the "erl" command line
    3. Switching from 'set' to 'ordered_set' tables
    4. Using an Erlang virtual machine with elib_malloc support

This smells like fragmentation of malloc's heap.  #1 is documented (I
forget where, at the moment) to avoid/slow fragmentation for some
kinds of ETS workloads.  Too bad it doesn't work for me.  Trying the
"address order best fit" scheme didn't help, nor #3 or #4.

Is there a silver bullet for this particular problem, or am I
sentenced to go spelunking with the "instrument" module and/or
valgrind's "memcheck" and/or ....

(I'm actually waiting for 16GB to arrive, but I'm wondering if this is
 going to eat 16GB eventually.)

-Scott

(*) Is the elib_malloc configure option broken?  Just using
"./configure --enable-elib-malloc" didn't seem to be enough, because
erlang:system_info(elib_malloc) would always return false.  I kludged
a Makefile (without RTFM'ing or the fine mailing list archives) to add
the necessary compiler "-D" bits, then added extra stuff to
erl_bif_info.c's "erts_system_version" string to help verify that I'd
defined the right CPP symbols.  Perhaps I used too much brute force?



More information about the erlang-questions mailing list