You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@river.apache.org by Peter Firmstone <ji...@zeus.net.au> on 2013/04/27 06:15:29 UTC

Unexpected huge scalability improvement in Outrigger

I'm in the process of making some performance comparisons between 2.2.0 
and qa_refactoring code:

This is only preliminary; I'm still investigating, one stress test 
(com/sun/jini/test/impl/outrigger/matching/StressTestWithShutdown.td) 
generates random javaspace reads and writes as fast as possible.

Firstly this test comparison is made on an Ultra80 with 4x450MHz CPU's & 
4GB ram.

The test runs for a period of just under 5 minutes on River 2.2.0 and 
just under 16 minutes on qa_refactoring (River 2.2.3 pre-alpha), both 
tests pass.

With River 2.2.0 the test manages to consume 100% of all 4 cpu's for 30 
seconds, but spends most of the test around 50% idle.

The new code for comparison: all 4 cpu's 0% are idle for a similar 
period, then average around 50% idle or less for the remaining duration, 
in addition, the computer remains usable during that time in both 
tests.  During the test, MarshalledInstance.readObject is invoked 3,349 
times and BasicInvocationDispatcher.unmarshalArguments is invoked 4881 
times (representing remote method calls).

The initial 0% idle period represents jvisualvm's profiler method 
instrumentation.

In comparison River 2.2.0's code only calls 
MarshalledInstance.readObject 652 times, and 
BasicInvocationDispatcher.unmarshalArguments 154 times.

On River 2.2.0 one call that dominates cpu usage at 52% (hotspot) is 
com.sun.jeri.internal.runtime.Target$2.run(), the same call is only 2.3% 
in qa_refactoring.

The Javaspace calls / tasks executed are totally random, so are not 
directly comparable, however the number of calls made depends on how 
responsive the Jini infrastructure is.

With so much more activity it takes Outrigger 3 times longer to deal 
with all the requests in qa_refactoring.  There are two other JVM 
instances open and Outrigger is a service provided from another.

To make matters even more interesting, security is not enabled in the 
River 2.2.0 test.

You might also notice that 
net.jini.jeri.BasicInvocationDispatcher.checkAccess also has a factor of 
10 improvement in performance.

Anyone who wants a copy of the profiler results, just ask.

Or checkout the code and try it for yourself.  If someone's got the time 
& the hardware, I'd love to see how it goes on recent hardware with 8 or 
more cores.

Cheers,

Peter.


River 2.2.0

Hot Spots - Method 	Self time [%] 	Self time 	Invocations
com.sun.jini.jeri.internal.runtime.Target$2.run() 	51.15% 	101813.132 
ms 	202
net.jini.io.MarshalledInstance.readObject(java.io.ObjectInputStream) 
15.87% 	31593.839 ms 	652
com.sun.jini.thread.ThreadPool$Worker.run() 	9.52% 	18956.546 ms 	3
com.sun.jini.jeri.internal.mux.MuxServer$1.run() 	8.53% 	16987.654 ms 	201
net.jini.jeri.BasicInvocationDispatcher.unmarshalArguments(java.rmi.Remote, 
java.lang.reflect.Method, java.io.ObjectInputStream, 
java.util.Collection) 	7.55% 	15029.022 ms 	154
net.jini.jeri.BasicInvocationDispatcher.dispatch(java.rmi.Remote, 
net.jini.jeri.InboundRequest, java.util.Collection) 	5.57% 	11088.875 
ms 	154
net.jini.jeri.BasicInvocationDispatcher.invoke(java.rmi.Remote, 
java.lang.reflect.Method, Object[], java.util.Collection) 	1.02% 
2034.364 ms 	176
net.jini.jeri.BasicInvocationDispatcher.marshalReturn(java.rmi.Remote, 
java.lang.reflect.Method, Object, java.io.ObjectOutputStream, 
java.util.Collection) 	0.33% 	662.177 ms 	177
net.jini.jeri.BasicInvocationDispatcher.createMarshalInputStream(Object, 
net.jini.jeri.InboundRequest, boolean, java.util.Collection) 	0.14% 
277.418 ms 	154
net.jini.io.MarshalOutputStream.<init>(java.io.OutputStream, 
java.util.Collection) 	0.09% 	173.264 ms 	177
net.jini.core.constraint.ArraySet$Iter.hasNext() 	0.08% 	167.406 ms 	462
net.jini.io.MarshalInputStream.<init>(java.io.InputStream, ClassLoader, 
boolean, ClassLoader, java.util.Collection) 	0.02% 	48.366 ms 	154
net.jini.jeri.BasicInvocationDispatcher.unmarshalMethod(java.rmi.Remote, 
java.io.ObjectInputStream, java.util.Collection) 	0.02% 	30.719 ms 	154
net.jini.core.constraint.ArraySet.iterator() 	0.02% 	30.675 ms 	462
net.jini.jeri.tcp.Constraints$Distilled.<init>(net.jini.core.constraint.InvocationConstraints, 
boolean) 	0.01% 	26.085 ms 	153
net.jini.jeri.BasicInvocationDispatcher.createMarshalOutputStream(Object, 
java.lang.reflect.Method, net.jini.jeri.InboundRequest, 
java.util.Collection) 	0.01% 	14.517 ms 	177
net.jini.core.constraint.InvocationConstraints.requirements() 	0.01% 
13.841 ms 	308
net.jini.jeri.connection.ServerConnectionManager$Inbound.getResponseOutputStream() 
	0.01% 	13.24 ms 	507
