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