It would be interesting to know the actual performance difference between using the java lock call and a lock manager latch. Using the
latch would mean that we would get the same performance benefit on
jdk1.4 as well.

As I said, it would nice if you submitted your worst case test -- even
if it is not appropriate as a nightly unit test.  That way derby users
could run it against a variety of hardware, OS's and JVM's.  Something
simple to show the problem you are fixing like a single big table, many
threads accessing more pages than fit in cache.

I also
have wondered at what cost to btree performance is the current use
of lock manager based latches vs. something closer than a test/set
of bit on page.  We do get a benefit in that latch/lock deadlocks are
reported correctly by the derby lock manager, which is not possible
once you introduce a different locking mechanism.

Do note that I believe in a different thread it was argued that adding
this new lock was ok as the performance did not matter that much compared to the I/O cost of the read.

Øystein Grøvlen (JIRA) wrote:
[ http://issues.apache.org/jira/browse/DERBY-733?page=comments#action_12360454 ]
Øystein Grøvlen commented on DERBY-733:
---------------------------------------

It is possible to use the lock manager for a lock that is local to the object? I do not think it is a good idea to enter the lock into the general lock pool. That seems like quite a lot of unnecessary overhead.
I also think that in the long run we should consider replacing the current 
latches with the built-in locks provided by Java.



Starvation in RAFContainer.readPage()
-------------------------------------

        Key: DERBY-733
        URL: http://issues.apache.org/jira/browse/DERBY-733
    Project: Derby
       Type: Improvement
 Components: Performance, Store
   Versions: 10.2.0.0, 10.1.2.1, 10.1.3.0, 10.1.2.2
Environment: Solaris x86 and Linux with Sun JVM 1.5.0. Derby embedded and 
client/server.
   Reporter: Knut Anders Hatlen
   Assignee: Knut Anders Hatlen
Attachments: DERBY-733.diff

When Derby is completely disk bound, threads might be starved in
RAFContainer.readPage(). This is a real problem when multiple clients
are repeatedly accessing one or a small number of large tables. In
cases like this, I have observed very high maximum response times
(several minutes in the worst cases) on simple transactions. The
average response time is not affected by this.
The starvation is caused by a synchronized block in
RAFContainer.readPage():
 synchronized (this) {
     fileData.seek(pageOffset);
     fileData.readFully(pageData, 0, pageSize);
 }
If many threads want to read pages from the same file, there will be a
long queue of threads waiting for this monitor. Since the Java
specification does not guarantee that threads waiting for monitors are
treated fairly, some threads might have to wait for a long time before
they get the monitor. (Usually, a couple of threads get full throughput
while the others have to wait.)



Reply via email to