net.jini.jeri.connection.ServerConnectionManager$Inbound.getRequestInputStream() 
	0.01% 	11.515 ms 	461
net.jini.jeri.tcp.Constraints.check(net.jini.core.constraint.InvocationConstraints, 
boolean) 	0.01% 	10.828 ms 	153
net.jini.core.constraint.ArraySet$Iter.<init>(net.jini.core.constraint.ArraySet) 
	0.01% 	10.706 ms 	459
net.jini.core.constraint.ArraySet.<init>(Object[]) 	0.01% 	10.703 ms 	460
net.jini.jeri.tcp.TcpServerEndpoint$LH$ServerConnectionImpl.checkConstraints(net.jini.jeri.connection.InboundRequestHandle, 
net.jini.core.constraint.InvocationConstraints) 	0.00% 	7.452 ms 	154
net.jini.jeri.connection.ServerConnectionManager$Inbound.checkConstraints(net.jini.core.constraint.InvocationConstraints) 
	0.00% 	7.047 ms 	154
net.jini.jeri.tcp.Constraints.distill(net.jini.core.constraint.InvocationConstraints, 
boolean) 	0.00% 	7.025 ms 	153
net.jini.core.constraint.InvocationConstraints.preferences() 	0.00% 
6.89 ms 	154
net.jini.jeri.tcp.Constraints$Distilled.getUnfulfilledConstraints() 
0.00% 	3.785 ms 	154
net.jini.jeri.BasicInvocationDispatcher.checkAccess(java.rmi.Remote, 
java.lang.reflect.Method, 
net.jini.core.constraint.InvocationConstraints, java.util.Collection) 
0.00% 	3.424 ms 	154
net.jini.io.MarshalInputStream.useCodebaseAnnotations() 	0.00% 	3.328 
ms 	154
net.jini.id.Uuid.writeReplace() 	0.00% 	0.22 ms 	59



River 2.3.0 pre alpha (qa_refactoring)

Hot Spots - Method 	Self time [%] 	Self time 	Invocations

com.sun.jini.thread.ThreadPool$Worker.run()

	26.18% 	1163449.494 ms 	6

com.sun.jini.jeri.internal.mux.StreamConnectionIO$Writer.run()

	23.04% 	1023961.141 ms 	5

net.jini.io.MarshalledInstance.readObject(java.io.ObjectInputStream)

	11.49% 	510737.402 ms 	3349

net.jini.jeri.BasicInvocationDispatcher.unmarshalArguments(java.rmi.Remote, java.lang.reflect.Method, java.io.ObjectInputStream, java.util.Collection)

	9.56% 	424753.652 ms 	4881

com.sun.jini.jeri.internal.mux.MuxServer$1.run()

	5.93% 	263538.933 ms 	4902

