[ZODB-Dev] write performance

Nicholas Henke henken@seas.upenn.edu
Wed, 5 Feb 2003 19:34:35 -0500


This is a multi-part message in MIME format.

--Multipart_Wed__5_Feb_2003_19:34:35_-0500_10224788
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

On Wed, 5 Feb 2003 17:25:03 -0500
jeremy@zope.com (Jeremy Hylton) wrote:

> I just took a quick look at the statistics and realized that we
> probably need to see the profile data from the server side, too.  From
> the client side we see that ZEO spends a lot of time (10.543 seconds
> cumulative) waiting for synchronous ZEO calls to return.

Attached are stats from ZEO.

OK -- here are some stats from the client:

Database info: {'cachesize': 400, 'objectcount': 389, 'poolsize': 7, 'size': 113436L}
cache detail [('BTrees.OOBTree.OOBTree', 5), ('BTrees.OOBTree.OOBucket', 1), ('BTrees._IOBTree.IOBTree', 8), ('IndexedCatalog.Indexes.FloatIndex', 1), ('IndexedCatalog.Indexes.IndexCollection', 2), ('IndexedCatalog.Indexes.InstanceIndex', 2), ('IndexedCatalog.Indexes.IntIndex', 24), ('IndexedCatalog.Indexes.StringIndex', 14), ('IndexedCatalog.Indexes.TupleIndex', 2), ('Persistence.PersistentMapping', 3), ('ZODB.PersistentList.PersistentList', 374), ('clubmask.database.ClubmaskClass.ClubmaskContainer', 5), ('clubmask.database.MachineClass.Machine', 32)]

> 
> It looks like most of that time is spent waiting for tpc_finish().  On
> the server side of FileStorage, tpc_finish() copies data from a
> transaction temporary file to the primary storage file and calls
> sync().  It also sends invalidation messages to all the other clients.
> 
> I would expect the storage cost to be dominated by the cost of data
> movement inside the storage server, but can't be sure without seeing
> the data.
> 
> Do you have a lot of clients connected?  If there are many clients, it
> costs more to send invalidations.

Nope -- there are two clients most times. The one for which I sent the profiling data for,
and another one that does (almost) nothing but read data from the database.

> 
> Have you tried running the ZEO server with -O?  That will eliminate a
> bunch of log calls, which might shave a second from the 20 being
> consumed during the commit.  5% isn't too bad for just -O.

I have done so for the attached stats. The was no noticeable speedup from what I could see in the clients.

> 
> It will also be interesting to fire off a helper thread that just ran
> the asyncore mainloop.  I don't have any idea if it will make a
> difference, but there are a lot of calls to poll() the way you're
> currently running.  There might be fewer if you had a mainloop running
> somewhere.

I will run that data, and send it off soon.
It might be interesting to see the function I use to handle conflict errors.
 You can see that I am calling sync() before every transaction, as it helps 
to get the function to run without ConflictError's. I tried without that sync, 
and I almost always have to re-run the function.

        def runFunction(self, function, *args):
                """ this will run a function inside of a transaction. The function
                may be run many times, as the transaction could fail with a ConflictError """
                log.functionTrace(3, self.__class__.__name__)
                count = 0
                # only try 10 times ????
                while count < 10:
                        try:
                                # sync here -- do before so we get a good chance of being up to date.
                                self.sync()
                                retval = apply(function, args)
                                self.commit()
                        except ConflictError:
                                log.log(2, "Hit a ConflictError in function '%s', retrying %d more times" %(function, 10-count))
                                count += 1
                                time.sleep(1)
                                self.abortTrans()
                        else:
                                log.log(5, "Running function '%s' succeeded after %s tries" %(function, count))
                                return retval
                return apply(function,args)

I can log,trace,profile anything else if it will help. :)

Nic
-- 
Nicholas Henke
Linux Cluster Systems Programmer
Liniac Project - Univ. of Pennsylvania

--Multipart_Wed__5_Feb_2003_19:34:35_-0500_10224788
Content-Type: application/octet-stream;
 name="zeostats.gz"
Content-Disposition: attachment;
 filename="zeostats.gz"
Content-Transfer-Encoding: base64

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
3pkCAA==

--Multipart_Wed__5_Feb_2003_19:34:35_-0500_10224788--