[Spread-users] Another way to leak (valgrind report)
Theo Schlossnagle
jesus at omniti.com
Mon Aug 30 23:49:46 EDT 2004
On Aug 30, 2004, at 11:16 PM, Ryan Caudy wrote:
> Jonathan did apply Theo's sl_destruct patch to CVS last spring, and my
> groups rewrite (not yet available from CVS) also uses sl_destruct to
> prevent these sorts of leaks.
My apologies. I checked my 3.17.2 source tree and didn't see it. I
forgot that it was that old :-) Oops.
> Dave, what version are you using, 3.17.2? or CVS?
>
> Theo, for those of us who aren't in the know, what is the arena
> system? I don't recall the patch, but it may have been before my
> time. I know that the skiplists are an important part of Spread's
> scalability, and anything that improves their performance would
> certainly impact the groups layer's CPU performance.
the way memory.c allocates memory is by using freelists with
watermarks. Effectively, memory.c allows Spread to manage its own
arena for data types that it knows about. As the vast majority of
memory allocations in Spread of fixed sizes (that Spread knows about).
As spread isn't multithreaded, it can simply place freed objects of a
certain size on the the freelist for that object type and later "alloc"
(on in Spread "new") an object at the cost of a two point dereferences,
a pointer set and a few counter updates (faster than malloc).
I know I wrote the code to have the skiplists use Spread's "new" and
"dispose", but that was back when I wrote skiplist.c and reworked
groups.c -- in other words, a long long long time ago.
We use skiplists in Ecelerity and our unit tester shows a 1.17 speedup
on memory allocations by using memory allocator vaguely similar to the
one in Spread. We opted for a pagetable approach over a freelist due
to the number of tiny allocations we have. But you should see a
similar speedup to that in Spread.
If you're in the market for speed-ups, I'd snag a copy of valgrind and
run it with the cachegrind skin. kcachegrind will show you some things
to seriously consider improving. One thing on the skiplist topic --
which makes the code a little ugly, but adds a serious performance
boost is:
Take all the skiplist comparator functions in groups.c:
G_compare
G_member_recordcompare
G_member_keycompare
G_work_groups_comp
G_work_groups_keycomp
And make them inline functions in groups.h adding also:
#define SL_INTERNAL_G_COMPARE 0x1
#define SL_INTERNAL_G_MEMBER_RECORDCOMPARE 0x2
.. etc. etc.
Change the sl_find_compare and and sl_insert_compare to switch on the
comparison functions and call the groups.h inline comparison functions
is they match the #defines. Then update groups.c to pass the magic
SL_INTERNAL_* keys into sl_set_compare instead of the function
pointers.
While I'll be the first to admit this is an ugly hack. If you have a
lot of membership changes and you find the sl_* to be got code paths,
the benefit from having the compiler inline the comparison functions is
so substantial it is visible to the naked eye.
// Theo Schlossnagle
// Principal Engineer -- http://www.omniti.com/~jesus/
// OmniTI Computer Consulting, Inc. -- http://www.omniti.com/
// Ecelerity: fastest MTA on Earth
More information about the Spread-users
mailing list