com.sun.jini.jeri.internal.mux.StreamConnectionIO$Reader.run()

	3.44% 	152769.871 ms 	2

net.jini.jeri.BasicInvocationDispatcher.dispatch(java.rmi.Remote, net.jini.jeri.InboundRequest, java.util.Collection)

	3.31% 	146959.497 ms 	4881

com.sun.jini.jeri.internal.runtime.Target$2.run()

	2.35% 	104347.742 ms 	4901

net.jini.jeri.BasicInvocationDispatcher.invoke(java.rmi.Remote, java.lang.reflect.Method, Object[], java.util.Collection)

	1.91% 	84857.449 ms 	4892

org.apache.river.api.net.UriParser.parseURI(String, boolean)

	1.79% 	79736.929 ms 	328811

net.jini.jeri.BasicInvocationDispatcher.marshalReturn(java.rmi.Remote, java.lang.reflect.Method, Object, java.io.ObjectOutputStream, java.util.Collection)

	1.70% 	75376.782 ms 	1053

org.apache.river.api.security.URIGrant.implies(java.security.CodeSource, java.security.Principal[])

	0.80% 	35421.372 ms 	330386

au.net.zeus.collection.ReferenceMap.get(Object)

	0.74% 	32973.028 ms 	229307

org.apache.river.api.net.UriParser.validateSegment(String, String, int, String)

	0.61% 	27295.063 ms 	2362865

org.apache.river.api.security.CertificateGrant.implies(java.security.ProtectionDomain)

	0.52% 	23215.116 ms 	330770

org.apache.river.api.net.URIEncoderDecoder.quoteIllegal(String, String)

	0.47% 	20748.571 ms 	328853

org.apache.river.api.net.UriParser.normalize(String)

	0.44% 	19669.965 ms 	328810

net.jini.io.MarshalOutputStream.<init>(java.io.OutputStream, java.util.Collection)

	0.42% 	18868.243 ms 	4892

net.jini.jeri.BasicInvocationDispatcher.marshalThrow(java.rmi.Remote, java.lang.reflect.Method, Throwable, java.io.ObjectOutputStream, java.util.Collection)

	0.38% 	17083.125 ms 	3839

org.apache.river.api.net.Uri.constructor1(String)

	0.38% 	16826.311 ms 	328811

java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run()

	0.35% 	15441.505 ms 	3055970

org.apache.river.api.net.URIEncoderDecoder.decodeUnreserved(String)

	0.32% 	14260.82 ms 	328811

org.apache.river.api.net.Uri.fixWindowsURI(String)

	0.30% 	13528.753 ms 	328881

net.jini.jeri.BasicInvocationDispatcher.createMarshalInputStream(Object, net.jini.jeri.InboundRequest, boolean, java.util.Collection)

	0.30% 	13406.273 ms 	4881

au.net.zeus.collection.AbstractReferrerDecorator.get()

	0.29% 	13010.299 ms 	469326

au.net.zeus.collection.ReferenceProcessor.referenced(Object, boolean, boolean)

	0.28% 	12435.958 ms 	263096

org.apache.river.api.net.Uri.urlToUri(java.net.URL)

	0.28% 	12222.749 ms 	329375

au.net.zeus.collection.ReferenceFactory.singleUseForLookup(Object, au.net.zeus.collection.Ref)

	0.27% 	12024.533 ms 	262992

org.apache.river.api.net.URIEncoderDecoder.validate(String, String)

	0.22% 	9954.947 ms 	2362438

org.apache.river.api.net.Uri.implies(org.apache.river.api.net.Uri)

	0.20% 	8950.05 ms 	588758

org.apache.river.api.net.UriParser.setSchemeSpecificPart(String, String, String)

	0.17% 	7684.196 ms 	328810

org.apache.river.api.net.Uri.getHashString()

	0.14% 	6436.446 ms 	328811

com.sun.jini.qa.harness.MergedPolicyProvider.getPermissionGrants(java.security.ProtectionDomain)

	0.09% 	4176.725 ms 	66207

au.net.zeus.collection.ReferenceProcessor$CleanerTask.run()

	0.09% 	4094.826 ms 	3034999

