Fwd: Regression: ldb performance with indexes

Andreas Schneider asn at samba.org
Tue May 14 14:31:53 UTC 2024


On Wednesday, 8 May 2024 15:57:19 GMT+2 Andreas Schneider via samba-technical 
wrote:
> On Friday, 3 May 2024 19:20:28 GMT+2 Andreas Schneider via samba-technical
> 
> wrote:
> > On Thursday, 2 May 2024 22:51:31 GMT+2 Andrew Bartlett via samba-technical
> > 
> > wrote:
> > > On Thu, 2024-05-02 at 14:49 +0200, Andreas Schneider via samba-
> > > 
> > > technical wrote:
> > > > On Friday, 22 March 2024 17:55:23 GMT+2 Andréas LEROUX via samba-
> > > > 
> > > > technical wrote:
> > > > > Hi Andreas and Andrew,
> > > > > 
> > > > >  >>>> > Hi,my colleagues discovered a performance issue in libldb:
> > > > > >>>> > https://bugzilla.samba.org/show_bug.cgi?id=15590
> > > > > >>>> > 
> > > > >  >>>> >  >>>> > > > > As soon as you use indexes, ldbadd will be
> > > > > 
> > > > > magnitudes >>  >> slower than >>  >>>> > itwas before.Could some
> > > > > ldb expert please look into it? >>>> >  >>>> > > Your subject says
> > > > > a regression. What version is this a >>>>  >>>> regressionagainst?
> > > > > 
> > > > > >>>> Isn't that obvious from the bug report? >>>  >>> Here is the
> > > > > 
> > > > > short summary: >>> $ bash repro.sh 20000 indexesAdded 2 records
> > > > > successfullyAdded >>  >> 20000 >>  >>> records successfully >>> On
> > > > > Samba 4.10: 0m01.231sOn Samba 4.19: 1m30.924s (that's 90 times >>>
> > > > > slower) >>>  >>>> > The very nature of a DB index is that it will
> > > > > take time to >>>>  >>>> create,possibly a lot of time, but should
> > > > > make reads faster. >>>> Either the DB index doesn't work at all in
> > > > > Samba 4.10 or there >>  >> is a >>  >>> huge performance problem in
> > > > > Samba 4.19. What is it? >>  >> Thanks, that wasn't written as
> > > > > obviously on the bug, thanks for the >> clarification. >  > I used
> > > > > our CentOS 8 Stream CI image for bisecting. You can't bisect >
> > > > > easily on a modern Linux Distribution, as the included waf would
> > > > > not > have support for newer Python versions like 3.12.
> > > > > 
> > > > >  > In case you want to reproduce it, here is my run:I'm Andréas
> > > > > 
> > > > > from Tranquil IT dev team. Denis and Yohannès asked me thisweek to
> > > > > take a look at the performance issues on large domains,
> > > > > whichinclude this issue in the current thread along the mdb large
> > > > > transactionissues.
> > > > > The attached patchset goes through all the tdb and ldb make test.
> > > > > * LMDB : increase MDB_IDL_LOGN from 16 to 18 to accomodate large
> > > > > nestedtransactions* tdb : fail-fast when record hash doesn't match
> > > > > expected hash to avoidto read/copy the entire record* ldb :
> > > > > increase DEFAULT_INDEX_CACHE_SIZE from 491 to 8089 to increasethe
> > > > > number of bucket to have smaller bucket to have faster iteration
> > > > > ineach buckets in tdb_find
> > > > > With this patchset we can upgrade large domains (>200k objects)
> > > > > toFL2k16 level in approximatly 1 hour instead of 3 days :-)
> > > > > [root at srvads1-bl1cw ~]# bash repro.sh 20000 indexes Added 2
> > > > > recordssuccessfully Added 20000 records successfully real 0m0.536s
> > > > > user0m0.798s sys 0m0.105s
> > > > 
> > > > I'm sorry but I'm not able to reproduce this:
> > > > 
> > > > tis-tdbfind.patch:
> > > > bash repro_dev_ldb.sh 10000 indexesAdded 2 records successfullyAdded
> > > > 10000 records successfully
> > > > real    0m9.035suser    0m9.021ssys     0m0.283s
> > > > 
> > > > tis-ldbfind.patch:
> > > > bash repro_dev_ldb.sh 10000 indexesAdded 2 records successfullyAdded
> > > > 10000 records successfully
> > > > real    0m8.929suser    0m8.980ssys     0m0.219s
> > > > 
> > > > 
> > > > I have a patch in the area to get rid of some malloc calls, but the
> > > > only give a really small improvement.
> > > > 
> > > > I don't know what workflow your patches exactly improve but it would
> > > > be nice to have a reproducer :-)
> > > 
> > > Just a quick note to connect some threads.  We have three discussions
> > > on this same issue, we should probably centralise here as this is where
> > > things started, but just so folks can follow, see:
> > > https://bugzilla.samba.org/show_bug.cgi?id=15590https://gitlab.com/samba
> > > -t
> > > ea m/samba/-/merge_requests/3616 In short, the emerging consensus is
> > > that
> > > we really need is a better data structure than an in-memory TDB for the
> > > in-memory cache needed to keep the indexes lined up with the database in
> > > this case.
> > 
> > From https://gitlab.com/samba-team/samba/-/merge_requests/3616
> > 
> > The in-memory TDB is probably the wrong usage here and a red-black tree
> > might be the solution.
> > 
> > There is lib/dbwrap/dbwrap_rbt.h. From the API it should be straight
> > forward and quick to replace the tdb API in
> > lib/ldb/ldb_key_value/ldb_kv_index.c with it just for testing.
> > If it fixes it, we should try to make lib/util/rbtree.c a SUBSYSTEM and
> > link it into libldb. As libldb is not standalone anymore, this should be
> > doable.
> Using a red black tree doesn't solve the issue:
> 
> $ bash repro_dev_ldb.sh 10000 indexes
> RED BLACK TREE
> RED BLACK TREE
> RED BLACK TREE
> Added 2 records successfully
> RED BLACK TREE
> Added 10000 records successfully
> 
> real    0m9.299s
> user    0m9.212s
> sys     0m0.263s
> 
> https://git.samba.org/?p=asn/samba.git;a=shortlog;h=refs/heads/asn-ldb

The thing is that those subtrees have 4 entries, with 10000 entries we walk 
4x10000 so 40000.

This needs to be optimized. As dbwrap_rbt is similar to tdb we share the same 
problems. Those could be removed if a real rbtree is used.

So someone with more ldb knowlege should look into this. I dunno if we always 
need all those 4 entries and are then overwriting stuff or if we always 
traverse those 4 entries but don't have too if we found the one we need.

With two rbtrees we could just push nodes from one tree to another. It is just 
pointer that should be fast. Allocating memory and traversing is probably what 
makes it so extremely slow.


	Andreas

-- 
Andreas Schneider                      asn at samba.org
Samba Team                             www.samba.org
GPG-ID:     8DFF53E18F2ABC8D8F3C92237EE0FC4DCC014E3D





More information about the samba-technical mailing list