org.apache.river.api.security.PrincipalGrant.implies(java.security.Principal[])

	0.09% 	3812.522 ms 	329365

org.apache.river.api.security.ConcurrentPolicyFile.getPermissionGrants(java.security.ProtectionDomain)

	0.08% 	3663.7 ms 	66162

org.apache.river.api.net.Uri.quoteComponent(String, String)

	0.07% 	3314.403 ms 	328851

net.jini.io.MarshalInputStream.<init>(java.io.InputStream, ClassLoader, boolean, ClassLoader, java.util.Collection)

	0.07% 	3276.258 ms 	4881

org.apache.river.api.net.Uri.<init>(String, String, String, String, String, String, int, String, String, String, boolean, boolean, boolean, int, boolean)

	0.07% 	3159.704 ms 	328811

com.sun.jini.reggie.RegistrarImpl$DecodeRequestTask.run()

	0.07% 	3104.961 ms 	2

au.net.zeus.collection.RefReferenceQueue.poll()

	0.07% 	2916.806 ms 	3034095

org.apache.river.api.net.Uri.parseAndCreate(String)

	0.05% 	2305.746 ms 	328881

org.apache.river.api.net.UriParser.validateScheme(String, String, int)

	0.05% 	2286.858 ms 	328810

org.apache.river.api.net.Uri.<init>(org.apache.river.api.net.UriParser)

	0.05% 	2105.161 ms 	328811

org.apache.river.api.net.Uri.equals(Object)

	0.04% 	1943.142 ms 	142464

org.apache.river.api.io.DistributedObjectOutputStream.<init>(java.io.OutputStream)

	0.04% 	1802.426 ms 	4892

com.sun.jini.reggie.RegistrarImpl$AddressTask.run()

	0.04% 	1711.409 ms 	2

net.jini.security.policy.DynamicPolicyProvider.getPermissionGrants(java.security.ProtectionDomain)

	0.04% 	1685.747 ms 	65796

org.apache.river.api.security.PrincipalGrant.getPrincipals(java.security.ProtectionDomain)

	0.04% 	1635.426 ms 	330386

au.net.zeus.collection.TempIdentityReferrer.equals(Object)

	0.03% 	1483.964 ms 	182697

org.apache.river.api.net.UriParser.<init>()

	0.03% 	1447.006 ms 	328811

org.apache.river.api.net.Uri.<init>(String)

	0.03% 	1446.377 ms 	328851

org.apache.river.api.net.Uri.convertHexToUpperCase(String)

	0.03% 	1437.298 ms 	328746

au.net.zeus.collection.ReferenceProcessor$FinalizerTask.run()

	0.03% 	1383.824 ms 	3

org.apache.river.api.net.URIEncoderDecoder.validateSimple(String, String)

	0.03% 	1345.947 ms 	328809

au.net.zeus.collection.ReferenceMap.wrapKey(Object, boolean, boolean)

	0.03% 	1335.613 ms 	229358

org.apache.river.api.net.UriParser.parseAuthority(boolean)

	0.03% 	1248.211 ms 	328810

au.net.zeus.collection.TempEqualReferrer.hashCode()

	0.02% 	1097.283 ms 	57130

net.jini.jeri.BasicInvocationDispatcher.unmarshalMethod(java.rmi.Remote, java.io.ObjectInputStream, java.util.Collection)

	0.02% 	703.319 ms 	4881

au.net.zeus.collection.TempIdentityReferrer.<init>(Object)

	0.01% 	609.781 ms 	262992

au.net.zeus.collection.TempEqualReferrer.equals(Object)

	0.01% 	607.318 ms 	57080

org.apache.river.api.io.DistributedObjectInputStream.<init>(java.io.InputStream)

	0.01% 	574.919 ms 	4881

au.net.zeus.collection.ReferenceProcessor.referenced(Object, boolean, boolean)

	0.01% 	515.753 ms 	263096

net.jini.loader.pref.PreferredClassProvider$LoaderKey.equals(Object)

	0.01% 	483.595 ms 	10798

au.net.zeus.collection.TimedReferrer.get()

	0.01% 	442.21 ms 	46500

au.net.zeus.collection.TempEqualReferrer.<init>(Object)

	0.01% 	369.973 ms 	57094

au.net.zeus.collection.TempIdentityReferrer.hashCode()

	0.01% 	310.866 ms 	205979

au.net.zeus.collection.TempComparableReferrer.<init>(Object)

	0.01% 	298.275 ms 	34466

net.jini.jeri.BasicObjectEndpoint.writeObject(java.io.ObjectOutputStream)

	0.00% 	210.359 ms 	3

net.jini.jeri.tcp.Constraints$Distilled.<init>(net.jini.core.constraint.InvocationConstraints, boolean)

	0.00% 	130.724 ms 	4881

net.jini.security.GrantPermission$GrantPermissionCollection.elements()

	0.00% 	118.332 ms 	20655

net.jini.io.MarshalOutputStream$1.<init>(net.jini.io.MarshalOutputStream)

	0.00% 	110.301 ms 	4892

au.net.zeus.collection.ReferrerDecorator.<init>(au.net.zeus.collection.Referrer)

	0.00% 	102.755 ms 	96

net.jini.id.Uuid.readObject(java.io.ObjectInputStream)

	0.00% 	58.876 ms 	3843

au.net.zeus.collection.ReferenceProcessor$EnqueGarbageTask.run()

	0.00% 	50.966 ms 	971

net.jini.core.constraint.ArraySet.<init>(Object[])

	0.00% 	34.889 ms 	14661

net.jini.io.MarshalledInstance.equals(Object)

	0.00% 	32.365 ms 	2510

net.jini.id.Uuid.hashCode()

	0.00% 	30.357 ms 	17128

net.jini.id.Uuid.equals(Object)

	0.00% 	26.507 ms 	10113

net.jini.jeri.BasicInvocationDispatcher.createMarshalOutputStream(Object, java.lang.reflect.Method, net.jini.jeri.InboundRequest, java.util.Collection)

	0.00% 	25.599 ms 	4892

com.sun.jini.thread.ThreadPool$Task.run()

	0.00% 	25.175 ms 	4913

net.jini.jeri.tcp.Constraints.check(net.jini.core.constraint.InvocationConstraints, boolean)

	0.00% 	24.637 ms 	4881

net.jini.id.Uuid.isValid()

	0.00% 	20.674 ms 	7686

net.jini.jeri.connection.ServerConnectionManager$Inbound.getResponseOutputStream()

	0.00% 	20.445 ms 	14664

net.jini.core.constraint.InvocationConstraints.preferences()

	0.00% 	20.016 ms 	4889

net.jini.core.constraint.ArraySet$Iter.hasNext()

	0.00% 	17.301 ms 	14728

net.jini.jeri.connection.ServerConnectionManager$Inbound.getRequestInputStream()

	0.00% 	17.291 ms 	14643

net.jini.core.constraint.ArraySet.iterator()

	0.00% 	16.009 ms 	14728

net.jini.core.constraint.InvocationConstraints.requirements()

	0.00% 	12.379 ms 	9772

net.jini.jeri.connection.ServerConnectionManager$Inbound.checkConstraints(net.jini.core.constraint.InvocationConstraints)

	0.00% 	11.451 ms 	4881

net.jini.jeri.tcp.Constraints.distill(net.jini.core.constraint.InvocationConstraints, boolean)

	0.00% 	11.441 ms 	4881

net.jini.jeri.tcp.TcpServerEndpoint$LH$ServerConnectionImpl.checkConstraints(net.jini.jeri.connection.InboundRequestHandle, net.jini.core.constraint.InvocationConstraints)

	0.00% 	10.047 ms 	4881

au.net.zeus.collection.TimedReferrerDecorator.updateClock(long)

	0.00% 	9.063 ms 	1583

net.jini.core.constraint.ArraySet$Iter.<init>(net.jini.core.constraint.ArraySet)

	0.00% 	7.971 ms 	14706

net.jini.jeri.tcp.Constraints$Distilled.getUnfulfilledConstraints()

	0.00% 	6.438 ms 	4881

au.net.zeus.collection.TimedReferrer.updateClock(long)

	0.00% 	6.159 ms 	1583

net.jini.jeri.BasicInvocationDispatcher.checkAccess(java.rmi.Remote, java.lang.reflect.Method, net.jini.core.constraint.InvocationConstraints, java.util.Collection)

	0.00% 	4.886 ms 	4881

net.jini.io.MarshalInputStream.useCodebaseAnnotations()

	0.00% 	4.091 ms 	4881

net.jini.io.MarshalInputStream$1.<init>(net.jini.io.MarshalInputStream)

	0.00% 	4.03 ms 	4881

net.jini.core.constraint.InvocationConstraints.reduce()

	0.00% 	3.833 ms 	3

au.net.zeus.collection.TimedReferrer.enqueue()

	0.00% 	3.223 ms 	110

net.jini.id.Uuid.readResolve()

	0.00% 	3.172 ms 	3843

org.apache.river.api.net.UriParser.isValidDomainName(String)

	0.00% 	2.722 ms 	88

au.net.zeus.collection.TimedReferrerDecorator.<init>(au.net.zeus.collection.Referrer)

	0.00% 	1.545 ms 	48

au.net.zeus.collection.ReferenceFactory.create(Object, au.net.zeus.collection.RefQueue, au.net.zeus.collection.Ref)

	0.00% 	1.404 ms 	102

au.net.zeus.collection.TimedReferrer.hashCode()

	0.00% 	1.342 ms 	157

au.net.zeus.collection.TimedReferrer.equals(Object)

	0.00% 	1.326 ms 	109

net.jini.core.constraint.InvocationConstraints.<init>(java.util.Collection, java.util.Collection)

	0.00% 	1.13 ms 	3

net.jini.id.Uuid.writeReplace()

	0.00% 	0.948 ms 	676

org.apache.river.api.net.UriParser.isValidHost(boolean, String)

	0.00% 	0.893 ms 	94

au.net.zeus.collection.StrongReference.<init>(Object)

	0.00% 	0.741 ms 	48

au.net.zeus.collection.WeakIdentityReference.equals(Object)

	0.00% 	0.584 ms 	69

au.net.zeus.collection.TimedReferrer.<init>(Object, au.net.zeus.collection.TimedRefQueue)

	0.00% 	0.535 ms 	48

au.net.zeus.collection.AbstractReferrerDecorator.hashCode()

	0.00% 	0.31 ms 	119

net.jini.core.constraint.InvocationConstraints.reduce(int, int)

	0.00% 	0.299 ms 	3

au.net.zeus.collection.StrongReference.<init>(Object, java.lang.ref.ReferenceQueue)

	0.00% 	0.254 ms 	48

net.jini.core.constraint.ArraySet.toArray(Object[])

	0.00% 	0.241 ms 	6

au.net.zeus.collection.TimedComparableReferrerDecorator.<init>(au.net.zeus.collection.Referrer)

	0.00% 	0.237 ms 	45

au.net.zeus.collection.AbstractReferrerDecorator.<init>()

	0.00% 	0.181 ms 	96

au.net.zeus.collection.AbstractReferrerDecorator.equals(Object)

	0.00% 	0.139 ms 	4

net.jini.core.constraint.InvocationConstraints.hashCode()

	0.00% 	0.134 ms 	1

au.net.zeus.collection.StrongReference.hashCode()

	0.00% 	0.097 ms 	1

org.apache.river.api.net.URLClassLoader$UriCodeSource.equals(Object)

	0.00% 	0.076 ms 	10

net.jini.core.constraint.ArraySet.size()

	0.00% 	0.076 ms 	10

net.jini.core.constraint.InvocationConstraints.setRelative(net.jini.core.constraint.InvocationConstraint[], int)

	0.00% 	0.046 ms 	6

net.jini.core.constraint.Constraint.trim(Object[], int)

	0.00% 	0.043 ms 	6

net.jini.core.constraint.Constraint.hash(Object[])

	0.00% 	0.026 ms 	2

net.jini.core.lookup.ServiceID.equals(Object)

	0.00% 	0.012 ms 	4

net.jini.core.lookup.ServiceID.hashCode()

	0.00% 	0.0060 ms 	2